Формирование штрихкода GS1-128 (ранее известного как EAN-128) в среде 1С:Предприятие 7.7 является нетривиальной задачей. Традиционные шрифты и компоненты часто не поддерживают специфику стандарта, а именно использование управляющего символа FNC1 и работу с идентификаторами применения (Application Identifiers, AI). В данной статье мы подробно разберем несколько проверенных способов реализации этой задачи, которые позволяют корректно кодировать данные для ритейлеров и логистических систем.
Прежде чем переходить к коду, проанализируем структуру штрихкода. GS1-128 — это не просто набор цифр, а протокол обмена данными. Основные сложности при работе с ним в 7.7 заключаются в следующем:
Рассмотрим конкретный пример структуры строки данных:
(01)4607041741532(3103)002520(11)011219(10)001011219(21)00001
Если поле 10 (партия) имеет переменную длину, то после него в коде должен быть вставлен непечатный символ-разделитель (обычно ASCII 29), чтобы сканер понял, где начинаются данные следующего AI.
Если ваша задача — печать этикеток на специализированном принтере, наиболее надежным способом будет прямая отправка команд на языке принтера. В этом случае принтер сам генерирует штрихкод, что гарантирует его читаемость.
Разберем алгоритм действий:
^ или ~).Текст заменяем переменные части шаблона на реальные данные из информационной базы.Посмотрим на пример формирования строки для записи в файл команд:
// Пример формирования строки GS1-128 для принтера Godex
// Симв(29) используется как FNC1 для разделения полей переменной длины
ТекШтрихкод = "01" + GTIN14 + "3103" + ВесВКод + "11" + ДатаПр + "10" + НомерПартии + Симв(29) + "21" + Серийник;
// В шаблоне EZPL строка печати штрихкода выглядит примерно так:
// B55,412,10,2,4,24,3,0,ДАННЫЕ_ШТРИХКОДА
Для отправки готового файла на принтер выполним следующую последовательность действий в системе:
net use lpt2 \\ИмяПК\ИмяПринтера /persistent:yes.
Процедура ПечатьНаПринтер(ПутьКФайлу)
// Формируем команду для командной строки Windows
Команда = "copy " + ПутьКФайлу + " lpt2";
КомандаСистемы(Команда);
КонецПроцедуры
Если печать должна происходить в обычную форму (таблицу 1С), а внешние OCX-компоненты вызывают падение системы, воспользуемся компонентой FormEx (версии 2.5.0.115 и выше). Она включает в себя поддержку библиотеки Zint, которая умеет генерировать практически любые типы штрихкодов в объект «Картинка».
Рассмотрим программную реализацию. Нам понадобится метод НарисоватьШтрихкод(), который принимает параметры изображения и тип кода.
// Предварительно загружаем компоненту FormEx
Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
Сообщить("Ошибка загрузки FormEx!");
Возврат;
КонецЕсли;
// Создаем объект и рисуем код на объекте "Картинка"
Сервис = СоздатьОбъект("Сервис");
// Тип 16 соответствует GS1-128 в библиотеке Zint
Сервис.НарисоватьШтрихкод(ОбъектКартинка, СтрокаДанных, 16);
Этот способ хорош тем, что он не требует регистрации ActiveX в реестре и работает стабильно даже в терминальном режиме.
Если мы вынуждены использовать шрифты (например, Code128.ttf), мы должны помнить, что просто передать строку 01460... недостаточно. Необходимо программно рассчитать контрольный символ Modulo 103 и добавить стартовый символ Code C и управляющий символ FNC1.
Выясним причину, по которой обычный шрифт не читается как GS1-128: сканеру нужен префикс, который в шрифтах соответствует определенному символу в кодировке ASCII. Для GS1-128 алгоритм формирования строки выглядит так:
Пример подготовки строки со спецсимволами в коде 1С:
// Пример вставки спецсимвола разделителя полей (GS - Group Separator)
// Используется, если после поля переменной длины идут другие данные
Если КодМеркурийВид = 1 Тогда
КодТР = "01" + ШтрихКодА + "3103" + ВесТовара + "11" + датаПр + "10" + Партия + Симв(29) + "21" + ТекНомУпак;
КонецЕсли;
Если компоненты не подходят, можно использовать Zint как внешнее приложение. Это гарантирует отсутствие вылетов 1С, так как процесс генерации происходит вне адресного пространства платформы.
Алгоритм совместной работы:
zint.exe с ключом -b 16 (GS1-128).Рисунок.Загрузить().
// Пример вызова консольного генератора
ПутьККартинке = "C:\Temp\barcode.bmp";
Данные = "01046070417415323103002520";
Команда = "C:\Zint\zint.exe -o " + ПутьККартинке + " -b 16 -d " + Данные;
КомандаСистемы(Команда);
// Загрузка в таблицу
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ТаблицаСКартинкой");
Рисунок = Таб.ТекущийОбъект;
Рисунок.Загрузить(ПутьККартинке);
Проанализировав все варианты, можно сделать вывод: для печати на этикетки лучшим выбором будет использование EZPL, так как это дает максимальное качество печати. Для вставки штрихкода в накладные или счета-фактуры наиболее современным и стабильным решением является использование FormEx с библиотекой Zint. Важно всегда проверять итоговую строку на наличие символа FNC1 и корректную длину идентификаторов применения (AI 01 — 14 знаков, AI 11 — 6 знаков и т.д.), чтобы штрихкод успешно проходил валидацию у покупателей.