При работе с маркированной продукцией (например, шинами) на кассах АТОЛ программисты часто сталкиваются с ошибкой передачи кода маркировки в тег 1162. Ошибка «неверная длина кода» или сообщение о том, что параметр LIBFPTR_PARAM_MARKING_CODE не найден, обычно указывают на несовпадение версий драйвера, прошивки ККТ или нарушение формата передачи данных. Давайте разберем по шагам, как настроить корректную отправку маркировки.
Первым делом проанализируем текущую конфигурацию оборудования. Для корректной работы с маркировкой в 1С необходимо обеспечить следующие условия:
12-8541 и выше. Прошивки ниже 12-8400 могут некорректно обрабатывать современные требования системы «Честный ЗНАК».10.8.1, библиотека не будет поддерживать константу LIBFPTR_PARAM_MARKING_CODE. Убедитесь, что на сервере, к которому подключена касса (особенно в терминальных сессиях), установлен актуальный драйвер 10.8.1 или выше.Разберем, почему простая передача строки приводит к ошибкам. Код маркировки в формате DataMatrix содержит специальные непечатные символы (разделители групп GS, код ASCII 29). Передача кода как обычной строки приводит к искажению данных. Чтобы избежать «обрезания» кода, необходимо преобразовать строку в массив байтов.
Рассмотрим пример функции, которая корректно преобразует строку маркировки для передачи в драйвер:
Функция ПреобразоватьВМассивБайт(Данные, РезультатСтрокой = Истина) Экспорт
Если НЕ ЗначениеЗаполнено(СокрЛП(Данные)) Тогда
Возврат "";
КонецЕсли;
РезультатБайтами = "";
ИмяВрФайла = ПолучитьИмяВременногоФайла("txt");
Текст = Новый ТекстовыйДокумент();
Текст.УстановитьТекст(Данные);
Текст.Записать(ИмяВрФайла, КодировкаТекста.ANSI);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВрФайла);
Если РезультатСтрокой Тогда
РезультатБайтами = Строка(ДвоичныеДанные);
Иначе
РезультатБайтами = ДвоичныеДанные;
КонецЕсли;
УдалитьФайлы(ИмяВрФайла);
Возврат РезультатБайтами;
КонецФункции
После подготовки данных необходимо передать их в драйвер через метод setParam. Важно использовать правильный идентификатор параметра. Рассмотрим, как это выглядит в коде 1С:
// Формируем структуру штрихкода из GTIN и серийного номера
ШтрихкодМаркировкиНовый = "01" + Структура.gtin + "21" + Структура.serial;
// Преобразуем в массив байтов
nomenclatureCode = ПреобразоватьВМассивБайт(ШтрихкодМаркировкиНовый);
// Передаем параметр в драйвер
Объект.Драйвер.setParam(Объект.Драйвер.LIBFPTR_PARAM_MARKING_CODE, nomenclatureCode);
Помимо передачи самого кода в тег 1162, необходимо уведомить кассу о том, что товар является маркированным. Для этого в наименование товара перед отправкой в ККТ необходимо добавить префикс [М].
Внимание: Будьте осторожны, чтобы не задвоить префикс. Проверьте вашу обработку обслуживания: часто логика добавления [М] уже встроена, и если добавить его вручную в коде, в чеке может отобразиться [М][М].
После пробития чека информация отправляется в ОФД, а затем ОФД передает её в систему маркировки. Не пугайтесь, если в личном кабинете ОФД вы видите «обрезанный» код или если данные в «Честном ЗНАКЕ» обновляются не мгновенно. Обычно процесс занимает от 3 до 60 минут. Если спустя час информация не появилась, проверьте, был ли в составе чека тег 1162, просмотрев печатную форму или лог драйвера.
Соблюдение этих рекомендаций позволит вам избежать распространенных ошибок и обеспечить корректную передачу данных в фискальный накопитель и систему маркировки.