Передача сведений о маркированных товарах в систему «Честный ЗНАК» через контрольно-кассовую технику требует строгого соблюдения формата данных. Одной из наиболее частых проблем, с которой сталкиваются разработчики при интеграции 1С с драйверами АТОЛ 10-й серии, является ошибка «GTIN не число» при попытке передать тег 1162. В этой статье мы подробно разберем, как правильно сформировать структуру кода товара, какие методы использовать в 1С для подготовки данных и как настроить оборудование, чтобы в чеке корректно отображался признак маркировки [М].
Разберем ситуацию, когда при передаче XML-пакета в драйвер возникает ошибка валидации GTIN. Проблема обычно кроется в том, что драйвер ожидает не просто текстовую строку, которую мы видим в DataMatrix, а специальным образом упакованный двоичный массив, приведенный к формату Base64. Если передать в атрибут MarkingCode простую HEX-строку или необработанный серийный номер, парсер драйвера не сможет выделить 14-значный идентификатор GTIN и вернет ошибку.
Проанализируем структуру тега 1162. Для большинства потребительских товаров (кроме меховых изделий) он должен начинаться с идентификатора типа маркировки 44 4D (что в кодировке ASCII соответствует символам "DM" — DataMatrix). Далее должны следовать данные самого кода. Если мы передаем данные «как есть», драйвер пытается интерпретировать их по стандартному алгоритму и, не находя числовой последовательности GTIN в нужном месте, выдает ошибку.
Рассмотрим по шагам, как подготовить данные в среде 1С для корректной передачи в драйвер. Нам необходимо собрать последовательность байтов, включающую префикс, GTIN и серийный номер, а затем преобразовать всё это в строку Base64. Ниже представлен пример кода, который успешно применяется в типовых решениях (например, УТ 10.3) для подготовки данных.
// Устанавливаем префикс для DataMatrix (44 4D в HEX соответствует числу 17485)
Префикс = 17485;
// Создаем поток в памяти для формирования бинарных данных
Тело = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(Тело);
// Записываем GTIN. Важно: GTIN должен быть числом и иметь 14 знаков
// Если ваш GTIN короче, дополните его ведущими нулями перед преобразованием
ЗаписьДанных.ЗаписатьЦелое64(Число(GTIN), ПорядокБайтов.BigEndian);
// Если есть серийный номер, добавляем его в поток после GTIN
Если Не ПустаяСтрока(СерийныйНомер) Тогда
ЗаписьДанных.ЗаписатьСимволы(СерийныйНомер);
КонецЕсли;
ЗаписьДанных.Закрыть();
// Переходим в начало потока, чтобы дописать префикс в начало массива
Тело.Перейти(0, ПозицияВПотоке.Начало);
ЗаписьДанных = Новый ЗаписьДанных(Тело);
ЗаписьДанных.ЗаписатьЦелое16(Префикс, ПорядокБайтов.BigEndian);
ЗаписьДанных.Закрыть();
// Получаем итоговые двоичные данные и переводим в Base64
СтрокаМаркировкиHEX = Тело.ЗакрытьИПолучитьДвоичныеДанные();
СтрокаМаркировкиBase64 = Base64Строка(СтрокаМаркировкиHEX);
Выясним причину использования ПорядокБайтов.BigEndian. Протоколы передачи фискальных данных требуют строгого порядка следования байтов (от старшего к младшему). Если использовать стандартный порядок, принятый в Windows (LittleEndian), ККТ не сможет распознать GTIN, так как байты будут перепутаны местами.
В современных версиях драйвера АТОЛ 10.6.2.0 и выше передачу можно осуществлять через XML-структуру GoodCodeData. Однако стоит помнить, что при формировании XML атрибут MarkingCode должен содержать именно ту Base64 строку, которую мы получили выше. При этом важно убедиться, что ваша компонента 1С (БПО) поддерживает ревизию не ниже 3002, иначе поле маркировки может просто игнорироваться при печати чека.
Рассмотрим альтернативный способ передачи параметров напрямую через объект драйвера Fptr, если вы используете низкоуровневое программирование:
// Пример передачи через метод setParam
Fptr.setParam(1162, "Строка_в_формате_Base64_с_хвостом_==");
Fptr.utilFormTlv();
Fptr.setParam(Fptr.LIBFPTR_PARAM_MARKING_CODE, Fptr.getParamByteArray(Fptr.LIBFPTR_PARAM_TAG_VALUE));
Fptr.registration();
Обратите внимание на упоминание "специального хвоста ==". В формате Base64 эти символы являются заполнителями (padding) и обязательны для корректного декодирования байтового массива на стороне драйвера ККТ. Если ваша функция Base64Строка возвращает строку без них, это может стать причиной отказа оборудования принимать код.
Иногда даже идеально сформированный код не приводит к появлению буквы [М] в чеке. Выясним ситуацию: часто в справочнике «Торговое оборудование» в 1С сохраняются настройки старой версии драйвера (например, 10.5.0.0), хотя в системе уже установлен новый драйвер 10.6.2.0. Это происходит из-за особенностей кэширования настроек подключения.
Выполним следующие шаги для исправления:
fptr10.log). Там должна фигурировать версия 10.6.2.0 или выше.После пересоздания объекта оборудования 1С начнет использовать обновленные методы передачи тегов, специфичные для новых версий драйвера. Проанализируем результат: в логах при печати чека должна появиться команда registration с заполненным объектом маркировки, а в личном кабинете ОФД в электронном чеке отобразятся HEX данные кода и корректно расшифрованные GTIN с серийным номером.
Важно помнить, что тег 1162 является базовым для форматов фискальных данных 1.05 и 1.1. Если ваша организация перешла на ФФД 1.2, механизм работы с маркировкой меняется. Вместо передачи GoodCodeData (тег 1162), драйвер начинает работать с тегами группы 2000 и выше. Однако драйвер АТОЛ 10.6.x умеет самостоятельно конвертировать данные из «старого» формата тега 1162 в новый формат для ФФД 1.2, если код маркировки передан как Base64 массив. Это обеспечивает обратную совместимость программного кода 1С с новыми требованиями законодательства.
Резюмируем: для успешной передачи маркировки необходимо собрать массив из префикса 0x44 0x4D, 14 байт GTIN (BigEndian) и символов серийного номера, после чего передать его в драйвер в кодировке Base64, убедившись в использовании актуальной версии драйвера в настройках оборудования 1С.