Настройка персональных скидок по группам клиентов 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка персональных скидок по группам клиентов 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка персональных скидок по группам клиентов 1С-Битрикс

Менеджер создаёт «скидку 15% для VIP-клиентов» в админке Битрикса, назначает её группе пользователей. Заходит тестовый VIP-аккаунт — скидка не применяется. Причина: скидка создана в «Торговом каталоге», но пользователь не входит в нужную группу, потому что менеджер перепутал «группу покупателей» (модуль sale) с «группой пользователей» (модуль main). В Битриксе это разные сущности, и путаница между ними — источник большинства проблем с персональными скидками.

Архитектура скидок в Битриксе

Модуль sale управляет скидками через \Bitrix\Sale\Discount. Скидки могут применяться к:

  • Группам пользователей (b_user_group — таблица main-модуля)
  • Отдельным пользователям (через расширенные условия)
  • Покупателям с определённой историей заказов (накопительные скидки)

Для назначения скидки группе: в административном интерфейсе «Магазин → Правила работы с ценами» — выбрать тип «Скидка на товар» или «Скидка на заказ», в условиях указать «Покупатель состоит в группе». Группы берутся из b_user_group.

Создание группы и привязка пользователей

Группы пользователей создаются в «Настройки → Группы пользователей». Программно:

$group = new \CGroup();
$groupId = $group->Add([
    'NAME'          => 'VIP-клиенты',
    'DESCRIPTION'   => 'Скидка 15% на весь каталог',
    'ACTIVE'        => 'Y',
    'SORT'          => 100,
]);

Добавить пользователя в группу:

$user = new \CUser();
$user->Update($userId, ['GROUP_ID' => array_merge($currentGroups, [$groupId])]);

Или через CUser::SetUserGroup($userId, $groups) — перезаписывает все группы, поэтому обязательно передавать текущие группы вместе с новой.

Автоматическое назначение группы по условиям

Для автоматического перевода покупателя в VIP-группу при достижении порога суммы заказов — обработчик события OnSaleOrderSaved:

AddEventHandler('sale', 'OnSaleOrderSaved', function(\Bitrix\Main\Event $event) {
    $order = $event->getParameter('ENTITY');
    $userId = (int)$order->getUserId();
    if (!$userId) return;

    // Считаем сумму оплаченных заказов
    $total = 0;
    $res = \Bitrix\Sale\Order::getList([
        'filter' => ['USER_ID' => $userId, 'PAYED' => 'Y'],
        'select' => ['PRICE'],
    ]);
    while ($row = $res->fetch()) {
        $total += $row['PRICE'];
    }

    $vipThreshold = 50000; // рублей
    $vipGroupId   = 5;

    $dbUser = \CUser::GetByID($userId)->Fetch();
    $currentGroups = array_map('intval', explode(',', $dbUser['GROUP_IDS'] ?? ''));

    if ($total >= $vipThreshold && !in_array($vipGroupId, $currentGroups)) {
        $currentGroups[] = $vipGroupId;
        (new \CUser())->Update($userId, ['GROUP_ID' => $currentGroups]);
    }
});

Скидки на торговые предложения (SKU)

Если скидка назначена на товар-родитель, она применяется и к торговым предложениям. Но если нужна скидка только на конкретный SKU — условие в правиле цены должно указывать на инфоблок предложений. В настройках правила: «Тип инфоблока» → выбрать инфоблок предложений, раздел или конкретные элементы.

Отображение персональной цены

Стандартный компонент catalog.element отображает цену через $arResult['CATALOG_PRICE_*'], где * — тип цены. Скидки для групп применяются через \CCatalogProduct::GetOptimalPrice(), который учитывает правила цен и группы текущего пользователя. Если страница кешируется — цена в кеше может быть без скидки.

Решение: выносить блок цены в отдельный некешируемый компонент или запрашивать актуальную цену через AJAX после загрузки страницы. Второй подход лучше для производительности при высоком трафике.