Настройка связки онлайн-магазина и оффлайн-кассы 1С-Битрикс
Клиент оформляет заказ онлайн и выбирает «оплата при получении». Курьер привозит заказ, пробивает чек на мобильной кассе. Фискальный чек выдан, но в Битрикс заказ по-прежнему в статусе «ожидает оплаты». Склад не списал позиции, бухгалтерия не видит факта оплаты. Интеграция онлайн-магазина с оффлайн-кассой — это не только про фискализацию, но и про синхронизацию состояния заказов.
Схема фискализации оплат
По 54-ФЗ каждый факт расчёта должен сопровождаться чеком. В Битрикс модуль salescenter и компонент bitrix:salescenter.cashbox реализуют интеграцию с онлайн-кассами через ОФД. Для оффлайн-кассы схема другая: чек выдаётся кассовым аппаратом (АТОЛ, Эвотор, Штрих-М), а Битрикс должен узнать об этом факте.
Два направления данных:
- Битрикс → касса: данные заказа (позиции, суммы, НДС) для формирования чека
- Касса → Битрикс: подтверждение проведения чека с номером и фискальным признаком
Интеграция через API кассового программного обеспечения
Большинство современных кассовых систем имеют REST API или webhook. Эвотор предоставляет Cloud API, АТОЛ — собственный API для облачной кассы.
Со стороны Битрикс при смене статуса заказа (например, «передан курьеру»):
AddEventHandler('sale', 'OnSaleStatusOrderChange', function(\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$status = $order->getField('STATUS_ID');
if ($status !== 'DE') { // 'DE' = delivered, по вашей схеме статусов
return;
}
// Формируем данные для кассы
$items = [];
foreach ($order->getBasket() as $item) {
$items[] = [
'name' => $item->getField('NAME'),
'quantity' => $item->getQuantity(),
'price' => $item->getPrice(),
'vat' => getVatTag($item->getField('VAT_RATE')),
];
}
// Отправляем в кассовую систему (пример для Эвотор)
$evotorApi->sendReceipt($order->getId(), $items, $order->getPrice());
});
Получение подтверждения от кассы
Касса присылает webhook при успешном проведении чека. Endpoint в Битрикс:
// /local/ajax/cashbox-callback.php
$data = json_decode(file_get_contents('php://input'), true);
if ($data['event'] === 'receipt.created') {
$orderId = $data['external_id'];
$fiscalSign = $data['fiscal_document_number'];
$order = \Bitrix\Sale\Order::load($orderId);
if ($order) {
// Фиксируем оплату
$payment = $order->getPaymentCollection()->current();
$payment->setField('PAID', 'Y');
$payment->setField('EXTERNAL_PAYMENT', $fiscalSign);
// Переводим заказ в нужный статус
$order->setField('STATUS_ID', 'F'); // Finalized
$order->save();
}
}
Синхронизация остатков
Продажа через оффлайн-кассу без привязки к онлайн-заказу — например, кто-то купил в магазине товар, который одновременно ожидается для онлайн-заказа — должна уменьшать остатки в b_catalog_product или b_catalog_store_product.
Два подхода:
- Через 1С: 1С учитывает все продажи (онлайн + оффлайн) и синхронизирует остатки в Битрикс по расписанию
-
Прямая интеграция кассы с Битрикс: касса при каждой продаже вызывает API Битрикс для списания остатков через
CCatalogProduct::Update()или REST APIcatalog.product.update
НДС и тег ставки
Ошибка в ставке НДС при отправке на кассу — это нарушение 54-ФЗ. Ставки НДС в Битрикс хранятся в b_catalog_vat и b_sale_tax. При формировании данных для чека маппинг:
-
VAT_RATE = 20→ тег 1105 (НДС 20%) -
VAT_RATE = 10→ тег 1104 (НДС 10%) -
VAT_RATE = 0→ тег 1106 (НДС 0%) -
VAT_INCLUDE = N(без НДС) → тег 1107
Что настраиваем
- Обработчик
OnSaleStatusOrderChangeдля отправки данных в кассовую систему - Webhook-endpoint для получения подтверждения фискализации
- Маппинг ставок НДС между Битрикс и кассовой системой
- Обновление статуса оплаты и поля с фискальным признаком в
b_sale_payment - Механизм синхронизации остатков при оффлайн-продажах
- Логирование всех обращений к кассовому API для диагностики







