При переходе на онлайн-кассы по требованиям 54-ФЗ разработчики нетиповых и доработанных конфигураций 1С часто сталкиваются с нестандартным поведением фискальных регистраторов. Типичная ситуация: документ отгрузки или реализации частично оплачивается наличными, а оставшаяся сумма в чеке неожиданно регистрируется как Электронными или сопровождается признаком [БезОпл]. В других случаях касса вовсе аннулирует операцию, возвращая системную ошибку драйвера: Чек оплачен не полностью. Разберем подробно, почему это происходит и как правильно настроить программный код для работы с кассовым аппаратом.
Проанализируем механику фискализации чека. Кассовое ядро любого фискального регистратора (например, АТОЛ 55Ф) работает по строгому правилу баланса: общая сумма товарных позиций обязана до копейки совпадать с суммой всех переданных видов оплат. Формула проверки выглядит следующим образом:
ИтогЧека = НаличнаяОплата + БезналичнаяОплата + ПредварительнаяОплата + Постоплата + ВстречноеПредоставление
Выясним причину, почему в чеке возникает оплата электронными денежными средствами при оформлении отгрузки в долг или с частичной оплатой:
РеализацияТоваровУслуг без предварительного поступления денег, система регистрирует операцию с признаком способа расчета Передача в кредит. Поскольку фактического движения наличных средств не произошло, вся сумма документа передается как обязательство постоплаты, а в печатном документе фиксируется статус [БезОпл] с отнесением суммы на электронные средства расчета.СуммаЭлектроннойОплаты1, СуммаЭлектроннойОплаты2 и СуммаЭлектроннойОплаты3. Они маппировались в соответствующие таблицы кассового аппарата, где первая позиция традиционно отвечала за банковские карты, а последующие — за подарочные сертификаты, кредиты и взаимозачеты. При передаче постоплаты через устаревший интерфейс сумма нередко попадала в первый доступный безналичный слот.Рассмотрим распространенный сбой: в коде документа в структуру параметров чека переданы суммы, например, 5 960 руб. наличными и 1 543,81 руб. постоплатой, но ККТ аннулирует фискализацию с ошибкой неполной оплаты. Выделим две основные технические причины этой проблемы.
1. Несоответствие индексов типов оплат в драйвере ККТ.
В протоколах кассовой техники АТОЛ каждый вид оплаты привязан к строгому целочисленному индексу:
0 — Наличные средства (тег 1031);1 — Безналичные/электронные (эквайринг, тег 1081);2 — Предварительная оплата / аванс (тег 1215);3 — Последующая оплата / кредит (тег 1216);4 — Встречное предоставление (тег 1217).Если в коде нетиповой конфигурации постоплата передается с неверным номером типа или драйвер кассы не обновлен под поддержку тегов ФФД 1.05, устройство просто игнорирует неопознанную сумму. Для регистратора переданная сумма оплаты оказывается меньше расчетной стоимости товаров, что приводит к автоматической отмене чека.
2. Расхождение сумм из-за округления копеек при распределении скидок.
Это наиболее частая скрытая ошибка в учетных системах. Проанализируем ситуацию: в табличной части документа сумма строки рассчитывается как Количество * Цена - Скидка. Если при распределении ручной или автоматической скидки по позициям возникли дробные копейки, сумма по позициям чека может разойтись с итоговой суммой оплат всего на 1–2 копейки. Кассовый аппарат не допускает даже минимального дисбаланса: если сумма позиций составляет 7 503,83 руб., а оплата передана на 7 503,81 руб., касса зафиксирует недоплату и прервет операцию.
Чтобы исключить расхождения копеек и аннулирование чеков, в нетиповую конфигурацию необходимо встроить алгоритм форматно-логического контроля (ФЛК), аналогичный типовой функции ПровестиФорматоЛогическийКонтроль из конфигурации 1С:Розница.
Посмотрим на пример функции, выполняющей валидацию данных перед отправкой команды на фискализацию:
Функция ПроверитьКорректностьСуммЧека(ТаблицаТоваров, ТаблицаОплат, ТекстОшибки) Экспорт
СуммаПозиций = 0;
Для Каждого СтрТовар Из ТаблицаТоваров Цикл
// Проверяем строгое совпадение стоимости позиции
СуммаСтроки = Окр(СтрТовар.Количество * СтрТовар.ЦенаСУчетомСкидок, 2, РежимОкругления.Окр15как20);
Если СтрТовар.Сумма <> СуммаСтроки Тогда
СтрТовар.Сумма = СуммаСтроки;
КонецЕсли;
СуммаПозиций = СуммаПозиций + СтрТовар.Сумма;
КонецЦикла;
СуммаОплат = 0;
Для Каждого СтрОплата Из ТаблицаОплат Цикл
СуммаОплат = СуммаОплат + СтрОплата.Сумма;
КонецЦикла;
// Сравниваем итоги с точностью до копейки
Если СуммаПозиций <> СуммаОплат Тогда
ТекстОшибки = СтрШаблон(
"Нарушен баланс чека! Сумма позиций: %1, Сумма оплат: %2. Разница: %3",
СуммаПозиций,
СуммаОплат,
СуммаПозиций - СуммаОплат
);
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Разберем по шагам правильную методику проведения расчетов при оптовых и розничных отгрузках с отсрочкой платежа:
Частичный расчет и кредит (значение 5) либо Передача в кредит (значение 6). В структуре оплат фактически внесенные деньги передаются в категорию наличных или безналичных, а оставшийся остаток долга — строго в реквизит постоплаты (тег 1216).Оплата кредита (значение 7). Товарный состав в этом чеке не дублируется, НДС повторно не начисляется, а вся внесенная сумма закрывает ранее возникшее обязательство.