Налаштування чеків по 54-ФЗ на 1С-Bitrix
Чек по 54-ФЗ — це не просто відправка даних в касу. Це конкретний формат JSON з обов'язковими полями: ознака розрахунку, ознака способу розрахунку, НДС по кожній позиції, дані агента якщо розрахунок через посередника, дані покупця якщо сума перевищує 100 000 рублів. Помилка в будь-якому полі — чек не фіскалізується, а ФНС це фіксує.
Структура чека в контексті Bitrix
Bitrix формує чек через клас \Bitrix\Sale\Cashbox\Check та його спадкоємців:
-
Sell— чек прибутку (перша оплата) -
SellCorrection— чек коригування прибутку -
Refund— чек повернення прибутку -
RefundCorrection— чек коригування повернення -
AdvancePayment— аванс (передоплата без привязки до номенклатури) -
AdvancePaymentReturn— повернення авансу -
Full— повний розрахунок (для двохстадійної оплати)
Тип чека визначається автоматично за подією. Для двохстадійної оплати потрібні два чека: перший при холдруванні (аванс), другий при підтвердженні (повний розрахунок).
Обов'язкові поля чека за FFD 1.2
З 2023 року обов'язковий формат ФФД 1.2 для нових ККТ. У ньому додані поля:
Ознака предмета розрахунку (PAYMENT_OBJECT) — що продається:
-
COMMODITY— товар -
EXCISE— підакцизний товар -
JOB— робота -
SERVICE— послуга -
PAYMENT— платіж (аванс без номенклатури)
Ознака способу розрахунку (PAYMENT_METHOD):
-
FULL_PAYMENT— повна оплата -
ADVANCE— аванс -
PREPAYMENT— передоплата -
CREDIT— постоплата -
CREDIT_PAYMENT— оплата кредиту
Налаштування у властивостях товару через адміністративний інтерфейс або через b_catalog_product.PAYMENT_OBJECT.
Конфігурація НДС для позицій чека
Неправильний НДС — найпоширеніша причина відмови фіскалізації. Перевірити зв'язку НДС:
-- Всі ставки НДС у системі
SELECT ID, NAME, RATE FROM b_catalog_vat WHERE ACTIVE = 'Y';
-- Товари без привязки до НДС (VAT_ID IS NULL)
SELECT ID, NAME FROM b_catalog_product WHERE VAT_ID IS NULL LIMIT 20;
-- Оновити VAT для всіх товарів одного інфоблока
UPDATE b_catalog_product cp
JOIN b_iblock_element ie ON cp.ID = ie.ID
SET cp.VAT_ID = 3 -- ID ставки НДС 20%
WHERE ie.IBLOCK_ID = 7 AND cp.VAT_ID IS NULL;
Дані покупця в чеку
Якщо сума розрахунку перевищує 100 000 рублів, чек повинен містити дані покупця (ПІБ, ІНН або email/телефон). Для B2B замовлень — ІНН організації.
Налаштування властивостей замовлення для передачі даних в чек:
// Властивість EMAIL покупця має називатися EMAIL або мати прапор IS_EMAIL = Y
// Перевірити:
$res = \Bitrix\Sale\Internals\OrderPropsTable::getList([
'filter' => ['IS_EMAIL' => 'Y'],
'select' => ['ID', 'NAME', 'CODE']
]);
В чеку передається автоматично якщо властивість замовлення позначена прапором «Email покупця» або «Телефон покупця» у налаштуваннях модуля продаж.
Отладка формування чека
Увімкнути логирани касового модуля:
// /bitrix/php_interface/init.php
define('CASHBOX_DEBUG', true);
Лог пишется в bitrix/modules/sale/cashbox/log/. Формат JSON — можна перевірити структуру чека до відправки.
Програмно отримати тіло чека без відправки:
$order = \Bitrix\Sale\Order::load($orderId);
$payment = $order->getPaymentCollection()->getInnerPayment();
$check = \Bitrix\Sale\Cashbox\CheckManager::createCheck(
\Bitrix\Sale\Cashbox\Internals\Check\SellCheck::getType(),
$payment
);
// Отримати дані чека до відправки
$checkData = $check->getDataForCheck();
var_dump($checkData);
Обробка помилок та повторна відправка
Чеки з помилками (статус F в b_sale_cashbox_check) — часта проблема при першопочатковій настройці:
-- Чеки з помилками
SELECT ID, ORDER_ID, PAYMENT_ID, ERROR_TEXT, DATE_CREATE
FROM b_sale_cashbox_check
WHERE STATUS = 'F'
ORDER BY DATE_CREATE DESC;
Повторна відправка через адміністративну панель: «Магазин» → «Онлайн-касси» → «Черга чеків» → обрати чек → «Відправити повторно».
Програмна повторна відправка:
$check = \Bitrix\Sale\Cashbox\CheckManager::getCheckById($checkId);
if ($check) {
$check->setField('STATUS', \Bitrix\Sale\Cashbox\Internals\Check::STATUS_NEW);
$check->save();
}
Чек при поверненні замовлення
При скасуванні оплаченого замовлення Bitrix повинен автоматично сформувати чек повернення. Це відбувається при зніманні статусу оплати:
$payment->setField('PAID', 'N');
$order->save();
// Чек повернення формується через обробник eventi OnSalePaymentEntitySaved
Переконатися що у налаштуваннях касі включена опція «Формувати чек повернення при скасуванні оплати».







