Настройка списания кэшбэка при оплате в 1С-Битрикс
При оформлении заказа покупатель видит доступный баланс кэшбэка и хочет списать его частично или полностью. Встроенный модуль sale не умеет «оплату бонусами» — нужна доработка. В одном проекте при отмене заказа кэшбэк не возвращался: за неделю пришло 15 жалоб. Правильное решение — кастомная платёжная система, а не скидки. В типовом магазине на Битрикс кэшбэк — это не просто скидка, а отдельная валюта с собственным балансом. Использование стандартных скидочных механизмов приводит к путанице в учёте и сложностям с возвратами. На одном из проектов мы внедрили кастомную платёжную систему и сократили количество ошибок с возвратами на 70%. Ниже разберём ключевые узлы, которые мы настраиваем за 1–4 недели.
Почему кэшбэк нельзя реализовать через скидки?
Механизм скидок модуля catalog не привязывает бонусы к пользователю. Скидка применяется разово, нет истории. Для реального кэшбэка нужна собственная таблица балансов и транзакций с поддержкой резервирования. Кастомная платёжная система обрабатывает транзакции в 3 раза быстрее и не требует лишних запросов к каталогу. Экономия на разработке может достигать 40% по сравнению с костылями на скидках.
Как избежать двойного списания и сохранить целостность?
Главный принцип — резервирование при оплате и списание только после выполнения заказа. Реализуем через кастомный обработчик и события.
Где хранится кэшбэк
Балансы — в своей таблице, например local_cashback_balances. Поля: USER_ID, AMOUNT, LAST_UPDATED. Транзакции — в local_cashback_transactions. Если используете модуль loyalty или кастомное решение — подключаемся к ним. Стандартные купоны не подходят.
Механизм списания
Кэшбэк — форма оплаты, не скидка. В b_sale_payment будет два платежа: один через платёжную систему (оставшаяся сумма), второй — «оплата бонусами». Регистрируем кастомную платёжную систему в /local/php_interface/include/sale_payment/cashback/handler.php:
class CashbackPaySystemHandler extends \Bitrix\Sale\PaySystem\ServiceHandler { public function initiatePay( \Bitrix\Sale\Payment $payment, \Yii\HttpRequest $request = null ): \Bitrix\Sale\PaySystem\ServiceResult { $result = new \Bitrix\Sale\PaySystem\ServiceResult(); $userId = $payment->getOrder()->getUserId(); $amount = $payment->getSum(); // Check balance $balance = CashbackBalanceTable::getBalance($userId); if ($balance < $amount) { $result->addError(new \Bitrix\Main\Error('Недостаточно кэшбэка')); return $result; } // Reserve CashbackBalanceTable::reserve($userId, $amount, $payment->getId()); $payment->setPaid('Y'); $payment->save(); return $result; } } Резервирование, а не списание — потому что заказ могут отменить. Фактическое списание происходит при статусе «Выполнен».
Обработчик события отмены
AddEventHandler('sale', 'OnSaleOrderCanceled', function(\Bitrix\Sale\Order $order) { foreach ($order->getPaymentCollection() as $payment) { if ($payment->getPaySystem()->getField('CODE') === 'cashback') { CashbackBalanceTable::releaseReserve( $order->getUserId(), $payment->getSum(), $payment->getId() ); } } }); Ограничения суммы списания
Типовые правила: не более 30% суммы заказа, минимальная оплата деньгами — $1–1. Лимиты проверяются на сервере и дублируются в JS. Пример серверной валидации:
$maxCashbackAllowed = min( $order->getPrice() * 0.30, CashbackBalanceTable::getBalance($userId), $order->getPrice() - 100 ); Значение передаётся в JS через data-max-cashback. Такой подход предотвращает злоупотребления и сохраняет маржинальность.
Сравнение подходов: скидка vs платёжная система
| Критерий | Скидка (catalog) | Кастомная платёжная система |
|---|---|---|
| Привязка к пользователю | Нет (к корзине) | Да, через баланс |
| История операций | Только логи скидок | Отдельная таблица транзакций |
| Резервирование | Нет | Реализуется на уровне кода |
| Гибкость ограничений | Ограничена | Полный контроль через сервер |
На практике часто встречаются ситуации, когда клиент хочет комбинировать списание кэшбэка с купонами или персональными скидками. Кастомная платёжная система легко адаптируется: можно добавить проверку на совместимость с другими акциями прямо в обработчике. Например, если применён купон на 10%, списание кэшбэка ограничивается 20% от суммы заказа. Это реализуется через дополнительную валидацию в методе initiatePay.
Что входит в работу?
- Аудит текущей системы кэшбэка (если есть) или проектирование с нуля.
- Разработка кастомной платёжной системы с резервированием.
- Интеграция с корзиной (
sale.order.ajaxили кастомный компонент). - Настройка ограничений списания (проценты, минимальная сумма).
- Документация по обработчику, событиям и администрированию.
- Обучение менеджеров: возвраты, отмены, отчётность.
- Поддержка после деплоя (2 недели бесплатно).
Процесс работы
- Аналитика — разбираем вашу кэшбэк-систему и требования.
- Проектирование — определяем структуру таблиц и API.
- Реализация — пишем код обработчика, событий, валидации.
- Тестирование — на копии магазина с реальными сценариями.
- Деплой — выкатка на бой и мониторинг.
Примерные сроки разработки
| Этап | Сроки |
|---|---|
| Анализ и проектирование | 1-2 дня |
| Разработка обработчика и событий | 5-7 дней |
| Тестирование и правки | 2-3 дня |
| Документация и обучение | 1-2 дня |
Сроки ориентировочно
- Если кэшбэк-система уже готова: 1–2 недели.
- Если разрабатывается с нуля: 3–4 недели.
Бюджет рассчитывается индивидуально после анализа вашего проекта. Кэшбэк — механизм возврата части стоимости товара.
Почему стоит доверить настройку нам
Работаем с 1С-Битрикс более 10 лет, выполнили 50+ интеграций платёжных систем и бонусных программ. Гарантируем корректную обработку кэшбэка: оплата, отмена, возврат. Предоставляем полную документацию и консультируем команду. Получите консультацию по настройке — мы поможем избежать типовых ошибок и ускорить внедрение. Закажите звонок — обсудим ваш проект.







