Как сформировать и напечатать штрихкод формата GS1-128 в 1С 7.7

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

Формирование штрихкода GS1-128 (ранее известного как EAN-128) в среде 1С:Предприятие 7.7 является нетривиальной задачей. Традиционные шрифты и компоненты часто не поддерживают специфику стандарта, а именно использование управляющего символа FNC1 и работу с идентификаторами применения (Application Identifiers, AI). В данной статье мы подробно разберем несколько проверенных способов реализации этой задачи, которые позволяют корректно кодировать данные для ритейлеров и логистических систем.

Понимание структуры GS1-128 и идентификаторов применения

Прежде чем переходить к коду, проанализируем структуру штрихкода. GS1-128 — это не просто набор цифр, а протокол обмена данными. Основные сложности при работе с ним в 7.7 заключаются в следующем:

  1. Символ FNC1: Он должен стоять сразу после стартового знака (Start Character), что переводит сканер в режим чтения GS1. Также он используется как разделитель для полей переменной длины.
  2. Идентификаторы применения (AI): Это префиксы (например, 01 для GTIN, 3103 для веса, 10 для номера партии). Некоторые поля имеют фиксированную длину (например, GTIN всегда 14 символов), а некоторые — переменную (номер партии, серийный номер).
  3. Скобки в тексте: В самом штрихкоде скобки не кодируются. Они нужны только для визуального отображения под кодом.

Рассмотрим конкретный пример структуры строки данных:

(01)4607041741532(3103)002520(11)011219(10)001011219(21)00001

Если поле 10 (партия) имеет переменную длину, то после него в коде должен быть вставлен непечатный символ-разделитель (обычно ASCII 29), чтобы сканер понял, где начинаются данные следующего AI.

Решение 1: Использование языка принтера EZPL (для принтеров Godex и аналогичных)

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

Разберем алгоритм действий:

  1. Создаем шаблон этикетки в программе GoLabel.
  2. Выгружаем шаблон в формате EZPL (текстовый файл с командами, начинающимися на ^ или ~).
  3. В 1С 7.7 с помощью объекта Текст заменяем переменные части шаблона на реальные данные из информационной базы.

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


// Пример формирования строки GS1-128 для принтера Godex
// Симв(29) используется как FNC1 для разделения полей переменной длины
ТекШтрихкод = "01" + GTIN14 + "3103" + ВесВКод + "11" + ДатаПр + "10" + НомерПартии + Симв(29) + "21" + Серийник;

// В шаблоне EZPL строка печати штрихкода выглядит примерно так:
// B55,412,10,2,4,24,3,0,ДАННЫЕ_ШТРИХКОДА

Для отправки готового файла на принтер выполним следующую последовательность действий в системе:

  1. Расшарим принтер в сети.
  2. Подключим его к виртуальному порту LPT через команду net use lpt2 \\ИмяПК\ИмяПринтера /persistent:yes.
  3. Выполним копирование сформированного файла напрямую в порт.

Процедура ПечатьНаПринтер(ПутьКФайлу)
    // Формируем команду для командной строки Windows
    Команда = "copy " + ПутьКФайлу + " lpt2";
    КомандаСистемы(Команда);
КонецПроцедуры

Решение 2: Использование внешней компоненты FormEx и библиотеки Zint

Если печать должна происходить в обычную форму (таблицу 1С), а внешние OCX-компоненты вызывают падение системы, воспользуемся компонентой FormEx (версии 2.5.0.115 и выше). Она включает в себя поддержку библиотеки Zint, которая умеет генерировать практически любые типы штрихкодов в объект «Картинка».

Рассмотрим программную реализацию. Нам понадобится метод НарисоватьШтрихкод(), который принимает параметры изображения и тип кода.


// Предварительно загружаем компоненту FormEx
Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
    Сообщить("Ошибка загрузки FormEx!");
    Возврат;
КонецЕсли;

// Создаем объект и рисуем код на объекте "Картинка"
Сервис = СоздатьОбъект("Сервис");
// Тип 16 соответствует GS1-128 в библиотеке Zint
Сервис.НарисоватьШтрихкод(ОбъектКартинка, СтрокаДанных, 16);

Этот способ хорош тем, что он не требует регистрации ActiveX в реестре и работает стабильно даже в терминальном режиме.

Решение 3: Программное формирование строки для шрифтов Code 128

Если мы вынуждены использовать шрифты (например, Code128.ttf), мы должны помнить, что просто передать строку 01460... недостаточно. Необходимо программно рассчитать контрольный символ Modulo 103 и добавить стартовый символ Code C и управляющий символ FNC1.

Выясним причину, по которой обычный шрифт не читается как GS1-128: сканеру нужен префикс, который в шрифтах соответствует определенному символу в кодировке ASCII. Для GS1-128 алгоритм формирования строки выглядит так:

  1. Выбор стартового набора (обычно Набор C для цифровых данных).
  2. Вставка символа FNC1 (в многих шрифтах это символ с кодом 202).
  3. Разбиение данных на пары цифр.
  4. Расчет контрольной суммы по алгоритму 103.
  5. Добавление стопового символа.

Пример подготовки строки со спецсимволами в коде 1С:


// Пример вставки спецсимвола разделителя полей (GS - Group Separator)
// Используется, если после поля переменной длины идут другие данные
Если КодМеркурийВид = 1 Тогда
    КодТР = "01" + ШтрихКодА + "3103" + ВесТовара + "11" + датаПр + "10" + Партия + Симв(29) + "21" + ТекНомУпак;
КонецЕсли;

Решение 4: Использование консольной утилиты Zint.exe

Если компоненты не подходят, можно использовать Zint как внешнее приложение. Это гарантирует отсутствие вылетов 1С, так как процесс генерации происходит вне адресного пространства платформы.

Алгоритм совместной работы:

  1. Выгружаем данные во временный текстовый файл или передаем через параметры командной строки.
  2. Запускаем zint.exe с ключом -b 16 (GS1-128).
  3. Полученный файл изображения (PNG/BMP) загружаем в таблицу 1С через Рисунок.Загрузить().

// Пример вызова консольного генератора
ПутьККартинке = "C:\Temp\barcode.bmp";
Данные = "01046070417415323103002520";
Команда = "C:\Zint\zint.exe -o " + ПутьККартинке + " -b 16 -d " + Данные;
КомандаСистемы(Команда);

// Загрузка в таблицу
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ТаблицаСКартинкой");
Рисунок = Таб.ТекущийОбъект;
Рисунок.Загрузить(ПутьККартинке);

Подведем итоги

Проанализировав все варианты, можно сделать вывод: для печати на этикетки лучшим выбором будет использование EZPL, так как это дает максимальное качество печати. Для вставки штрихкода в накладные или счета-фактуры наиболее современным и стабильным решением является использование FormEx с библиотекой Zint. Важно всегда проверять итоговую строку на наличие символа FNC1 и корректную длину идентификаторов применения (AI 01 — 14 знаков, AI 11 — 6 знаков и т.д.), чтобы штрихкод успешно проходил валидацию у покупателей.

← На главную