Переход на ставку НДС 20% традиционно вызывает множество вопросов у разработчиков и системных администраторов, сопровождающих торговые решения на базе «1С:Предприятие». При фискализации чеков на кассовых аппаратах АТОЛ пользователи часто сталкиваются с тем, что в чеке печатается «Без НДС» или «НДС 18%» вместо положенных 20%, либо ККТ аннулирует чек с ошибкой «Сумма налога больше суммы регистраций по чеку и/или итога».
В данной статье мы подробно разберем причины возникновения этих проблем и рассмотрим практические варианты их решения как на уровне кода 1С, так и на уровне настройки торгового оборудования.
Для того чтобы понять суть проблемы, проанализируем взаимодействие учетной системы 1С, драйвера торгового оборудования и прошивки ККТ:
Перейдем к практическим методам решения указанных проблем.
Если в вашей конфигурации при печати чека ставка 20% сбрасывается на «Без НДС», в первую очередь необходимо проверить, умеет ли сама программа 1С передавать эту ставку драйверу ККТ. Разберем по шагам доработку общего модуля.
Откроем конфигуратор и найдем общий модуль МенеджерОборудованияКлиентСервер (в некоторых конфигурациях логика может находиться в модуле МенеджерОборудованияВызовСервера или в обработке обслуживания ККТ).
Найдем функцию ПолучитьСтавкуНДСДляФискализацииЧека. По умолчанию в старых релизах она выглядит следующим образом:
Функция ПолучитьСтавкуНДСДляФискализацииЧека(СтавкаНДС, ПорядокНалогообложения = "") Экспорт
Если СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС")
ИЛИ СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.ПустаяСсылка")
ИЛИ ВРег(ПорядокНалогообложения) = "ЕНВД" Тогда
Результат = "";
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10") Тогда
Результат = 10;
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18") Тогда
Результат = 18;
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10_110") Тогда
Результат = 110;
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18_118") Тогда
Результат = 118;
КонецЕсли;
Возврат Результат;
КонецФункции
Как мы видим, функция не знает о существовании ставок 20% и 20/120%. Модернизируем ее, добавив соответствующие условия:
Функция ПолучитьСтавкуНДСДляФискализацииЧека(СтавкаНДС, ПорядокНалогообложения = "") Экспорт
Если СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС")
ИЛИ СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.ПустаяСсылка")
ИЛИ ВРег(ПорядокНалогообложения) = "ЕНВД" Тогда
Результат = "";
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10") Тогда
Результат = 10;
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18") Тогда
Результат = 18;
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10_110") Тогда
Результат = 110;
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18_118") Тогда
Результат = 118;
// Внедряем поддержку ставок 20%
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20") Тогда
Результат = 20;
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20_120") Тогда
Результат = 120;
КонецЕсли;
Возврат Результат;
КонецФункции
Дополнительно проанализируем функцию формирования XML-пакета для фискализации (например, ПолучитьXMLПакетДляФискализацияЧека_ТО). Убедимся, что при передаче расчетной ставки 120% XML-структура формирует корректное текстовое описание тега:
Если НЕ ПустаяСтрока(ТекущаяПозиция.СтавкаНДС) Тогда
Если ТекущаяПозиция.СтавкаНДС = 118 Тогда
ЗначениеСтавкаНДС = "18/118";
ИначеЕсли ТекущаяПозиция.СтавкаНДС = 110 Тогда
ЗначениеСтавкаНДС = "10/110";
// Добавляем обработку расчетной ставки 20/120
ИначеЕсли ТекущаяПозиция.СтавкаНДС = 120 Тогда
ЗначениеСтавкаНДС = "20/120";
Иначе
ЗначениеСтавкаНДС = ТекущаяПозиция.СтавкаНДС;
КонецЕсли;
Иначе
ЗначениеСтавкаНДС = "none";
КонецЕсли;
Благодаря этим изменениям 1С начнет корректно передавать числовые значения 20 и 120 в XML-пакете, отправляемом на драйвер ККТ.
Если после внесения изменений в код 1С касса отказывается печатать чек и выдает ошибку округлений налога (Код ошибки 3969 в логах драйвера АТОЛ), нам потребуется выполнить настройку самой ККТ.
Выясним причину этой ошибки. Она возникает из-за расхождения сумм налога, рассчитанных в 1С и определенных самой ККТ. В ККТ АТОЛ за это отвечает параметр контроля налогов: Таблица 2, Рядок 1, Поле 114 (Т2Р1П114).
Для устранения ошибки выполним следующие действия:
1 (строгий контроль совпадения переданной суммы НДС с расчетной величиной ККТ).0. Это позволит отключить жесткую блокировку ККТ при возникновении копеечных расхождений в округлениях и даст возможность кассе принимать сумму НДС напрямую из учетной системы 1С.Также важно убедиться, что в ККТ введен Код защиты № 10. Проверить это можно в тест-драйвере в разделе «Коды защиты». Без этого кода ККТ физически не сможет сопоставить переданную ставку 20% со своим внутренним алгоритмом работы.
Рассмотрим ситуацию, когда у вас нет возможности оперативно обновить драйвер АТОЛ на рабочем месте (например, используются устаревшие рабочие станции с операционными системами, не поддерживающими DTO 10). В этом случае можно использовать механизм маппинга.
Поскольку прошивка ККТ при наличии Кода защиты 10 автоматически переводит старый индекс налога 18% в 20%, мы можем обмануть драйвер. Мы будем отправлять из 1С числовой идентификатор ставки «18» (или «118»), но сумму налога TaxSum передадим рассчитанную исходя из 20%.
В этом случае в модуле МенеджерОборудованияКлиентСервер в функции ПолучитьСтавкуНДСДляФискализацииЧека пропишем следующую подмену:
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20") Тогда
Результат = 18; // Передаем 18 вместо 20 для старого драйвера
ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20_120") Тогда
Результат = 118; // Передаем 118 вместо 120
При получении такого пакета ККТ (при условии корректной даты и активированного КЗ 10) напечатает на бумажном чеке корректный текст «НДС 20%» и отправит правильные сведения в ОФД, сопоставив старый индекс налога с новым алгоритмом расчета.
Важное предупреждение: При таком подходе обязательно нужно передавать заполненный тег TaxSum (сумму НДС), рассчитанную в 1С по ставке 20%. Если передать TaxSum="" (пустую строку), касса пересчитает налог по ставке 18% или напечатает чек без НДС.
Несмотря на работоспособность обходных путей, наиболее надежным и правильным решением является полный переход на драйвер АТОЛ версии 10.х (DTO 10) и использование актуальных версий библиотек подключаемого оборудования (БПО) от фирмы 1С.
Разберем основные преимущества перехода на 10-й драйвер:
Для успешной интеграции драйвера 10.х в старые конфигурации (например, УПП 1.3 или УТ 10.3) рекомендуется обновить внешнюю обработку обслуживания ККТ, взяв ее из последнего дистрибутива БПО (Библиотеки подключаемого оборудования) версии не ниже 2.0.6. Это исключит большинство системных ошибок при передаче XML-пакетов драйверу ККТ.