Настройка персональных скидок по группам клиентов 1С-Битрикс
Менеджер создаёт «скидку 15% для VIP-клиентов» в админке Битрикса, назначает её группе пользователей. Заходит тестовый VIP-аккаунт — скидка не применяется. Причина: скидка создана в «Торговом каталоге», но пользователь не входит в нужную группу, потому что менеджер перепутал «группу покупателей» (модуль sale) с «группой пользователей» (модуль main). В Битриксе это разные сущности, и путаница между ними — источник большинства проблем с персональными скидками.
Наша команда за 7 лет работы с Битрикс настроила системы персональных скидок для более чем 30 интернет-магазинов различного профиля: от B2B-порталов до розничных маркетплейсов. Мы досконально знаем архитектуру скидок и типовые ошибки, которые допускают разработчики при интеграции. Правильная настройка увеличивает средний чек на 15–25% и удерживает VIP-клиентов, что напрямую отражается на LTV. Наши решения включают гибкую систему условий, учитывающих статус клиента, историю покупок и корзину, а также интеграцию с CRM для сегментации аудитории.
Архитектура скидок в Битриксе
Модуль 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 после загрузки страницы. Второй подход лучше для производительности при высоком трафике.
Детальное описание процесса
Интеграция требует тщательного планирования и анализа текущих процессов в вашей компании. Мы проводим аудит существующих систем, определяем точки интеграции и возможные конфликты. На каждом этапе предоставляем подробную документацию и проводим тестирование на staging-среде перед запуском в production. Наши решения разработаны с учётом лучших практик индустрии и позволяют значительно снизить операционные затраты.
Наша гарантия качества
Мы берём на себя полную ответственность за качество выполненной работы. В течение 12 месяцев после завершения проекта исправляем любые обнаруженные проблемы абсолютно бесплатно. Техническая поддержка включает консультации, обучение вашей команды и помощь при возникновении вопросов. Каждый проект завершается итоговым отчётом с описанием реализованного функционала, рекомендациями по оптимизации и планом развития системы.
Примеры успешных проектов
За время работы мы реализовали интеграции для компаний разного размера: от небольших интернет-магазинов до крупных оптовых дистрибьюторов. Каждый проект требовал индивидуального подхода, и мы гордимся результатом, который значительно улучшил эффективность работы наших клиентов.
Преимущества нашего подхода
Мы обеспечиваем комплексное решение, а не отдельные исправления. Каждый проект включает документирование, тестирование и обучение команды. Нашим клиентам нравится, что мы не просто выполняем работу, но и объясняем каждый шаг процесса, давая возможность вашей команде в будущем самостоятельно поддерживать систему. Со своей стороны, мы гарантируем помощь в течение года после завершения проекта.
Контакты и следующие шаги
Если ваша компания столкнулась с описанной проблемой, свяжитесь с нами для бесплатной консультации. Проведём анализ вашей системы и предложим оптимальное решение. Стоимость проекта зависит от сложности и объёма работ, но для типовых решений мы всегда предоставляем точную смету на основе предварительного анализа требований.







