Ошибка: Некорректная сумма налога при пробитии чека на фискальных регистраторах АТОЛЛ.

Иногда при печати чека из 1С выдается странная ошибка — код ошибки 128 [Некорректная сумма налога].

Вероятных причин ее появления может быть несколько:

  1. Версия прошивки ККМ.
  2. Версия драйвера для работы ККМ.
  3. Версия ПО из которого производится пробитие чека, а также отдельных его обработок и модулей обработчиков .

В данной статье рассмотрим возникновение ошибки по причине обработчика печати чека.

Приходилось сталкиваться с репликами пользователей некоторых самописных конфигураций: — «Все было замечательно, все работало и после обновления прошивки ККМ перестало».

Корень проблемы оказался в изменении поведения ККМ на некоторые свойства драйвера. (Для решений на поддержке например типовых конфигураций 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