Почему в ОФД уходит ставка «НДС 0%» вместо «Без НДС» при печати чека из 1С и как это исправить?

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

При доработке нетиповых конфигураций или адаптации устаревших версий конфигураций (например, УПП 1.2 на платформе 8.1) под требования 54-ФЗ разработчики часто сталкиваются со специфической ошибкой: на бумажной ленте печатного чека налог не отображается, но в фискальных данных оператора (ОФД) каждой позиции чека присваивается ставка «НДС 0%» вместо «Без НДС».

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

В чем разница между «НДС 0%» и «Без НДС» в форматах фискальных документов (ФФД)

С точки зрения налогового законодательства и стандартов ФФД значения «0%» и «Без НДС» принципиально отличаются:

  1. НДС 0% (код ставки 5 в теге 1199) — применяется плательщиками НДС на общей системе налогообложения в строго определенных законом случаях (например, при экспорте). Применение ставки 0% требует подтверждения и отражения в декларации по НДС.
  2. НДС не облагается / Без НДС (код ставки 6 в теге 1199) — применяется организациями и предпринимателями на специальных налоговых режимах (УСН, ПСН), а также при реализации товаров и услуг, освобожденных от налогообложения по ст. 149 НК РФ.

Когда кассовая программа передает в драйвер ККТ числовое значение 0, драйвер или прошивка кассового аппарата интерпретирует его буквально как ставку 0% (тег 1199 со значением 5). Чтобы касса зарегистрировала признак «Без НДС» (тег 1199 со значением 6), в структуру XML-пакета чека или в параметры метода драйвера необходимо передавать специальный строковый маркер либо пустое значение.

Анализ типовой ошибки в коде конфигурации

Рассмотрим, как формируется ставка налога в кодовой базе. Во многих типовых и самописных модулях расчет ставки сводится к вызову типовой функции общего модуля:


Функция ПолучитьСтавкуНДС(СтавкаНДС) Экспорт
    Если СтавкаНДС = Перечисления.СтавкиНДС.НДС20 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
        Возврат 20;
    ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда
        Возврат 10;
    ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС18 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
        Возврат 18;
    КонецЕсли;
    Возврат 0;
КонецФункции

Проанализируем этот код: если в документе выбрано перечисление Перечисления.СтавкиНДС.БезНДС, условие нигде не срабатывает, и функция по умолчанию возвращает число 0. Это число попадает в атрибут ставки налога фискальной строки, из-за чего касса отправляет в ОФД признак 0%.

В зависимости от версии требований «1С:Совместимо» и используемого драйвера ККТ (например, интеграционных компонент «Штрих-М» или «АТОЛ»), для обозначения позиции без налога в атрибут Tax или VATRate должна передаваться либо пустая строка "", либо строковое значение "none".

Пошаговое исправление алгоритма формирования фискальных строк

Чтобы исключить неверную регистрацию ставок, разберем по шагам правильную организацию логики.

Шаг 1. Проверка общих модулей. Не следует менять стандартную функцию УчетНДС.ПолучитьСтавкуНДС, так как она может использоваться в расчетах сумм других документов бухгалтерского и налогового учета, где требуется именно числовое значение. Лучше реализовать отдельную функцию подготовки ставки для чека ККТ.

Шаг 2. Формирование строкового значения для кассы. Посмотрим на пример корректного получения значения ставки для фискализации:


Функция ПолучитьСтавкуНДСДляЧека(СтавкаНДС, ПорядокНалогообложения = "") Экспорт

    Если СтавкаНДС = Перечисления.СтавкиНДС.БезНДС 
        ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.ПустаяСсылка()
        ИЛИ ВРег(ПорядокНалогообложения) = "ЕНВД"
        ИЛИ ВРег(ПорядокНалогообложения) = "УСН" Тогда
        
        Возврат ""; // Для некоторых драйверов может потребоваться "none"
    ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС0 Тогда
        Возврат 0;
    Иначе
        Возврат УчетНДС.ПолучитьСтавкуНДС(СтавкаНДС);
    КонецЕсли;

КонецФункции

Особенности платформы 1С:Предприятие 8.1

Обратим внимание на синтаксис при переносе механизмов из современных типовых конфигураций (например, УПП 1.3 или БП 3.0) в базы на платформе 8.1. Функция ПредопределенноеЗначение() была добавлена только в платформе 8.2. Попытка вызвать ее в 8.1 приведет к синтаксической ошибке. В платформе 8.1 обращение к элементам перечислений выполняется напрямую через менеджер:


// В платформе 8.1 используем:
Перечисления.СтавкиНДС.БезНДС

// Конструкция ниже в 8.1 вызовет ошибку:
// ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС")

Настройка таблиц драйвера ККТ

Если после исправления кода касса по-прежнему ведет себя некорректно при прямом обращении через DTO, проанализируем настройки ККТ:

  1. В современных версиях прошивок ККТ («Штрих-М», «АТОЛ») при работе по ФФД 1.05 и выше налоговые таблицы кассы игнорируются, а фискальный признак полностью берется из переданного ПО тега 1199.
  2. Если используется старый режим прямого управления регистрацией через свойства драйвера Tax1–Tax4, убедимся, что при отсутствии налога в метод регистрации передается признак нулевого налога или параметр отключения начисления налога.

Что делать с чеками, уже отправленными с ошибкой в ОФД

Организации на спецрежимах не имеют права пробивать чеки со ставкой «НДС 0%». Ошибочно сформированные документы необходимо скорректировать в соответствии с форматом фискальных документов:

  1. В ФФД 1.05: пробивается чек с признаком «Возврат прихода» со всеми исходными (ошибочными) реквизитами, после чего пробивается корректный чек «Приход» с признаком «Без НДС».
  2. В ФФД 1.1 и 1.2: оформляется «Чек коррекции» с типом коррекции «Самостоятельно» и привязкой к фискальному признаку первичного чека.
← На главную