Интеграция возвратов с онлайн-кассой 1С-Битрикс
По 54-ФЗ при возврате денег покупателю касса обязана пробить чек с признаком расчёта «Возврат прихода». Если сайт работает с онлайн-кассой через Битрикс — значит, возврат должен автоматически формировать фискальный документ через тот же канал. Без этого возникает нарушение: деньги возвращены, чек не пробит.
Как Битрикс взаимодействует с кассой
Модуль sale.cashbox (bitrix/modules/sale/cashbox/) отвечает за фискализацию. Чеки отправляются через обработчики (handlers), наследующие от \Bitrix\Sale\Cashbox\CashboxPaymaster или \Bitrix\Sale\Cashbox\CashboxAtol. Стандартные обработчики: Атол Онлайн, CloudKassir, OrangeData, ЮKassa и другие.
При оплате заказа Битрикс вызывает \Bitrix\Sale\Cashbox\Manager::sendCheck() с типом чека CHECK_TYPE_SELL (приход). При возврате — CHECK_TYPE_SELL_RETURN (возврат прихода).
Таблицы: b_sale_cashbox_check — история чеков, b_sale_cashbox — настроенные кассы.
Как формируется чек возврата
Чек возврата Битрикс создаёт автоматически при выполнении двух условий:
- Возврат переходит в статус
COMPLETED - К исходному платежу привязана касса и уже есть подтверждённый фискальный чек прихода
Код, который это запускает — \Bitrix\Sale\Cashbox\Manager::addByReturn():
// Внутри обработчика события OnSaleReturnComplete
\Bitrix\Sale\Cashbox\Manager::addByReturn($return);
Если у вас нестандартный сценарий (возврат создаётся внешним скриптом), нужно вызывать этот метод вручную после сохранения возврата.
Что идёт в чек возврата
Позиции чека формируются из b_sale_order_return_item. Каждая позиция содержит:
- Наименование товара (из
b_iblock_element.NAMEчерез JOIN наb_sale_basket.PRODUCT_ID) - Количество
- Цену
- Ставку НДС
- Признак предмета расчёта (товар/услуга/работа) — берётся из настроек позиции заказа
Если в исходном заказе НДС не указан или указан некорректно — в чеке возврата будет ошибка. Это частая проблема при миграции с Битрикс на новую кассовую схему.
Типичные проблемы
Чек возврата не отправляется. Причина: возврат создан не через \Bitrix\Sale\OrderReturn, а напрямую в БД или через неофициальный механизм — событие OnSaleReturnComplete не срабатывает. Решение: всегда используйте ORM-методы.
Ошибка «Сумма возврата превышает сумму прихода». Кассовый оператор отклоняет чек, если сумма возврата больше, чем в исходном чеке прихода. Бывает при частичных возвратах нескольких платежей за один заказ — каждый чек возврата должен быть привязан к конкретному чеку прихода через PARENT_CHECK_ID в b_sale_cashbox_check.
Дублирование чека при повторном запросе. При сбое сети Битрикс может отправить запрос дважды. У Атол Онлайн есть параметр external_id — уникальный идентификатор чека на вашей стороне. Используйте его, чтобы оператор мог определить дубликат.
Частичный возврат нескольких позиций из одного заказа. Чек должен содержать только возвращаемые позиции с правильными количествами. Стандартный Manager::addByReturn() это обеспечивает, если b_sale_order_return_item заполнена корректно.
Тестирование фискализации возвратов
Все кассовые операторы предоставляют тестовое окружение. Атол Онлайн — тестовый URL https://testonline.atol.ru/possystem/v5/. OrangeData — тестовые ключи и сертификаты.
Проверочный список перед запуском в прод:
| Сценарий | Что проверяем |
|---|---|
| Полный возврат заказа | Чек возврата = сумма чека прихода |
| Частичный возврат одной позиции | В чеке только возвращаемый товар |
| Возврат заказа с несколькими платежами | Чек привязан к правильному платежу |
| Возврат после корректировки цены | НДС пересчитан корректно |
| Повторная отправка при таймауте | Нет дублирующего чека у оператора |
Настройка уведомлений об ошибках фискализации
Если чек возврата не прошёл — кассовый оператор вернёт ошибку. Битрикс сохранит её в поле ERROR таблицы b_sale_cashbox_check, но по умолчанию менеджер об этом не узнает. Настройте агент:
// Агент: каждые 30 минут проверяет необработанные ошибки
$checks = \Bitrix\Sale\Cashbox\CheckManager::getList([
'filter' => [
'STATUS' => \Bitrix\Sale\Cashbox\Check::CHECK_STATUS_ERROR,
'>=DATE_CREATE' => new \Bitrix\Main\Type\DateTime('-1 hour'),
],
]);
foreach ($checks as $check) {
if ($check['TYPE'] === \Bitrix\Sale\Cashbox\SellReturnCheck::TYPE) {
NotificationService::alertAdmin(
'Ошибка чека возврата #' . $check['ID'] . ': ' . $check['ERROR']
);
}
}
Состав работ
- Проверка версии модуля
sale.cashboxи совместимости с версией кассового оператора - Настройка обработчика кассы для среды возвратов (тестовый/боевой URL)
- Тестирование всех сценариев возвратов в тестовой среде оператора
- Настройка агента мониторинга ошибок фискализации
- Проверка корректности НДС в позициях заказа и возврата
- Документация по ручному пробитию чека в нештатных ситуациях
Сроки: если касса уже настроена для чеков прихода — настройка возвратов занимает 1–2 недели. Если касса настраивается с нуля — 3–5 недель, включая тестирование во всех сценариях.







