Почему сгенерированный DataMatrix в 1С визуально отличается от оригинала и как это исправить

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

При работе с маркировкой товаров («Честный знак») программисты часто сталкиваются с ситуацией: считанный с упаковки код DataMatrix при попытке повторной генерации в 1С выглядит иначе. Визуальная «сетка» из черных и белых квадратов не совпадает с оригиналом, хотя сканер при этом считывает идентичную последовательность символов. В этой статье мы разберем, почему это происходит, является ли это ошибкой и как добиться максимально корректного формирования кода в 1С — для этого подойдёт печать этикеток DataMatrix для Честного знака.

Почему визуальный рисунок может не совпадать

Для начала проанализируем природу стандарта DataMatrix. В отличие от простых линейных штрихкодов, DataMatrix — это сложная двумерная структура, имеющая несколько уровней вариативности. Рассмотрим основные причины различий:

  1. Избыточность и коррекция ошибок (ECC 200): Стандарт DataMatrix использует алгоритм Рида-Соломона для исправления ошибок. Это позволяет считать код, даже если он поврежден на 30%. Однако разные библиотеки генерации могут использовать разные стратегии заполнения свободных модулей (квадратиков) данными для коррекции, что меняет рисунок.
  2. Режимы кодирования (Encoding Modes): Внутри одного кода данные могут быть упакованы в разных режимах: ASCII, C40, Text или Base256. Разные компоненты (например, стандартная компонента 1С 1CBarCode.dll, модуль для интеграции 1С с бесплатным сервисом генерации штрихкодов или типографское ПО) могут выбирать разные алгоритмы переключения между этими режимами для оптимизации размера кода.
  3. Размер символа: Код может иметь разную размерность (например, 22x22 или 24x24 модулей). Даже если объем данных позволяет уместить их в меньший квадрат, настройка «Автоматический выбор размера» в компоненте может выбрать сетку покрупнее, что полностью изменит расположение точек.

Специфика GS1 и управляющие символы

Одной из главных причин «непохожести» кода в 1С является неправильная обработка спецсимволов GS1. Рассмотрим подробнее ситуацию, когда автор пытается заменить разделители на скобки, например, (01)0460.... В стандарте GS1 DataMatrix скобки являются лишь визуальным представлением для человека. Внутри самого кода должны стоять непечатные управляющие символы.

Для корректной работы сканеров и систем мониторинга важны два элемента:

Если вы просто передаете строку со скобками в компоненту, она может воспринять их как обычный текст, и рисунок будет отличаться от оригинала, где скобок нет, но есть скрытые разделители.

Настройка генерации в 1С (через БСП)

Разберем по шагам, как правильно передать данные в компоненту «Печать штрихкодов» из состава Библиотеки стандартных подсистем (БСП). Выясним причину, по которой стандартная передача строки не всегда дает нужный результат.

Во-первых, необходимо проверить свойство ТипКода. В 1С для DataMatrix обычно используются следующие значения:

Проанализируем пример формирования параметров для компоненты:


ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 300);
ПараметрыШтрихкода.Вставить("Высота", 300);
ПараметрыШтрихкода.Вставить("ТипКода", 24); // GS1 DataMatrix
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("Текст", СтрокаКодаМаркировки);

Важный нюанс: Компонента БСП при типе кода 24 ожидает, что разделители будут указаны либо специальным образом, либо строка будет содержать символы GS. Рассмотрим, как вставить символ разделителя программно:


Разделитель = Символ(29); // ASCII код GS
СтрокаДляГенерации = "01" + GTIN + "21" + СерийныйНомер + Разделитель + "91" + КлючПроверки + Разделитель + "92" + Криптохвост;

Обратите внимание, что если компонента последней версии, она может корректно обрабатывать скобки, но только если они обрамляют идентификаторы применения (AI). Однако наиболее надежным способом считается использование прямого кода символа 29.

Проблема криптохвоста и верификации

Посмотрим на ситуацию со стороны законодательства и требований системы «Честный знак». Важно помнить, что хранение полного кода маркировки вместе с криптохвостом (ключом проверки) в базе данных 1С является нарушением для некоторых категорий товаров. Предполагается, что код печатается один раз производителем или при перемаркировке.

Если же вам все же необходимо перепечатать существующий код (например, из-за повреждения этикетки), для чего пригодится проверка и инициализация локального модуля, и поставщики отказываются принимать товар из-за «другого вида» кода, выполните следующие действия:

  1. Проверьте валидатором: Используйте мобильное приложение «Честный знак», запрос информации кодов Честного знака или специализированные верификаторы — есть инструмент верификации и декодирования DataMatrix. Если приложение распознает код как корректный и выдает статус «Проверен», визуальное отличие рисунка не является техническим браком.
  2. Сравните содержимое: Считайте оригинальный код и ваш новый код сканером в режиме эмуляции клавиатуры (в текстовый редактор). Если наборы символов идентичны (включая регистр букв в криптохвосте), значит, функционально коды эквивалентны.
  3. Настройте плотность печати: Иногда визуальное отличие вызвано разрешением принтера. В специфических случаях, например, когда выполняется проверка кода маркировки шин, важно также соответствие физических параметров этикетки требованиям ГИС МТ.

Использование Base64 для передачи данных

В некоторых случаях компонента печати может искажать спецсимволы при передаче обычной строки. Для решения этой проблемы рассмотрим вариант передачи данных через Base64. Это гарантирует, что двоичные данные (включая непечатные символы) дойдут до генератора в неизменном виде.


// Пример подготовки данных в Base64 (зависит от версии компоненты)
ДвоичныеДанныеКода = ПолучитьДвоичныеДанныеИзСтроки(СтрокаДляГенерации, КодировкаТекста.UTF8, Ложь);
ПараметрыШтрихкода.Вставить("Текст", Base64Строка(ДвоичныеДанныеКода));

Подводя итог, отметим: визуальное несовпадение точек в DataMatrix — это нормальное явление, обусловленное гибкостью стандарта. Основная задача программиста 1С — обеспечить наличие символа FNC1 в начале и правильное разделение групп данных символом GS (ASCII 29). Если эти условия соблюдены и сканер считывает верную строку, код считается валидным, а претензии к «внешнему виду» можно считать необоснованными с технической точки зрения.

← На главную