При реализации задач по маркировке товаров в системе 1С программисты часто сталкиваются с проблемой: сформированный в печатной форме код визуально похож на оригинал, но напрочь отказывается считываться приложением Честный Знак или промышленными сканерами. В этой статье мы подробно разберем, как правильно сформировать двухмерный штрихкод стандарта DataMatrix (в этом поможет генератор кодов Data Matrix непосредственно в 1С), какие параметры использовать и как избежать типичных ошибок с управляющими символами.
Первое, на что мы должны обратить внимание — это терминология. Несмотря на то, что многие пользователи называют код маркировки «QR-кодом», технически это GS1 DataMatrix. В отличие от обычного QR-кода, который часто используется для ссылок, DataMatrix позволяет упаковать большой объем информации в очень компактный квадрат. Рассмотрим основные отличия, важные для реализации в 1С:
FNC1, который сообщает сканеру, что перед ним именно код стандарта GS1.Проанализируем доступные инструменты в среде 1С для генерации таких кодов. Как правило, у разработчика есть два основных пути:
Если мы используем типовые конфигурации (УТ 11, КА 2, ERP, Бухгалтерия 3), лучше всего обратиться к функционалу модуля МенеджерОборудованияВызовСервера. Это особенно важно, когда в системе настроено создание номенклатуры по данным контрагента через ЭДО с автоматическим определением вида маркировки.
При формировании структуры ПараметрыШтрихкода крайне важно правильно указать тип кода. Рассмотрим пример настройки для компоненты печати:
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("ТипВходныхДанных", 0); // Данные передаются как строка
ПараметрыШтрихкода.Вставить("ТипКода", 24); // 24 соответствует стандарту DataMatrix GS1
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("УголПоворота", 0);
Обратите внимание на значение 24 для параметра ТипКода. Если установить тип 18 (обычный DataMatrix), система «Честный Знак» может не распознать код. Для автоматизации процесса часто используется печать кодов маркировки Честного знака с порядковыми номерами — для этого подойдёт обработка автоматической печати кодов Честного Знака на принтерах этикеток.
Выясним причину, по которой обычное копирование строки КИЗ (Кода Идентификации Заказа) в штрихкод не работает. Код маркировки содержит так называемый «криптохвост» (ключ проверки и код проверки). Чтобы сканер понял, где заканчивается серийный номер и начинается проверочная часть, используются разделители группы — символ GS (Group Separator), код ASCII 29.
В языке 1С этот символ получается функцией Символ(29). Проанализируем правильный алгоритм сборки строки для вывода на печать:
// Определяем символ-разделитель
СимволFNC1 = Символ(29);
// Собираем строку: сначала символ FNC1, затем основные данные, затем снова разделитель перед криптохвостом
// Предположим, что Стр.КИЗ содержит полную строку маркировки, полученную из СУЗ
СтрокаДляПечати = СимволFNC1 + Лев(Стр.КИЗ, 31) + СимволFNC1 + Сред(Стр.КИЗ, 32);
ПараметрыШтрихкода.Вставить("Штрихкод", СтрокаДляПечати);
Важный нюанс: если вы сканируете код ручным сканером в «Блокнот» для проверки, вы, скорее всего, не увидите эти спецсимволы, так как большинство сканеров по умолчанию их отсекают. Для проверки корректности формирования лучше использовать мобильное приложение «Честный Знак» или специализированные утилиты для тестирования штрихкодов.
Разберем ситуацию с качеством печати. DataMatrix очень чувствителен к разрешению принтера. Для продуктов питания или лекарств коды могут быть очень мелкими.
Если мы хотим реализовать печать современным способом, рассмотрим использование методов БСП. Это избавит нас от прямой работы с объектами рисунков. Пример функции для формирования картинки штрихкода:
// В типовых конфигурациях используем менеджер оборудования
ДанныеШтрихкода = Новый Структура;
ДанныеШтрихкода.Вставить("Штрихкод", СтрокаДляПечати);
ДанныеШтрихкода.Вставить("ТипШтрихкода", ПороговоеЗначениеТипа); // Соответствует DataMatrix в перечислениях БСП
// Формируем картинку
Результат = МенеджерОборудованияВызовСервера.СформироватьШтрихкод(ДанныеШтрихкода);
Если Результат.Результат Тогда
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьКода");
Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Результат.Картинка;
// Настраиваем положение и размер программно
КонецЕсли;
Этот метод предпочтительнее, так как платформа сама заботится о правильной отрисовке модулей штрихкода в зависимости от передаваемых параметров.
Проанализируем вопрос хранения КИЗ. Не рекомендуется хранить коды в формате Base64 или в виде готовых картинок, так как это сильно раздувает объем базы данных. Правильнее всего хранить исходную символьную строку, включая спецсимволы. При необходимости печати мы просто передаем эту строку в генератор кода с правильными параметрами GS1.
Помните, что корректно настроенный сканер в режиме эмуляции COM-порта передаст в 1С все скрытые символы, что позволит вам сохранить их в исходном виде и в дальнейшем безошибочно воспроизвести на печатной форме.