При работе с онлайн-кассами в устаревших, но все еще актуальных конфигурациях, таких как Управление торговлей 10.3, программисты часто сталкиваются с ситуацией, когда налоги в чеке либо не печатаются вовсе (выводится «0%» или «Без НДС»), либо касса выдает ошибку о недопустимой сумме налога. Особенно остро этот вопрос стоит для организаций, совмещающих несколько систем налогообложения (например, ОСН и ЕНВД/Патент).
В данной статье мы подробно разберем, как программно управлять ставками НДС, проанализируем формирование XML-пакета для драйвера ККТ и выясним, почему «пропадает» налог при отправке данных на фискальный регистратор.
Первым делом рассмотрим, где именно в коде формируются данные для чека. В типовой УТ 10.3 за это отвечает модуль обработки обслуживания или общие модули интеграции с БПО. Основная точка входа для подготовки данных — процедура ПодготовитьДанныеДляФискализацииЧека. Выясним, как принудительно установить нужную систему налогообложения (СНО) и ставку НДС.
Часто автоматическое определение СНО из учетной политики срабатывает некорректно. Чтобы гарантированно передать ОСН, мы можем модифицировать структуру параметров:
// Принудительная установка ОСН для чека
ОбщиеПараметры.СистемаНалогообложения = ПредопределенноеЗначение("Перечисление.ТипыСистемНалогообложенияККТ.ОСН");
Далее проанализируем заполнение строк чека. Если данные из номенклатуры подтягиваются неверно, мы можем переопределить ставку непосредственно в цикле формирования товарных позиций. Рассмотрим пример кода:
Для Каждого СтрокаТовара Из ЧекККМ.Товары Цикл
СтрокаЧека = НоваяСтруктура("Наименование, Количество, Цена, Сумма, СтавкаНДС, НомерСекции");
СтрокаЧека.Наименование = СтрокаТовара.Номенклатура.Наименование;
СтрокаЧека.Количество = СтрокаТовара.Количество;
СтрокаЧека.Цена = СтрокаТовара.Цена;
СтрокаЧека.Сумма = СтрокаТовара.Сумма;
// Явное указание ставки НДС 18% (или 20% для актуальных релизов)
СтрокаЧека.СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18");
// Номер секции также может влиять на налоги в старых моделях ККТ
СтрокаЧека.НомерСекции = 1;
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
КонецЦикла;
Даже если в структуре СтрокаЧека ставка заполнена правильно, она может «потеряться» при преобразовании в XML-строку, которую понимает драйвер ККТ. Разберем работу общего модуля МенеджерОборудованияВызовСервера и функции ПолучитьXMLПакетдляФискализацияЧека.
Найдем фрагмент кода, где выполняется запись атрибута Tax. Проанализируем логику:
Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда
Если ТекущаяПозиция.СтавкаНДС = 118 ИЛИ ТекущаяПозиция.СтавкаНДС = "18/118" Тогда
ЗначениеСтавкаНДС = "18"; // Или "18/118" в зависимости от требований драйвера
ИначеЕсли ТекущаяПозиция.СтавкаНДС = 110 Тогда
ЗначениеСтавкаНДС = "10";
Иначе
ЗначениеСтавкаНДС = ТекущаяПозиция.СтавкаНДС;
КонецЕсли;
Иначе
ЗначениеСтавкаНДС = "none";
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("Tax", XMLСтрока(ЗначениеСтавкаНДС));
Важный момент: драйверы разных производителей (АТОЛ, Штрих-М) по-разному интерпретируют значение атрибута Tax. Для некоторых версий БПО значение должно быть строковым идентификатором (например, vat18), для других — числовым индексом из таблицы налогов ККТ. Если передать «18%» вместо «18», касса может сбросить налог в значение по умолчанию.
Рассмотрим ситуацию, когда при явном указании суммы НДС касса выдает ошибку. Это происходит из-за расхождений в алгоритмах округления 1С и прошивки ККТ. Выясним причину:
Окр(Сумма * 18 / 118, 2).Решение: В современных протоколах ФФД (1.05 и выше) рекомендуется передавать только ставку налога, не передавая рассчитанную сумму в каждую строку, если драйвер позволяет это сделать. В этом случае касса сама рассчитает итоговый налог, и математического конфликта не возникнет.
Проанализируем влияние версии драйвера на результат. Использование 8-й версии драйвера АТОЛ с новыми прошивками под ФФД 1.05 часто приводит к тому, что налоги не передаются корректно через XML-интерфейс 1С. Рассмотрим рекомендации по обновлению:
Иногда корень проблемы лежит вне кода 1С. Рассмотрим внутренние настройки ККТ. У каждой кассы есть внутренняя Таблица налогов. Если в 1С мы передаем «Налог №1», а в кассе в первой строке таблицы запрограммировано «Без НДС», то в чеке мы увидим отсутствие налога.
Посмотрим, как это проверить:
Если вы внесли изменения в код и настройки, но НДС все равно 0%, проанализируйте лог драйвера ККТ. Там можно увидеть «чистый» XML-пакет, который уходит из 1С. Если в теге Tax стоит правильное значение, значит, проблему нужно искать исключительно в настройках самой кассы или в совместимости версии драйвера с ФФД.
Таким образом, мы разобрали основные причины исчезновения НДС в чеках ККТ для УТ 10.3. Совместное использование программной корректировки в модулях фискализации и правильная настройка драйвера позволяют решить проблему корректного отображения налогов при любых сочетаниях СНО.