При расчете сложных скидок или пропорциональном распределении сумм в учетной системе цена за единицу товара нередко получается дробной — с тремя или четырьмя знаками после запятой (например, 12 бутылок на сумму 488,58 руб. дают расчетную цену 40,715 руб.).
При попытке передать такие данные в фискальный регистратор через драйвер Штрих-М (DrvFR) возникает конфликт. В чеке ККТ регистрируется одна итоговая сумма, а из учетной программы на закрытие чека передается другая. В результате фискальный регистратор возвращает ошибку: «Сумма всех типов оплаты меньше итога чека», и печать чека блокируется. Разберем причины возникновения этой ошибки и проверенные способы ее устранения.
Проанализируем технические и законодательные ограничения, действующие при работе с контрольно-кассовой техникой:
Рассмотрим наиболее надежный способ, позволяющий сохранить точное количество проданного товара и итоговую сумму документа без использования дробных копеек. Если при делении общей стоимости строки на количество получается неделимый остаток, позиция в чеке разбивается на две строки с одинаковым наименованием, но с ценами, отличающимися на одну копейку.
Посмотрим на пример: необходимо продать 20 единиц товара на общую сумму 0,30 руб. (средняя цена 0,015 руб.). Программно формируются две строки:
Итоговое количество составляет 20 шт., а сумма — ровно 0,30 руб. При этом касса получает абсолютно корректные цены с двумя знаками после запятой.
Разберем алгоритм такого расщепления на встроенном языке 1С:
// Входные параметры позиции
ВсегоКоличество = 12;
ВсегоСумма = 488.58;
// Вычисляем базовую округленную цену вниз (до копеек)
БазоваяЦена = Окр(ВсегоСумма / ВсегоКоличество - 0.005, 2);
ПовышеннаяЦена = БазоваяЦена + 0.01;
// Определяем количество для строки с повышенной ценой
КоличествоПовышенное = Окр((ВсегоСумма - БазоваяЦена * ВсегоКоличество) / 0.01, 0);
КоличествоБазовое = ВсегоКоличество - КоличествоПовышенное;
Если КоличествоПовышенное = 0 Тогда
// Расщепление не требуется, цена делится нацело
ПечатьСтрокиККТ(Наименование, ВсегоКоличество, БазоваяЦена);
Иначе
// Передаем две позиции с корректными ценами
Если КоличествоБазовое > 0 Тогда
ПечатьСтрокиККТ(Наименование, КоличествоБазовое, БазоваяЦена);
КонецЕсли;
ПечатьСтрокиККТ(Наименование, КоличествоПовышенное, ПовышеннаяЦена);
КонецЕсли;
Если специфика учета позволяет продавать товар не поштучно, а упаковками, можно изменить единицу измерения предмета расчета. Например, вместо передачи позиции «Бутылка — 12 шт. по 40,715 руб.» в ККТ передается «Упаковка (12 шт.) — 1 шт. по цене 488,58 руб.».
В этом случае количество равно целому числу (1 шт.), а цена точно равна итоговой стоимости, что полностью исключает возникновение погрешностей при умножении.
Если копеечные расхождения возникают на этапе закрытия чека из-за особенностей расчета скидок самим драйвером, необходимо перед оплатой считывать фактическую сумму, накопленную внутри кассы.
Разберем порядок действий при взаимодействии с драйвером Штрих-М:
CheckSubTotal()) или прочитать свойство итоговой суммы чека из драйвера (Summ).Такой подход гарантирует, что сумма переданных типов оплат будет в точности совпадать с расчетом фискального регистратора, предотвращая ошибку блокировки печати.