Иногда при печати чека из 1С выдается странная ошибка — код ошибки 128 [Некорректная сумма налога].
Вероятных причин ее появления может быть несколько:
- Версия прошивки ККМ.
- Версия драйвера для работы ККМ.
- Версия ПО из которого производится пробитие чека, а также отдельных его обработок и модулей обработчиков .
В данной статье рассмотрим возникновение ошибки по причине обработчика печати чека.
Приходилось сталкиваться с репликами пользователей некоторых самописных конфигураций: — «Все было замечательно, все работало и после обновления прошивки ККМ перестало».
Корень проблемы оказался в изменении поведения ККМ на некоторые свойства драйвера. (Для решений на поддержке например типовых конфигураций 1с — проблема может решится обычным обновлением в котором разработчики внесли изменения в алгоритм пробития чека) . Для пользователей продуктов снятых с поддержки или вообще не типовых будем разбираться в причине появления данной ошибки.
Ошибка возникает из за передачи фискальному регистратору суммы НДС из обработчика пробития чека, а точнее из за разницы в точности переданной из программы и вычисленной суммы НДС в кассовом аппарате. Ситуация когда вычисляемая сумма будет вынуждена округляться, могут встречаться при изменении суммы. Как вариант — скидкой при операции деления результат может иметь точность больше двух знаков после запятой.
Аппарат рассчитывает сумму НДС исходя из точности до 0,01 коп переданной в аппарат цены, а в программах 1с точность выше, например до 0,001 коп, в процессе расчета возникает различие при округлении и появляется разница в размере +/- 1 коп. Такая ситуация может возникнуть при скидке когда в результате деления результат получается больше чем два знака после запятой.
Например:
Мы продали товар в количестве 15 шт с учетом скидки на сумму 98,94 руб.
Вычислим цену единицы товара которую рассчитывает программа 1С и передает в ККМ — 98,94 руб / 15 шт = 6,596 руб / шт (рублей за штуку)
Сумма НДС в документе который создан в программе будет равна — 98,94 руб х 20 / 120 = 16,49 руб.
Но аппарат нам выдаст совсем другие цифры потому как при передаче цены за единицу товара произойдет округление цены по всем правилам 98,94 руб / 15 шт = Округляем (6,596 руб) = 6,6 руб.
Сумма документа в чеке которую рассчитает ККМ будет уже не 98,94 руб., а 99 руб что в свою очередь повлияет на сумму НДС которая составит 99 руб х 20 / 120 = 16,5 руб. 16,4 руб — 16,5 руб = — 0,1 руб и при попытке передачи суммы НДС возникнет ошибка.
Вся проблема заключается в этих атрибутах:
Объект.setParam(Объект.LIBFPTR_PARAM_USE_ONLY_TAX_TYPE, 1); //1- НДС не расчитывается в ККТ используется только ставка. 0-сумма НДС рассчитывается исходя из суммы и ставки в аппарате. Объект.setParam(Объект.LIBFPTR_PARAM_TAX_SUM, СуммаНДС); // при значении атрибута LIBFPTR_PARAM_USE_ONLY_TAX_TYPE - true или 1, сумма НДС должна передаваться отдельным значением.
LIBFPTR_PARAM_USE_ONLY_TAX_TYPE — регистрировать в ФН только ставку налога. В этом случае требуется до закрытия чека зарегистрировать сумму налога по данной ставке с помощью метода receiptTax().
LIBFPTR_PARAM_TAX_SUM — сумма налога. При передаче значения 0 рассчитывается автоматически
Логика работы данных атрибутов в новых версиях прошивки ККТ работает не совсем корректно на мой взгляд. Она требует чтобы программа на компьютере считала точно так же как аппарат и совсем не учтена особенность что пользовательские программы в расчетных операциях, могут получать суммы с большей точностью чем это делает аппарат что в итоге приведет к округлению и разнице в расчетах и появлению ошибки — код ошибки 128 [Некорректная сумма налога].
На аппарат возлагается функция контроллера которая бывает не нужна и судя по документации должна отключаться , таким образом делегируя весь расчет клиентской программе. Сейчас же можно сказать данная функция не работает и нет никакого смысла ее включать и передавать сумму НДС рассчитанную в документе. Пусть аппарат считает ее сам с установленной разрядностью (его все равно другое значение не устроит).
Для того чтобы избежать двойственности в расчете НДС необходимо передавать в ККМ, «правильную» цену за единицу товара, т.е которая не будет округляться с 0,001 до 0,01 и включить автоматический расчет НДС в ККМ. Для «отрезания» 0,001 можно использовать функцию приведенную ниже которая выдает число с точностью до 0,01 что позволяет избежать округления числа в ККМ.
Функция ОбрезкаЧислаБезОкругления(Цифра) ЦелаяЧасть = Цел(Цифра); ДробнаяЧасть = Цел((Цифра - ЦелаяЧасть) *100)/100; Возврат ЦелаяЧасть+ДробнаяЧасть; КонецФункции //Пример работы: передаем число 6,596 возвращается 6,59