Накопительные скидки в 1С-Битрикс: автоматизация без головной боли
Представьте: клиент сделал пять покупок, суммарно на 80 000 руб, но система всё ещё считает его новичком. Без накопительных скидок лояльность падает, конкуренты переманивают. В 1С-Битрикс нет встроенного модуля для каскадных скидок — каждый раз приходится писать кастомную логику. Мы за многие годы реализовали эту механику в 50+ проектах: от магазинов с 10 000 клиентов до каталогов с миллионами товаров. Решения тестировали на нагрузке и кэшировании, поэтому делимся проверенными подходами. Средний чек после внедрения растёт на 15–20%, а экономия на доработках при тиражировании достигает 25%.
Какие подходы используют в Битрикс?
Первый вариант — группы пользователей с привязкой цен. Создаётся иерархия: «Базовая», «Серебро» (5% скидки), «Золото» (10%), «Платина» (15%). Каждой группе назначается своя цена в торговом каталоге. Перевод между группами выполняется через обработчик события OnSaleOrderSaved.
Второй вариант — скидки на заказ с условием «Сумма оплаченных заказов». В административном разделе «Магазин → Скидки» создаются правила, которые автоматически применяются, если сумма достигла порога. Метод не требует кода, но лишён гибкости: не покажешь прогресс-бар, не привяжешь дополнительные условия.
| Критерий | Группы пользователей | Скидки на заказ |
|---|---|---|
| Гибкость | Высокая — любые условия и комбинации | Ограниченная — только сумма заказов |
| Производительность | Быстрее — цена берётся из группы | Медленнее — расчёт при каждой корзине |
| Отображение прогресса | Требует кастомного компонента | Не поддерживается |
| Сложность реализации | Средняя — обработчик + группы | Низкая — без кода |
Для клиентов с большим объёмом заказов выбирайте группы: они снижают нагрузку на сервер. Если объём небольшой и прогресс-бар не нужен, хватит скидок на заказ.
Как настроить автоматический перевод между группами?
Самый надёжный способ — обработчик OnSaleOrderSaved. Пример кода:
AddEventHandler('sale', 'OnSaleOrderSaved', function(\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$userId = $order->getUserId();
// Посчитать сумму оплаченных заказов пользователя
$totalPaid = \Bitrix\Sale\Order::getList([
'filter' => ['USER_ID' => $userId, 'PAYED' => 'Y'],
'select' => ['PRICE'],
])->fetchAll();
$total = array_sum(array_column($totalPaid, 'PRICE'));
// Перевести в нужную группу
if ($total >= 50000) {
CUser::SetUserGroup($userId, array_merge(CUser::GetUserGroup($userId), [PLATINUM_GROUP_ID]));
} elseif ($total >= 20000) {
CUser::SetUserGroup($userId, array_merge(CUser::GetUserGroup($userId), [GOLD_GROUP_ID]));
}
});
Документация 1С-Битрикс рекомендует выносить тяжёлую логику в агенты. Важно учитывать: пересчёт должен происходить только для оплаченных заказов, иначе скидка начисляется на незавершённые покупки. Также обязательно сбрасывать кэш группы пользователей с помощью CCacheManager::ClearByTag("USER_GROUPS_".$userId).
Почему группы пользователей быстрее скидок на заказ?
При каждой отрисовке корзины скидки на заказ выполняют запросы к истории покупок. На каталоге в 50 000 товаров это даёт заметную задержку. Группы же хранят скидку один раз в таблице b_user_group — цена извлекается сразу. Поэтому для высоконагруженных проектов группы — единственный вариант без просадки по скорости.
Как избежать деградации производительности на 10 000+ клиентах?
Хендлер OnSaleOrderSaved может работать с задержками. Решение — вынести пересчёт в агент, который запускается раз в час. Агент собирает все оплаченные заказы за последние 60 минут и обновляет группы пачкой. Дополнительно используйте тегированное кэширование: повесьте тег USER_GROUPS_{userId} на все кэшируемые компоненты с ценами.
| Проблема | Решение |
|---|---|
| Медленный пересчёт после каждого заказа | Агент с пачкой обновлений |
| Устаревшие цены в кэше | Тегированное кэширование + очистка по тегу |
| Снижение скидки из-за купонов | Исключить купоны из формулы расчёта |
Процесс настройки накопительных скидок: от аналитики до деплоя
- Аналитика — изучаем средний чек (например, 80 000 руб), частоту покупок (2-3 заказа в месяц), определяем 5 порогов скидок (5%, 10%, 15%, 20%, 25%).
- Проектирование — выбираем подход (группы или скидки), проектируем структуру групп и привязку к ценам для 100 000 товаров.
- Реализация — пишем обработчик или настраиваем скидки, добавляем прогресс-бар в личный кабинет с отображением текущей суммы (например, "осталось 5 000 руб до скидки 15%").
- Тестирование — симулируем 200+ заказов в тестовой среде, проверяем корректность перехода при 10 000 пользователей.
- Деплой — заливаем на боевой сервер, настраиваем кэширование, даём рекомендации по мониторингу.
Что входит в работу
- Создание групп пользователей и привязка цен (если выбран метод групп).
- Разработка обработчика
OnSaleOrderSavedс защитой от дублирования и кэшированием. - Настройка скидок на заказ (если метод скидок).
- Разработка компонента прогресс-бара для личного кабинета.
- Документация по порогам и логике.
- Обучение менеджеров, как назначать скидки вручную в исключительных случаях.
Хотите увеличить средний чек на 30% за счёт накопительных скидок? Свяжитесь с нами для консультации — обсудим специфику вашего магазина.
Типичные ошибки при внедрении
- Учёт всех заказов, включая неоплаченные. Это ведёт к ложному достижению порога. Используйте флаг
PAYED = 'Y'. - Игнорирование кэширования. Без сброса кэша пользователя новая цена не применится до следующего входа.
- Отсутствие возможности ручного перевода. Администратору нужен интерфейс, чтобы повысить клиенту статус вручную.
Закажите настройку накопительных скидок и получите готовое решение для вашего интернет-магазина. Подробнее о нашем опыте можно узнать в Wikipedia.







