Ошибка 420 (код 2108) при передаче чеков в ФНС: как исправить текущие продажи и оформить коррекцию?

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

С ноября 2023 года многие пользователи ККТ, работающие по формату фискальных данных (ФФД) 1.2, столкнулись с массовым отказом в приеме чеков со стороны ФНС. В личном кабинете ОФД такие чеки имеют статус «Отказ в приеме» с кодом ошибки 420 и пояснением: Отсутствует обязательный тег 2108 («мера количества предмета расчета»).

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

Суть проблемы и требования ФФД 1.2

Ранее ФНС принимала чеки без тега 2108 или с его некорректным заполнением, выдавая лишь предупреждение. Однако с 09.11.2023 были включены жесткие проверки на стороне АСК ККТ. Согласно ФФД 1.2, тег 2108 (MeasureOfQuantity) является обязательным. Он принимает числовые значения, например:

Проблема возникает, когда кассовое ПО (1С) или драйвер ККТ не передают этот тег в сформированном XML-пакете для фискализации.

Часть 1. Настройка для корректной отправки новых чеков

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

1. Обновление драйвера ККТ (для устаревших конфигураций 1С может потребоваться обработка обслуживания для ДТО 10)

Практика показывает, что старые версии драйверов (например, Атол 10.9.x) могут некорректно обрабатывать XML-команды от 1С в части новых тегов. Необходимо обновить драйвер ККТ до актуальной версии (рекомендуется 10.10.0.0 и выше).

2. Обновление драйвера в 1С и создание нового экземпляра оборудования

Просто установить драйвер в Windows недостаточно. В самой 1С необходимо:

  1. Перейти в раздел «Подключаемое оборудование».
  2. Добавить новый драйвер из состава дистрибутива (если он не обновился автоматически).
  3. Создать новый экземпляр оборудования. Это критически важный шаг. Старые настройки могут использовать устаревшие обработки обслуживания, которые не поддерживают передачу тега 2108.
  4. В настройках нового экземпляра выберите драйвер: АТОЛ:ККТ с передачей данных в ОФД 10.Х (ФФД 1.2).
  5. Убедитесь, что смена на старом экземпляре закрыта, и откройте смену уже на новом оборудовании.

3. Проверка справочника «Единицы измерения»

Одной из неочевидных причин ошибки является некорректное сопоставление кодов единиц измерения. В 1С (особенно в конфигурациях УНФ и Розница) код единицы измерения по ОКЕИ для штук — 796. Драйвер ККТ должен преобразовать его в значение тега 0.

Мы выяснили, что часто проблема кроется в лишнем пробеле в коде единицы измерения. Например, в базе записано "796 " (с пробелом на конце). Из-за этого механизм сопоставления (mapping) не срабатывает, и тег не заполняется. Проверьте классификатор и удалите лишние пробелы.

4. Проверка кода на наличие условий по ревизии интерфейса

В некоторых конфигурациях 1С заполнение тега 2108 обернуто в условие проверки версии драйвера (РевизияИнтерфейса). Например:


Если ПараметрыФискализации.РевизияИнтерфейса >= 3004 Тогда
    // Заполнение тега
КонецЕсли;

После обновления драйвера и компоненты интеграции значение РевизияИнтерфейса должно стать 3004 или выше (иногда 4000 и т.д.). Если обновление драйвера выполнено корректно, это условие начнет выполняться автоматически.

Часть 2. Исправление непринятых чеков (Чеки коррекции)

Самая сложная часть задачи — исправить чеки, которые получили статус «Отказ в приеме». Согласно разъяснениям ФНС:

  1. Непринятый чек юридически не существует для налоговой.
  2. Следовательно, делать чек «Возврат прихода» не нужно (так как прихода не было).
  3. Необходимо сформировать Кассовый чек коррекции с признаком расчета Приход.
  4. В чеке коррекции нужно указать дату совершения нарушения (дата оригинальной покупки).

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

Рассмотрим программное решение для формирования корректного XML-пакета чека коррекции. Ниже приведен код процедуры формирования пакета, адаптированный для ручной передачи тега MeasureOfQuantity.

Формирование XML пакета для фискализации

В общем модуле, отвечающем за работу с оборудованием (например, МенеджерОборудованияВызовСервера или аналогичном для вашей конфигурации), необходимо скорректировать процедуру формирования XML. Основное внимание уделим блоку записи позиций (FiscalString).


// Фрагмент процедуры СформироватьXMLПакетДляФискализацияЧека
// ... (начало процедуры и общие параметры заголовка CheckPackage)

