Как исправить ошибку «неверная длина кода» в теге 1162 при работе с маркировкой на кассах АТОЛ?

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

При работе с маркированной продукцией (например, шинами) на кассах АТОЛ программисты часто сталкиваются с ошибкой передачи кода маркировки в тег 1162. Ошибка «неверная длина кода» или сообщение о том, что параметр LIBFPTR_PARAM_MARKING_CODE не найден, обычно указывают на несовпадение версий драйвера, прошивки ККТ или нарушение формата передачи данных. Давайте разберем по шагам, как настроить корректную отправку маркировки.

Шаг 1: Проверка версий программного обеспечения

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

  1. Версия прошивки ККТ: Рекомендуется использовать версии 12-8541 и выше. Прошивки ниже 12-8400 могут некорректно обрабатывать современные требования системы «Честный ЗНАК».
  2. Драйвер ККТ: Это критический момент. Если вы используете версию драйвера ниже 10.8.1, библиотека не будет поддерживать константу LIBFPTR_PARAM_MARKING_CODE. Убедитесь, что на сервере, к которому подключена касса (особенно в терминальных сессиях), установлен актуальный драйвер 10.8.1 или выше.

Шаг 2: Правильное формирование кода маркировки

Разберем, почему простая передача строки приводит к ошибкам. Код маркировки в формате DataMatrix содержит специальные непечатные символы (разделители групп GS, код ASCII 29). Передача кода как обычной строки приводит к искажению данных. Чтобы избежать «обрезания» кода, необходимо преобразовать строку в массив байтов.

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


Функция ПреобразоватьВМассивБайт(Данные, РезультатСтрокой = Истина) Экспорт
    Если НЕ ЗначениеЗаполнено(СокрЛП(Данные)) Тогда
        Возврат "";
    КонецЕсли;    
    РезультатБайтами = "";
    
    ИмяВрФайла = ПолучитьИмяВременногоФайла("txt");
    Текст = Новый ТекстовыйДокумент();
    Текст.УстановитьТекст(Данные);
    Текст.Записать(ИмяВрФайла, КодировкаТекста.ANSI);
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВрФайла);
    
    Если РезультатСтрокой Тогда
        РезультатБайтами = Строка(ДвоичныеДанные);
    Иначе
        РезультатБайтами = ДвоичныеДанные;
    КонецЕсли;    
    
    УдалитьФайлы(ИмяВрФайла);
    Возврат РезультатБайтами;
КонецФункции

Шаг 3: Передача данных в драйвер ККТ

После подготовки данных необходимо передать их в драйвер через метод setParam. Важно использовать правильный идентификатор параметра. Рассмотрим, как это выглядит в коде 1С:


// Формируем структуру штрихкода из GTIN и серийного номера
ШтрихкодМаркировкиНовый = "01" + Структура.gtin + "21" + Структура.serial;

// Преобразуем в массив байтов
nomenclatureCode = ПреобразоватьВМассивБайт(ШтрихкодМаркировкиНовый);

// Передаем параметр в драйвер
Объект.Драйвер.setParam(Объект.Драйвер.LIBFPTR_PARAM_MARKING_CODE, nomenclatureCode);

Шаг 4: Указание признака маркировки в наименовании

Помимо передачи самого кода в тег 1162, необходимо уведомить кассу о том, что товар является маркированным. Для этого в наименование товара перед отправкой в ККТ необходимо добавить префикс [М].

Внимание: Будьте осторожны, чтобы не задвоить префикс. Проверьте вашу обработку обслуживания: часто логика добавления [М] уже встроена, и если добавить его вручную в коде, в чеке может отобразиться [М][М].

Заключение: почему данные не сразу видны в «Честном ЗНАКЕ»?

После пробития чека информация отправляется в ОФД, а затем ОФД передает её в систему маркировки. Не пугайтесь, если в личном кабинете ОФД вы видите «обрезанный» код или если данные в «Честном ЗНАКЕ» обновляются не мгновенно. Обычно процесс занимает от 3 до 60 минут. Если спустя час информация не появилась, проверьте, был ли в составе чека тег 1162, просмотрев печатную форму или лог драйвера.

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

← На главную