Как настроить печать чеков со ставкой НДС 20% на ККТ АТОЛ в 1С

Программист 1С v8.3 (Обычные формы) Налоговый учет Торговля и дистрибуция
← На главную

Переход на ставку НДС 20% традиционно вызывает множество вопросов у разработчиков и системных администраторов, сопровождающих торговые решения на базе «1С:Предприятие». При фискализации чеков на кассовых аппаратах АТОЛ пользователи часто сталкиваются с тем, что в чеке печатается «Без НДС» или «НДС 18%» вместо положенных 20%, либо ККТ аннулирует чек с ошибкой «Сумма налога больше суммы регистраций по чеку и/или итога».

В данной статье мы подробно разберем причины возникновения этих проблем и рассмотрим практические варианты их решения как на уровне кода 1С, так и на уровне настройки торгового оборудования.

Почему возникает проблема при работе со ставкой НДС 20%?

Для того чтобы понять суть проблемы, проанализируем взаимодействие учетной системы 1С, драйвера торгового оборудования и прошивки ККТ:

  1. Отсутствие ставки во внутренних таблицах ККТ или драйвера. В старых версиях драйверов АТОЛ (особенно в ветке 8.х и ранних версиях 9.х) и в старых прошивках касс ставка НДС 20% физически отсутствует. Архитектура кассового ПО АТОЛ часто использует механизм «подмены» (маппинга): ККТ переводит старый индекс налога 18% в значение 20% на основании даты (после 01.01.2019) и наличия специальной лицензии.
  2. Необходимость наличия Кода защиты № 10 (КЗ 10). Без введенного в ККТ кода защиты 10 (лицензии на обновление) касса блокирует применение новой ставки. При попытке передать «20%» она либо выдаст ошибку, либо напечатает «Без НДС». Также этот код отвечает за замену устаревшего понятия «электронные» на «безналичные» в печатной форме чека.
  3. Жесткий контроль округления (Таблица 2, Рядок 1, Поле 114). В ККТ АТОЛ встроен внутренний математический алгоритм проверки соответствия суммы НДС и суммы позиции. Если 1С рассчитывает НДС построчно и передает готовое значение суммы налога, а ККТ при пересчете получает расхождение даже в 1 копейку, касса блокирует чек с ошибкой несоответствия сумм налога и регистраций.
  4. Устаревший код в конфигурациях 1С. В неактуальных релизах программ 1С (таких как «Управление производственным предприятием 1.3» или «Управление торговлей 10.3») в общих модулях интеграции с торговым оборудованием обработка новой ставки НДС 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-пакете, отправляемом на драйвер ККТ.

Решение 2: Настройка ККТ и устранение ошибки «Сумма налога больше суммы регистраций...»

Если после внесения изменений в код 1С касса отказывается печатать чек и выдает ошибку округлений налога (Код ошибки 3969 в логах драйвера АТОЛ), нам потребуется выполнить настройку самой ККТ.

Выясним причину этой ошибки. Она возникает из-за расхождения сумм налога, рассчитанных в 1С и определенных самой ККТ. В ККТ АТОЛ за это отвечает параметр контроля налогов: Таблица 2, Рядок 1, Поле 114 (Т2Р1П114).

Для устранения ошибки выполним следующие действия:

  1. Запустим утилиту «Тест драйвера ККТ» (версии 9.х или 10.х).
  2. Перейдем в раздел настройки свойств ККТ и откроем таблицы параметров ККТ.
  3. Найдем Таблицу 2 («Параметры ККТ»), Рядок 1, Поле 114.
  4. По умолчанию это поле может быть установлено в значение 1 (строгий контроль совпадения переданной суммы НДС с расчетной величиной ККТ).
  5. Установим значение этого поля в 0. Это позволит отключить жесткую блокировку ККТ при возникновении копеечных расхождений в округлениях и даст возможность кассе принимать сумму НДС напрямую из учетной системы 1С.
  6. Сохраним настройки ККТ.

Также важно убедиться, что в ККТ введен Код защиты № 10. Проверить это можно в тест-драйвере в разделе «Коды защиты». Без этого кода ККТ физически не сможет сопоставить переданную ставку 20% со своим внутренним алгоритмом работы.

Решение 3: Обходное решение для старых драйверов АТОЛ (версии 8.х и 9.х)

Рассмотрим ситуацию, когда у вас нет возможности оперативно обновить драйвер АТОЛ на рабочем месте (например, используются устаревшие рабочие станции с операционными системами, не поддерживающими 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% или напечатает чек без НДС.

Решение 4: Переход на драйвер АТОЛ версии 10.х

Несмотря на работоспособность обходных путей, наиболее надежным и правильным решением является полный переход на драйвер АТОЛ версии 10.х (DTO 10) и использование актуальных версий библиотек подключаемого оборудования (БПО) от фирмы 1С.

Разберем основные преимущества перехода на 10-й драйвер:

Для успешной интеграции драйвера 10.х в старые конфигурации (например, УПП 1.3 или УТ 10.3) рекомендуется обновить внешнюю обработку обслуживания ККТ, взяв ее из последнего дистрибутива БПО (Библиотеки подключаемого оборудования) версии не ниже 2.0.6. Это исключит большинство системных ошибок при передаче XML-пакетов драйверу ККТ.

← На главную