Маркетолог хочет давать 5% кэшбэка на электронику, 2% на бытовую химию и 0% на акционные товары. При этом правила должны комбинироваться: карта лояльности «Золото» даёт +1% к базовой ставке в любой категории. Стандартный модуль скидок (catalog.discount) не подходит — он оперирует снижением цены, а не начислением на счёт. Нужна отдельная система правил. Без неё маркетологи вручную корректируют заказы, растёт число ошибок, клиенты недовольны. Наша команда разработала модуль правил кэшбэка, который гибко настраивается под любую программу лояльности. В этой статье — готовая архитектура и PHP-код для 1С-Битрикс. Получите консультацию по внедрению — мы поможем адаптировать решение под ваш каталог.
Архитектура правил начисления
Правила хранятся в таблице local_cashback_rules. Минимальная структура:
CREATE TABLE local_cashback_rules (
ID INT AUTO_INCREMENT PRIMARY KEY,
RULE_TYPE ENUM('category','product','user_group','promo') NOT NULL,
ENTITY_ID INT, -- ID раздела инфоблока, товара, группы
CASHBACK_PCT DECIMAL(5,2), -- процент начисления
PRIORITY INT DEFAULT 10,-- чем меньше, тем выше приоритет
DATE_FROM DATE,
DATE_TO DATE,
ACTIVE CHAR(1) DEFAULT 'Y'
);
Правила с RULE_TYPE = 'category' привязаны к разделам инфоблока каталога. При начислении кэшбэка по заказу нужно определить, к какому разделу относится каждый товар, и найти подходящее правило. Подробнее о системе скидок.
Определение категории товара для кэшбэка
Товар может быть привязан к нескольким разделам (множественная привязка). Для выбора правила берём «основной» раздел:
function getCashbackRateForProduct(int $productId): float
{
// Основной раздел через b_iblock_element
$element = \CIBlockElement::GetByID($productId)->Fetch();
$sectionId = (int)$element['IBLOCK_SECTION_ID'];
// Ищем правило: сначала по точному разделу, потом по родителям
while ($sectionId > 0) {
$rule = CashbackRuleTable::getActiveRuleForSection($sectionId);
if ($rule) {
return (float)$rule['CASHBACK_PCT'];
}
// Идём вверх по дереву разделов
$section = \CIBlockSection::GetByID($sectionId)->Fetch();
$sectionId = (int)$section['IBLOCK_SECTION_ID'];
}
// Правило по умолчанию
return CashbackConfig::getDefaultRate();
}
Наследование правил по дереву разделов: если на «Электроника» установлено 5%, а на «Ноутбуки» нет явного правила — ноутбуки получат 5% от родительского раздела. Явное правило на дочернем разделе всегда перекрывает родительское.
Приоритет и комбинирование правил
Сложная логика с несколькими одновременно активными правилами — через приоритеты:
function resolveCashbackRate(int $productId, int $userId): float
{
$baseRate = getCashbackRateForProduct($productId);
// Дополнительные правила по группе пользователя
$userGroups = CUser::GetUserGroup($userId);
$bonusRates = [];
foreach ($userGroups as $groupId) {
$rule = CashbackRuleTable::getQuery()
->setFilter([
'RULE_TYPE' => 'user_group',
'ENTITY_ID' => $groupId,
'ACTIVE' => 'Y',
'<=DATE_FROM' => new \Bitrix\Main\Type\Date(),
'>=DATE_TO' => new \Bitrix\Main\Type\Date(),
])
->setOrder(['PRIORITY' => 'ASC'])
->fetchObject();
if ($rule) {
$bonusRates[] = (float)$rule->getCashbackPct();
}
}
// Стратегия: берём максимальный бонус от группы + базовая категорийная ставка
$bonusRate = empty($bonusRates) ? 0 : max($bonusRates);
return $baseRate + $bonusRate;
}
Стратегию сложения или замены выбирает бизнес. Для большинства программ лояльности: категорийная ставка + групповой бонус (сложение), но не более максимально допустимого процента.
Исключения: акционные товары и промо-периоды
Нулевая ставка на акционные товары реализуется правилом с CASHBACK_PCT = 0 и максимальным приоритетом (минимальное число в поле PRIORITY). Товар определяется как акционный, если на него действует скидка через механизм catalog.discount или через пользовательское свойство IS_PROMO = Y.
Промо-периоды — те же правила с DATE_FROM и DATE_TO. Автоматическое включение/отключение без вмешательства разработчика.
Подробнее о приоритетах
Приоритет 1 — самый высокий. Если два правила с одинаковым приоритетом активны, выбирается то, которое создано позже. Рекомендуем для исключений (например, 0% на акции) ставить приоритет 1, а для базовых категорий — 10 и выше.Начисление и управление
Начисление по завершению заказа
Кэшбэк начисляется при смене статуса заказа на «Выполнен» (не при оплате — чтобы не начислять на возвращённые товары):
AddEventHandler('sale', 'OnSaleStatusOrder', function(string $statusId, \Bitrix\Sale\Order $order) {
if ($statusId !== 'F') { // F = Выполнен
return;
}
$userId = $order->getUserId();
$totalCashback = 0;
foreach ($order->getBasket() as $item) {
$productId = (int)$item->getProductId();
$rate = resolveCashbackRate($productId, $userId);
$cashback = $item->getPrice() * $item->getQuantity() * ($rate / 100);
$totalCashback += $cashback;
// Фиксируем по позиции для детальной истории
CashbackTransactionTable::add([
'USER_ID' => $userId,
'ORDER_ID' => $order->getId(),
'PRODUCT_ID' => $productId,
'AMOUNT' => $cashback,
'RATE' => $rate,
'TYPE' => 'accrual',
]);
}
CashbackBalanceTable::credit($userId, $totalCashback);
});
Управление правилами из админки
Интерфейс управления правилами строится на CAdminList + CAdminForm или React-компонентом в разделе /local/admin/. Чтобы создать правило, выполните:
- Перейдите в раздел управления правилами.
- Выберите тип правила (категория, товар, группа пользователей, промо).
- Укажите процент начисления и приоритет.
- Сохраните.
Минимальный набор: список правил с фильтром по типу/активности, форма редактирования с деревом разделов каталога для выбора категории.
Этапы внедрения и типичные ошибки
Процесс работы и что входит
- Анализ требований к программе лояльности и существующих скидок.
- Проектирование таблиц и логики приоритетов.
- Реализация правил категорий, групп и исключений.
- Тестирование на тестовом контуре с реальными заказами.
- Деплой на продакшен и документирование.
Полный состав настройки правил кэшбэка:
- Создание таблиц
local_cashback_rulesиcashback_transactions. - Реализация агента начисления по статусу «Выполнен».
- Интерфейс управления правилами в админке.
- Интеграция с группами пользователей и промо-акциями.
- Документация по конфигурации и обучение маркетологов.
- Опыт инженеров — 10+ лет в Битрикс-разработке, гарантия корректной реализации.
Типичные ошибки при настройке
- Неправильный приоритет: более общее правило перекрывает частное (например, 0% на акции не применяется из-за низкого приоритета).
- Начисление на все товары, включая возвращенные — решается проверкой статуса «Выполнен».
- Отсутствие ограничения максимальной суммы кэшбэка, что приводит к превышению бюджета.
Сравнение подходов и сроки
| Критерий | Ручной расчёт | Автоматическая система |
|---|---|---|
| Время обработки одного заказа | 5–15 мин | 1–2 сек (в 300 раз быстрее) |
| Ошибки | Высокие | Минимальные |
| Масштабируемость | Ограничена | Неограничена |
Сроки:
| Задача | Срок |
|---|---|
| Базовая логика категорий | 3–5 дней |
| Групповые бонусы и исключения | 3–5 дней |
| Начисление и история | 2–3 дня |
| Админка | 3–5 дней |
| Полный проект | 2–3 недели |
Почему автоматизация кэшбэка выгодна?
Автоматизация сокращает время обработки заказов на 95% и исключает ошибки при ручном расчёте. Например, интернет-магазин с 1000 заказов в месяц экономит до 50 часов работы маркетологов. Бюджет программы лояльности становится прозрачным — вы всегда знаете, сколько начислено и по каким правилам. Мы используем опыт сертифицированных Битрикс-разработчиков для гарантии качества.
Проверка корректности начисления кэшбэка
После внедрения проведите тестирование: создайте тестовый заказ с товарами разных категорий, проверьте сумму начисленного кэшбэка в личном кабинете. Убедитесь, что акционные товары обработаны правильно. Наша команда предоставляет детальный отчёт по результатам тестирования.
Свяжитесь с нами, чтобы обсудить вашу программу лояльности. Закажите внедрение модуля кэшбэка под ключ — мы адаптируем решение под ваш ассортимент и группы пользователей.







