При работе с системой маркировки «Честный Знак» технические специалисты часто сталкиваются с ситуацией, когда код маркировки содержит специфические символы. Одной из наиболее коварных проблем является наличие круглых скобок в составе серийного номера, например, комбинации (43) или аналогичных. В этой статье мы подробно разберем, почему нативная компонента 1С для печати штрихкодов выдает ошибку Invalid barcode, и как реализовать надежное решение этой задачи, что особенно актуально, когда требуется печать кодов маркировки с порядковыми номерами или их повторная печать.
Для начала проанализируем ситуацию. Стандарт GS1 DataMatrix предполагает использование идентификаторов применения (AI), которые в человекочитаемом виде (HRI — Human Readable Interpretation) заключаются в круглые скобки. Например, (01) обозначает GTIN, а (21) — серийный номер. Однако сами скобки не должны кодироваться непосредственно в матрицу штрихкода; как подробно описано в стандарте GS1 DataMatrix, вместо них используются специальные управляющие символы, такие как FNC1.
Проблема заключается в том, что нативная компонента 1С при передаче ей строки со скобками пытается самостоятельно «распарсить» её. Если в середине серийного номера (блок после AI 21) встречается сочетание цифр в скобках, например (43), парсер компоненты ошибочно полагает, что серийный номер закончился, и началась новая секция с идентификатором применения 43. Поскольку данные после этого «мнимого» идентификатора часто не соответствуют ожидаемому формату GS1, компонента ломается и выдает Invalid barcode или генерирует некорректный штрихкод, который не считывается сканером или не проходит проверку в приложении «Честный Знак».
Рассмотрим подробнее механизмы работы компоненты печати штрихкодов. В современных конфигурациях 1С (таких как УТ 11, ERP 2.5, КА 2.5) используется нативная компонента, которая поддерживает несколько типов входящих данных. Проанализируем два основных режима:
(01)04630047439349(21)50(43)NVSSk;>.... Компонента пытается сама найти скобки и преобразовать их в спецсимволы. Именно здесь происходит сбой.Как показывают практические тесты, даже новые версии компоненты (например, 9.0.12.8 и выше) могут некорректно обрабатывать сложные строки в режиме 0. Поэтому единственным стабильным решением является использование режима Base64.
Посмотрим на пример реализации. Чтобы компонента не пыталась интерпретировать скобки внутри данных, нам необходимо подготовить «чистую» строку, в которой вместо скобок в начале идентификаторов стоят правильные префиксы, а затем перевести эту строку в формат Base64. Это критически важно, когда выполняется печать кодов маркировки с полным криптохвостом из заказа на эмиссию. При этом важно указать компоненте, что на вход подан именно Base64-поток.
Проанализируем программный код, который решает эту задачу. Программное формирование кодов маркировки требует установки свойства ТипВходящихДанных в значение 1. Рассмотрим пример формирования параметров для компоненты:
// Пример подготовки параметров для печати штрихкода
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("ТипКода", 24); // Тип 24 соответствует GS1 DataMatrix
ПараметрыШтрихкода.Вставить("ТипВходящихДанных", 1); // Указываем, что передаем Base64
// Исходный код маркировки (полный код с криптохвостом)
СтрокаКМ = "01046300474393492150(43)NVSSk;>91EE0992WVKP3Bv...";
// Преобразуем строку в двоичные данные, учитывая разделители GS (символ с кодом 29)
// В данном случае мы предполагаем, что строка уже правильно сформирована
ДвоичныеДанныеКМ = ПолучитьBase64СтрокуИзДвоичныхДанных(УправлениеМаркировкой.ПреобразоватьКодДляКомпоненты(СтрокаКМ));
ПараметрыШтрихкода.Вставить("Сообщение", ДвоичныеДанныеКМ);
Важный момент: При использовании ТипВходящихДанных = 1 компонента ожидает, что в начале строки Base64 уже может содержаться признак FNC1, либо она добавит его сама в зависимости от настройки ТипКода = 24. Для GS1 DataMatrix это критически важно, так как без первого символа FNC1 штрихкод превратится в обычный DataMatrix, который не является кодом маркировки.
Рассмотрим подробнее, как должна выглядеть строка перед кодированием в Base64. Разберем ситуацию на примере из практики пользователей. Если у нас есть код, где внутри серийного номера присутствуют скобки, мы должны убедиться, что они воспринимаются как текст, а не как команды парсера. Это часто требуется, когда необходимо выполнить печать кода маркировки непосредственно при его считывании сканером.
Проанализируем ситуацию: если мы передаем строку в Base64, компонента перестает искать скобки и просто кодирует байты «как есть». Это позволяет сохранить (43) внутри серийного номера без искажений. Однако помните, что по стандартам GS1, если после серийного номера (AI 21) следуют другие AI (например, 91 или 92), они должны отделяться символом-разделителем GS (Group Separator, ASCII 29).
Ниже приведен пример функции, которая помогает подготовить данные (упрощенная логика):
Функция ПодготовитьДанныеДляКомпоненты(Знач ИсходныйКМ) Экспорт
// Убираем лишние скобки в начале AI, если мы формируем "сырые" данные
// Заменяем их на стандартную последовательность согласно ISO
// В режиме Base64 для GS1 DataMatrix компонента 1С ожидает
// определенную последовательность байтов.
Результат = "";
// Логика преобразования:
// 01 + [GTIN] + 21 + [Serial] + <GS> + 91 + [Криптоключ] + <GS> + 92 + [Криптохвост]
// Символ <GS> имеет код Символ(29)
// ... здесь должен быть код парсинга ИсходныйКМ ...
Возврат Результат;
КонецФункции
Проанализируем еще один важный аспект — версию самой нативной компоненты 1CBarCode. Как было отмечено в ходе обсуждения проблемы, старые версии (например, из состава БПО 2.1 и ниже) имеют жестко зашитые ограничения на символы. Выясним, как проверить текущую версию. Для этого необходимо извлечь файл компоненты из макета конфигурации и посмотреть свойства файла или сопутствующий manifest.xml.
Если ваша версия ниже 9.0.12.x, крайне рекомендуется выполнить обновление и настройку компоненты печати штрихкодов, например, в рамках обновления Библиотеки Стандартных Подсистем (БПО). В новых релизах (версии 10.x и выше) значительно улучшена работа с GS1 DataMatrix и расширена поддержка спецсимволов.
Подведем итог нашему исследованию. Если вы столкнулись с ошибкой Invalid barcode при наличии скобок в коде маркировки, выполните следующие действия:
1C:Печать штрихкодов (не ниже 9.0.12).Base64-строки.ТипВходящихДанных = 1 в объекте компоненты перед вызовом метода печати.Base64, структура данных (AI 01, AI 21 и т.д.) должна соответствовать стандарту, а блоки переменной длины должны завершаться символом GS (код 29).Соблюдение этих правил позволит вам корректно печатать коды маркировки любой сложности. Если ваша задача — оперативно подготовить этикетки для маркетплейсов, вы можете использовать дубликатор кодов маркировки DataMatrix для WB и Ozon, который корректно работает с любыми КИЗами и автоматически проверяет их статус. Это обеспечит стопроцентную считываемость и валидность штрихкодов в системе «Честный Знак».