Вы сталкивались с ситуацией, когда в вашей программе 1С (например, «Управление торговлей 10.3») все настройки налогообложения заданы верно, в карточках номенклатуры жестко прописана ставка НДС 18% или 20%, а на распечатанном фискальном чеке упорно выводится «Сумма без НДС»? При этом общая система налогообложения (ОСНО) настроена корректно, а СНО в чеке передается правильно. Это крайне распространенная проблема при работе с онлайн-кассами (особенно с аппаратами АТОЛ), подключенными к старым конфигурациям 1С. В этой статье мы подробно разберем, почему возникает данная ошибка, где именно в коде программы скрывается причина и как исправить передачу ставок НДС в ККТ.
Для начала давайте разберемся, как вообще происходит общение программы 1С с кассовым аппаратом. В современных версиях интеграции 1С не отправляет напрямую текстовое название ставки или произвольные числа. Вместо этого программа формирует специальный XML-пакет (так называемый XML-пакет фискализации), который передается драйверу ККТ. Драйвер, в свою очередь, парсит этот пакет и переводит его во внутренние команды кассового аппарата.
Согласно форматам фискальных документов (ФФД 1.05 и ФФД 1.2), для каждой товарной позиции в чеке должен передаваться определенный налоговый признак. В XML-пакете за это отвечает атрибут Tax (в некоторых версиях БПО — VATRate). Этот параметр должен принимать строго стандартизированные строковые значения:
"none" — Без НДС;"20" (ранее "18") — НДС 20% (18%);"10" — НДС 10%;"0" — НДС 0%;"20/120" (ранее "18/118") — расчетная ставка.Если в формируемом XML-пакете данный атрибут отсутствует вовсе, передается с некорректным типом данных (например, передается ссылка на перечисление 1С ПеречислениеСсылка.СтавкиНДС вместо текстовой строки) или содержит пустое значение, драйвер ККТ АТОЛ по умолчанию считает, что товар продается без налога. В результате на чеке печатается «Без НДС», а в ОФД уходят неверные данные.
Прежде чем вносить изменения в программный код, выясним точную причину сбоя. Для этого проведем диагностику по шагам:
TaxTypeNumber), возникает путаница. Касса получает код, который в ее новой прошивке означает «Без НДС», и печатает его. Поэтому использование XML-пакетов через БПО является более надежным методом.Выяснив причину, перейдем к исправлению кода. В старых конфигурациях, таких как «Управление торговлей 10.3», за подготовку данных для чека отвечает модуль документа ЧекККМ или общий модуль интеграции. Наша задача — найти, где формируется XML-пакет, и убедиться, что атрибут Tax корректно записывается для каждой строки товара.
Рассмотрим подробнее этот процесс. Откроем конфигуратор 1С и найдем общий модуль МенеджерОборудованияВызовСервера (в зависимости от релиза БПО это также может быть модуль МенеджерОборудованияКлиентСервер). Найдем функцию, отвечающую за генерацию XML-пакета (например, СформироватьXMLПакетДляФискализацииЧека).
Проанализируем цикл, в котором происходит обход строк табличной части документа и запись XML. Нам необходимо принудительно передавать строковое представление ставки НДС в атрибут Tax. Разберем по шагам, какой код нам необходимо добавить или изменить:
// В цикле формирования позиций чека (XML-пакета)
// Проверяем ставку НДС текущей строки чека и сопоставляем ее со строковым форматом ККТ
СтавкаНДСЧислом = "";
Если ЗначениеЗаполнено(ТекСтрока.СтавкаНДС) Тогда
// Преобразуем ставку из перечисления 1С в строковый формат для кассы
Если ТекСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20
Или ТекСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС18 Тогда
СтавкаНДСЧислом = "20"; // Передаем актуальную ставку для ККТ
ИначеЕсли ТекСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС10 Тогда
СтавкаНДСЧислом = "10";
ИначеЕсли ТекСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС0 Тогда
СтавкаНДСЧислом = "0";
ИначеЕсли ТекСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120
Или ТекСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
СтавкаНДСЧислом = "20/120";
Иначе
СтавкаНДСЧислом = "none";
КонецЕсли;
Иначе
СтавкаНДСЧислом = "none";
КонецЕсли;
// Записываем атрибут Tax в структуру XML товарной позиции
ЗаписьXML.ЗаписатьАтрибут("Tax", СтавкаНДСЧислом);
Внедрение этого кода гарантирует, что драйвер ККТ получит четкую строковую команду (например, Tax="20"), которую он сможет однозначно сопоставить со своей внутренней таблицей налогов и распечатать правильный НДС на чеке.
Если после изменения кода касса все еще продолжает печатать «Без НДС», необходимо проверить сопутствующие настройки в самой базе и на стороне операционной системы:
Для того чтобы быстро диагностировать подобные проблемы в будущем, мы рекомендуем использовать лог-файлы драйвера ККТ АТОЛ. В файле лога (обычно fptr10.log для десятой версии драйвера) записываются все входящие XML-пакеты, которые приходят из 1С.
Откройте этот лог-файл во время печати чека и найдите блок данных, отправленный системой 1С. Найдите в нем тег товарной позиции (например, <Item...) и посмотрите, присутствует ли там атрибут Tax или VATRate. Если атрибут равен "none" или отсутствует вовсе, проблему нужно решать в коде 1С. Если же в логе зафиксирована передача Tax="20", но на чеке все равно печатается «Без НДС» — проблема на стороне ККТ (требуется настройка таблиц налогов или обновление прошивки).