// Цикл по позициям чека
Для ИндексМассива = 0 По ОбщиеПараметры.ПозицииЧека.Количество - 1 Цикл
    ТекущаяПозиция = ОбщиеПараметры.ПозицииЧека[ИндексМассива];
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
    
    // ... (запись стандартных атрибутов: Name, Quantity, Price, Amount, Tax и т.д.)

    // БЛОК ЗАПОЛНЕНИЯ ТЕГА 2108 (MeasureOfQuantity)
    // Проверяем, поддерживается ли ФФД 1.2 и нужная ревизия интерфейса
    Если ПараметрыФискализации.РевизияИнтерфейса >= 3004 Тогда
        
        // Обработка маркировки (если есть)
        Если Не ПустаяСтрока(ТекущаяПозиция.КонтрольнаяМарка) Тогда
            ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ТекущаяПозиция.КонтрольнаяМарка));
        КонецЕсли;

        // Определение меры количества
        МераКоличестваПредметаРасчета = 0; // Значение по умолчанию (Штуки)
        
        Если Не ПустаяСтрока(ТекущаяПозиция.КодЕдиницыИзмерения) Тогда
             // Получаем меру по коду из справочника (если реализовано)
             // Или используем жесткое соответствие, если у вас только штучный товар
             // 0 - шт, 10 - г, 11 - кг
             
             // Пример прямой установки для штук, чтобы избежать ошибок маппинга:
             МераКоличестваПредметаРасчета = 0; 
        КонецЕсли;

        // Принудительная запись тега 2108
        ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));

    КонецЕсли;

    // ... (запись остальных данных позиции и закрытие элемента FiscalString)
    ЗаписьXML.ЗаписатьКонецЭлемента; 

КонецЦикла;
// ... (завершение пакета)

Этот код позволяет принудительно передать MeasureOfQuantity = 0, что удовлетворит требования ФНС для штучного товара.

Часть 3. Коррекция чеков с маркировкой

Особую сложность вызывает коррекция чеков с маркированным товаром. Поскольку оригинальный чек (хоть и не принятый ФНС) прошел через ОФД в «Честный Знак», коды маркировки могут числиться выбывшими. При попытке пробить чек коррекции ККТ может выдать ошибку проверки марки (так как она уже продана).

Чтобы обойти эту проблему, необходимо при формировании запроса к КМ (Коду Маркировки) указать планируемый статус товара, который не требует повторного списания (например, статус «не изменился»).

Для этого модифицируем функцию формирования XML для запроса КМ:


Функция СформироватьXMLДляЗапросаКМ(ПараметрыОперации) Экспорт
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку("UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML;
    ЗаписьXML.ЗаписатьНачалоЭлемента("RequestKM");
    
    // ... (запись GUID)

    // Если марка уже выбыла, нам не нужно ждать ответа от ОИСМ или мы игнорируем ошибку
    Если Не ПараметрыОперации.ОжидатьПолучениеОтветаОИСМ Тогда
        ЗаписьXML.ЗаписатьАтрибут("WaitForResult", "False");
    КонецЕсли;

    ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ПараметрыОперации.КонтрольнаяМарка));

    // ВАЖНО: Установка статуса 255 (Статус не изменился) или иного, 
    // чтобы пройти проверку на ККТ без ошибки "Марка выбыла"
    // Код 255 часто используется для таких ситуаций
    ПланируемыйСтатусТовара = 255; 
    ЗаписьXML.ЗаписатьАтрибут("PlannedStatus", XMLСтрока(ПланируемыйСтатусТовара));

    // Для статусов 2 или 4 (реализация) обязательно нужны теги количества
    // Для статуса 255 они могут быть необязательны, но лучше проверить документацию к драйверу
    // Если требуется, добавляем тег 2108 и сюда:
    
    МераКоличестваПредметаРасчета = 0; // Штуки
    ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));
    
    ЗаписьXML.ЗаписатьКонецЭлемента;
    
    Возврат ЗаписьXML.Закрыть();
КонецФункции

Алгоритм действий при коррекции маркировки:

  1. Мы инициируем проверку марки на ККТ с планируемым статусом 255.
  2. ККТ обращается к ФН/ОИСМ.
  3. Получаем ответ (пусть даже с предупреждением, но не блокирующей ошибкой, так как мы не пытаемся её снова продать как новую).
  4. Формируем чек коррекции, включающий эту марку и тег 2108.
  5. Фискализируем чек.

При таком подходе в ФНС уйдет корректный чек с заполненным реквизитом маркировки, что позволит связать продажу с данными «Честного Знака», но при этом не вызовет дублирования выбытия в системе маркировки.

Резюме

Для исправления ошибки 420 (код 2108) необходимо действовать в два этапа:

  1. Предотвращение: Обновите драйверы АТОЛ до ветки 10.10.x, создайте заново экземпляр оборудования в 1С, выбрав обработчик ФФД 1.2, и проверьте коды единиц измерения на наличие лишних символов.
  2. Исправление: Сформируйте чеки коррекции «Приход» (без возврата). Для автоматизации этого процесса и гарантированной передачи тега 2108 и данных маркировки рекомендуется использовать программную доработку процедур формирования XML-пакетов, приведенную выше.
← На главную