Настройка списания кэшбэка при оплате 1С-Битрикс
При оформлении заказа покупатель видит доступный баланс кэшбэка и хочет использовать его частично или полностью. Стандартный модуль sale не имеет встроенного механизма «оплата бонусами» — нужно расширять платёжную систему или корзину. Если сделать это неправильно, кэшбэк списывается дважды, или заказ уходит в статус оплачен с неверной суммой.
Где хранится кэшбэк
Если кэшбэк-система реализована на базе модуля loyalty или кастомного решения, балансы хранятся в собственной таблице, например local_cashback_balances. Ключевые поля: USER_ID, AMOUNT, LAST_UPDATED. Операции фиксируются в local_cashback_transactions — это история начислений и списаний.
Если используется стандартный «Купон» или «Скидка», кэшбэк выражается через механизм скидок модуля catalog. Но это неверная модель для реального кэшбэка — скидки не привязаны к конкретному пользователю через баланс.
Механизм списания
Корректная модель: кэшбэк — это форма оплаты, а не скидка. В таблице 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();
// Проверяем баланс
$balance = CashbackBalanceTable::getBalance($userId);
if ($balance < $amount) {
$result->addError(new \Bitrix\Main\Error('Недостаточно кэшбэка'));
return $result;
}
// Резервируем
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% суммы заказа, минимальная оплата реальными деньгами — 100 рублей. Ограничения внедряются в компоненте чекаута (sale.order.ajax или кастомный) на уровне валидации формы (JS) и серверной проверки.
$maxCashbackAllowed = min(
$order->getPrice() * 0.30, // 30% суммы заказа
CashbackBalanceTable::getBalance($userId), // фактический баланс
$order->getPrice() - 100 // минимальная оплата деньгами
);
Значение передаётся в JS через data-max-cashback на поле ввода.
Состав работ
- Разработка или адаптация таблиц баланса и транзакций кэшбэка
- Кастомный обработчик платёжной системы
cashback - Логика резервирования/списания/возврата при отмене
- Ограничения суммы списания в чекауте
- Отображение баланса и поля ввода в форме заказа
Сроки: 1–2 недели при наличии готовой кэшбэк-системы. 3–4 недели если кэшбэк-система разрабатывается с нуля.







