В процессе работы с конфигурацией 1С:Управление торговлей 11 (начиная с релизов 11.4.13.xxx) многие пользователи сталкиваются с критической ошибкой при попытке пробития чека из документа Реализация товаров и услуг. Ошибка сопровождается сообщением: «При выполнении операции произошла ошибка: Некорректная сумма налога. Чек не напечатан на фискальном устройстве» — есть фискализация и обработка ошибок для ФФД 1.2. Чаще всего это происходит на оборудовании Атол (например, 11Ф) с использованием драйверов версии 10.x.
В данной статье мы подробно разберем, почему возникает эта ситуация, как найти проблемное место в программном коде и какие настройки драйвера ККТ помогут обойти это ограничение без радикальных мер вроде разбиения документа на части. Решить проблему поможет исправление ошибок формирования итогового чека ККМ.
Основная причина кроется в математическом расхождении между алгоритмами расчета НДС в 1С и внутри прошивки кассового аппарата. Давайте проанализируем ситуацию: когда в документе 1С применены автоматические или ручные скидки, цена за единицу товара может стать дробной (содержать более двух знаков после запятой). Однако формат фискальных данных требует передачи цены с точностью до 2 знаков.
При умножении округленной цены на количество товара итоговая сумма строки может не совпасть с той суммой, которую 1С передает как «Итого по позиции». Если разница составляет хотя бы одну копейку, кассовый аппарат блокирует операцию, считая сумму налога некорректной (поможет универсальная обработка обслуживания онлайн-касс с ФФД 1.2). Особенно остро это проявляется при использовании ФФД 1.2, где требования к форматно-логическому контролю стали значительно жестче.
Для того чтобы понять, как 1С формирует данные для отправки на кассу, нам необходимо заглянуть в конфигуратор. Основная логика подготовки XML-пакета для фискализации сосредоточена в общем модуле МенеджерОборудованияВызовСервера. Именно там находится функция СформироватьXMLПакетДляФискализацияЧека.
Рассмотрим фрагмент кода, который отвечает за расчет цены с учетом скидок и формирование XML-атрибутов позиции:
Если ТекущаяПозиция.ЦенаСоСкидками = 0 И ТекущаяПозиция.Сумма > 0 И ТекущаяПозиция.Количество > 0 Тогда
ЦенаСоСкидками = Окр(ТекущаяПозиция.Сумма / ТекущаяПозиция.Количество, 2);
Иначе
ЦенаСоСкидками = ТекущаяПозиция.ЦенаСоСкидками;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", XMLСтрока(ТекущаяПозиция.Наименование));
ЗаписьXML.ЗаписатьАтрибут("Quantity", XMLСтрока(ТекущаяПозиция.Количество));
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", XMLСтрока(ЦенаСоСкидками));
ЗаписьXML.ЗаписатьАтрибут("AmountWithDiscount", XMLСтрока(ТекущаяПозиция.Сумма));
ЗаписьXML.ЗаписатьАтрибут("DiscountAmount", XMLСтрока(ТекущаяПозиция.СуммаСкидок));
КонецЦикла;
Обратим внимание на строку ЦенаСоСкидками = Окр(ТекущаяПозиция.Сумма / ТекущаяПозиция.Количество, 2);. Здесь происходит жесткое округление цены до копеек. Если мы умножим полученную ЦенаСоСкидками на ТекущаяПозиция.Количество, результат может не равняться ТекущаяПозиция.Сумма. Касса получает эти данные, пытается перепроверить расчет налога и выдает ошибку.
Прежде чем вносить изменения в код или использовать расширения, попробуем решить проблему штатными средствами настройки драйвера. Рассмотрим наиболее эффективный способ, который помог многим специалистам.
Эти манипуляции позволяют кассе более «лояльно» относиться к копеечным расхождениям, возникающим из-за округлений в учетной системе.
Если манипуляции с драйвером не помогли, проанализируем настройки внутри самой 1С. В интерфейсе программы перейдем в раздел «НСИ и администрирование» -> «РМК и оборудование» -> «Подключаемое оборудование».
Откроем настройки нашей кассы ККМ и обратим внимание на следующие параметры:
0.01 или 0.05. Это даст системе легальную возможность корректировать пакет XML перед отправкой драйверу.Для программистов 1С наиболее правильным путем будет создание расширения, которое модифицирует процедуру заполнения позиций чека. Вместо того чтобы править типовой модуль МенеджерОборудованияВызовСервера, мы перехватим подготовку данных.
В расширении следует реализовать алгоритм «распределения копеек». Если Цена * Количество != Сумма, мы должны программно разделить строку на две. Рассмотрим логику на примере:
Допустим, продается 3 единицы товара на общую сумму 100 рублей со скидкой. Цена за единицу получается 33.3333... При округлении до 33.33 сумма за 3 штуки составит 99.99. Разница в 1 копейку и вызывает ошибку. В расширении мы можем сформировать XML так, чтобы передать 2 единицы по 33.33 и 1 единицу по 33.34. В сумме получится ровно 100.00, и касса примет такой чек без возражений.
Если ошибка сохраняется, проанализируем следующие моменты:
Таким образом, мы выяснили, что ошибка «Некорректная сумма налога» — это не приговор, а следствие строгих проверок ФФД. Сочетание правильной настройки форматно-логического контроля в 1С и параметров округления в драйвере ККТ позволяет решить проблему в большинстве случаев без необходимости перепроведения документов в закрытых периодах.