При работе с маркировкой товаров («Честный знак») программисты часто сталкиваются с ситуацией: считанный с упаковки код DataMatrix при попытке повторной генерации в 1С выглядит иначе. Визуальная «сетка» из черных и белых квадратов не совпадает с оригиналом, хотя сканер при этом считывает идентичную последовательность символов. В этой статье мы разберем, почему это происходит, является ли это ошибкой и как добиться максимально корректного формирования кода в 1С — для этого подойдёт печать этикеток DataMatrix для Честного знака.
Для начала проанализируем природу стандарта DataMatrix. В отличие от простых линейных штрихкодов, DataMatrix — это сложная двумерная структура, имеющая несколько уровней вариативности. Рассмотрим основные причины различий:
1CBarCode.dll, модуль для интеграции 1С с бесплатным сервисом генерации штрихкодов или типографское ПО) могут выбирать разные алгоритмы переключения между этими режимами для оптимизации размера кода.Одной из главных причин «непохожести» кода в 1С является неправильная обработка спецсимволов GS1. Рассмотрим подробнее ситуацию, когда автор пытается заменить разделители на скобки, например, (01)0460.... В стандарте GS1 DataMatrix скобки являются лишь визуальным представлением для человека. Внутри самого кода должны стоять непечатные управляющие символы.
Для корректной работы сканеров и систем мониторинга важны два элемента:
Если вы просто передаете строку со скобками в компоненту, она может воспринять их как обычный текст, и рисунок будет отличаться от оригинала, где скобок нет, но есть скрытые разделители.
Разберем по шагам, как правильно передать данные в компоненту «Печать штрихкодов» из состава Библиотеки стандартных подсистем (БСП). Выясним причину, по которой стандартная передача строки не всегда дает нужный результат.
Во-первых, необходимо проверить свойство ТипКода. В 1С для DataMatrix обычно используются следующие значения:
16 — обычный DataMatrix.24 — GS1 DataMatrix (именно этот тип рекомендуется для маркировки).Проанализируем пример формирования параметров для компоненты:
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 300);
ПараметрыШтрихкода.Вставить("Высота", 300);
ПараметрыШтрихкода.Вставить("ТипКода", 24); // GS1 DataMatrix
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("Текст", СтрокаКодаМаркировки);
Важный нюанс: Компонента БСП при типе кода 24 ожидает, что разделители будут указаны либо специальным образом, либо строка будет содержать символы GS. Рассмотрим, как вставить символ разделителя программно:
Разделитель = Символ(29); // ASCII код GS
СтрокаДляГенерации = "01" + GTIN + "21" + СерийныйНомер + Разделитель + "91" + КлючПроверки + Разделитель + "92" + Криптохвост;
Обратите внимание, что если компонента последней версии, она может корректно обрабатывать скобки, но только если они обрамляют идентификаторы применения (AI). Однако наиболее надежным способом считается использование прямого кода символа 29.
Посмотрим на ситуацию со стороны законодательства и требований системы «Честный знак». Важно помнить, что хранение полного кода маркировки вместе с криптохвостом (ключом проверки) в базе данных 1С является нарушением для некоторых категорий товаров. Предполагается, что код печатается один раз производителем или при перемаркировке.
Если же вам все же необходимо перепечатать существующий код (например, из-за повреждения этикетки), для чего пригодится проверка и инициализация локального модуля, и поставщики отказываются принимать товар из-за «другого вида» кода, выполните следующие действия:
В некоторых случаях компонента печати может искажать спецсимволы при передаче обычной строки. Для решения этой проблемы рассмотрим вариант передачи данных через Base64. Это гарантирует, что двоичные данные (включая непечатные символы) дойдут до генератора в неизменном виде.
// Пример подготовки данных в Base64 (зависит от версии компоненты)
ДвоичныеДанныеКода = ПолучитьДвоичныеДанныеИзСтроки(СтрокаДляГенерации, КодировкаТекста.UTF8, Ложь);
ПараметрыШтрихкода.Вставить("Текст", Base64Строка(ДвоичныеДанныеКода));
Подводя итог, отметим: визуальное несовпадение точек в DataMatrix — это нормальное явление, обусловленное гибкостью стандарта. Основная задача программиста 1С — обеспечить наличие символа FNC1 в начале и правильное разделение групп данных символом GS (ASCII 29). Если эти условия соблюдены и сканер считывает верную строку, код считается валидным, а претензии к «внешнему виду» можно считать необоснованными с технической точки зрения.