Как сформировать двустрочный штрихкод GS1 DataBar Stacked в 1С 7.7?

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

При переходе на новые стандарты маркировки товаров (например, при продаже весовой продукции, табака или фармацевтических препаратов) часто возникает необходимость вывода двустрочных штрихкодов семейства GS1 DataBar Stacked. В среде устаревшей, но все еще активно используемой платформы 1С:Предприятие 7.7 стандартная компонента печати штрихкодов часто ограничена простыми одномерными кодами типа Code 128 или EAN-13. Вывод сложных составных и многострочных символик требует привлечения сторонних инструментов.

В этой статье мы подробно разберем несколько наиболее эффективных и проверенных практикой способов реализации двустрочного DataBar в 1С 7.7, а также рассмотрим особенности настройки торгового оборудования для успешного считывания таких кодов.

Понимание структуры: какие типы DataBar бывают двустрочными

Прежде чем переходить к программной реализации, определимся с терминологией. Термином «двустрочный» чаще всего называют следующие типы символик:

  1. GS1 DataBar Stacked: Компактный двухрядный код, используемый в основном для кодирования глобального номера товара (GTIN) на очень маленьких упаковках.
  2. GS1 DataBar Stacked Omnidirectional: Двустрочный вариант, оптимизированный для всенаправленного сканирования на кассовых узлах.
  3. GS1 DataBar Expanded Stacked: Наиболее мощный вариант, позволяющий кодировать не только GTIN, но и дополнительные атрибуты (срок годности, вес, номер партии, серийный номер). Количество строк в нем может варьироваться от 2 до 11 в зависимости от объема данных и настроек.

Способ 1. Использование внешней компоненты FormEx

Одним из самых надежных и элегантных способов отрисовки сложных штрихкодов является использование популярной внешней компоненты FormEx. Начиная с определенных версий, в ней присутствует мощный встроенный движок генерации штрихкодов на базе библиотеки Zint.

Для рисования штрихкода используется метод НарисоватьШтрихкод объекта Сервис. Разберем его синтаксис подробнее:

Сервис.НарисоватьШтрихкод(<Картинка>, <ТипКода>, <ЗначениеКода>, <ПрятатьТекст>, <eci>, <input_mode>)

Важные параметры метода:

Посмотрим на практический пример реализации в модуле отчета или обработки 1С 7.7:


// Создаем объект Сервис из компоненты FormEx
Сервис = СоздатьОбъект("Сервис");

// Загружаем макет печатной формы
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Макет");

// Получаем область с рисунком штрихкода
// Предполагается, что на макете размещен пустой объект "Картинка" с именем "Штрихкод"
Таб.ВывестиСекцию("Шапка");
РисунокШк = Таб.ПолучитьРисунок("Штрихкод");

Если ПустоеЗначение(РисунокШк) = 0 Тогда
    // Кодируемое значение (например, GTIN с весом)
    ДанныеКода = "(01)04601234567890(3103)001500"; 
    
    // Рисуем двустрочный GS1 DataBar Expanded Stacked (тип 81)
    // Скрываем текстовую расшифровку снизу (передаем 1)
    Сервис.НарисоватьШтрихкод(РисунокШк.Картинка, 81, ДанныеКода, 1);
Иначе
    Предупреждение("На макете не найден рисунок с именем Штрихкод!");
КонецЕсли;

Таб.Показать();

Важная рекомендация: Во избежание искажения пропорций штрихкода при печати на различных моделях принтеров, рекомендуется сначала формировать изображение в объекте «Картинка» на печатной форме динамически, а не пытаться рисовать поверх существующей сетки таблицы программными методами позиционирования. Это гарантирует стабильное качество печати.

Способ 2. Использование бесплатной ActiveX-компоненты Ocvita

Если по каким-то причинам использование FormEx невозможно, отличной альтернативой является специализированная внешняя компонента OcvitaBarcode. Она распространяется бесплатно, легко интегрируется и поддерживает десятки различных типов штрихкодов, включая семейство DataBar.

Разберем по шагам процесс подключения и использования этой компоненты:

  1. Скопируйте файл библиотеки ocvitabarcode.ocx в системную папку (например, C:\Windows\System32\ или в каталог базы данных).
  2. Зарегистрируйте библиотеку в операционной системе. Для этого запустите командную строку от имени администратора и выполните команду:
    regsvr32 ocvitabarcode.ocx
  3. Внедрите объект на форму или печатный макет в 1С 7.7 через меню «Вставить объект» -> «Элемент управления (ActiveX)» и выберите «Ocvita Barcode Control» из списка доступных объектов.

Программное управление свойствами компоненты в кодовой части выглядит следующим образом:


// Получаем объект ActiveX из макета таблицы
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("МакетСАктивксом");
Таб.ВывестиСекцию("СтрокаШК");

Попытка
    ШКОбъект = Таб.ПолучитьРисунок("ЭлементActiveX").Объект;
    
    // Устанавливаем тип кода (в документации Ocvita найдите индекс для DataBar Stacked)
    ШКОбъект.Type = 35; // Условный индекс типа кода из спецификации компоненты
    
    // Передаем данные для кодирования
    ШКОбъект.Value = "04601234567890";
    
    // Настраиваем отображение текста и пропорции
    ШКОбъект.ShowText = 0; 
    ШКОбъект.Refresh();
Исключение
    Сообщить("Ошибка обращения к ActiveX-компоненте Ocvita: " + ОписаниеОшибки(), "!");
КонецПопытки;

Способ 3. Использование консольной утилиты Zint и вызова через командную строку

Если вы хотите избежать регистрации дополнительных ActiveX в системе (что особенно критично при работе пользователей в терминальных сессиях RDP без прав администратора), можно использовать автономную консольную утилиту zint.exe.

Этот метод работает по следующей схеме: программа 1С выгружает текстовые данные во временный файл, запускает утилиту zint.exe с нужными параметрами командной строки, которая генерирует PNG-картинку штрихкода, после чего 1С загружает эту картинку в макет печатной формы.

Давайте проанализируем параметры вызова утилиты для двустрочного кода:

Важная техническая особенность Zint: Если кодируемых данных слишком мало, библиотека Zint может автоматически отрисовать код в одну строчку, даже если выбран тип Stacked. Чтобы принудительно задать двухстрочный формат, используйте параметр ограничения ширины сегментов (например, настроив количество сегментов в строке через параметры командной строки, установив ширину столбцов).

Пример кода на 1С 7.7 для реализации генерации через Zint CLI:


// Путь к исполняемому файлу Zint (хранится в каталоге базы)
ПутьКZint = КаталогИБ() + "ExtFiles\zint.exe";
ВременныйФайлКартинки = КаталогВременныхФайлов() + "barcode_temp.png";
КодируемоеЗначение = "0104601234567890";

// Формируем команду вызова
// Символ -b 79 задает тип GS1 DataBar Stacked
Команда = """" + ПутьКZint + """ -b 79 -o """ + ВременныйФайлКартинки + """ -d """ + КодируемоеЗначение + """";

// Выполняем команду операционной системы в скрытом режиме
КомандаСистемы(Команда);

// Проверяем, создался ли файл штрихкода
Если ФС.СуществуетФайл(ВременныйФайлКартинки) = 1 Тогда
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Печать");
    Таб.ВывестиСекцию("Шапка");
    
    // Загружаем картинку в объект на форме
    Рисунок = Таб.ПолучитьРисунок("ИзображениеШК");
    Рисунок.РежимРисунка(3); // Устанавливаем режим "С сохранением пропорций"
    Рисунок.Картинка(ВременныйФайлКартинки);
    
    Таб.Показать();
    
    // Удаляем временный файл после вывода на экран
    ФС.УдалитьФайл(ВременныйФайлКартинки);
Иначе
    Сообщить("Не удалось сгенерировать штрихкод с помощью Zint!", "!");
КонецЕсли;

Способ 4. Перенос компоненты «1С:Печать штрихкодов» из платформы 8.x в 7.7

Мало кто из разработчиков знает, что официальная компонента 1CBarCode.dll, поставляемая фирмой «1С» для современных версий платформы 1С:Предприятие 8, является стандартным COM/ActiveX-объектом. Она прекрасно регистрируется и работает в среде старой доброй «семерки».

Для реализации этого подхода выполните следующие шаги:

  1. Найдите в каталоге установленной платформы 8.3 или в шаблонах конфигураций файл 1CBarCode.dll (версии 8.0.x.x или выше, так как в старых версиях не было поддержки DataBar).
  2. Зарегистрируйте библиотеку через утилиту regsvr32 1CBarCode.dll на рабочих станциях пользователей.
  3. В коде 1С 7.7 вы можете создать данный объект программно и настроить его свойства:

Попытка
    КомпонентаШК = СоздатьОбъект("AddIn.1CBarCode");
    
    // Настраиваем тип кода: для GS1 DataBar Expanded Stacked в компоненте 1С используется тип 32
    КомпонентаШК.ТипКода = 32; 
    КомпонентаШК.Сообщение = "01046012345678901721123110BATCH123";
    КомпонентаШК.ОтображатьТекст = 0;
    
    // Сохраняем в файл для последующего вывода в макет
    ИмяФайла = КаталогВременныхФайлов() + "barcode_1c.wmf";
    КомпонентаШК.ЗаписатьШтрихкод(ИмяФайла, 400, 200);
    
    // Выводим полученный файл wmf в макет аналогично Способу 3
Исключение
    Сообщить("Компонента 1CBarCode не зарегистрирована на компьютере!", "!");
КонецПопытки;

Способ 5. Вывод через специализированные TrueType-шрифты

Существует теоретическая возможность вывода двустрочного штрихкода без использования внешних библиотек и ActiveX — с помощью специальных шрифтов штрихкодов (например, от IDAutomation). При этом методе символы штрихкода отображаются как обычный текст, к которому применен соответствующий TrueType-шрифт.

Однако этот метод является самым трудоемким для реализации в 1С 7.7:

Этот способ оправдан только в жестко контролируемых средах и бездисковых терминальных клиентах, где полностью запрещена установка стороннего ПО, но в большинстве стандартных задач рекомендуется использовать первые четыре способа.

Критически важный этап: Настройка сканеров штрихкода

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

В отличие от стандартного одномерного кода EAN-13, чтение семейства кодов GS1 DataBar (особенно двустрочных и составных версий Stacked/Expanded) во многих моделях сканеров отключено на уровне заводской прошивки для ускорения декодирования стандартных кодов.

Для решения этой проблемы выполните следующие действия:

  1. Найдите руководство пользователя (User Guide / Configuration Manual) конкретно для вашей модели сканера штрихкодов.
  2. Перейдите в раздел настройки символик (Symbology Settings) и найдите пункт GS1 DataBar Stacked / GS1 DataBar Expanded.
  3. Считайте сканером специальный управляющий штрихкод настройки, который включает поддержку этой символики (обычно называется "Enable GS1 DataBar Stacked" или аналогично).
  4. Если сканер работает в режиме эмуляции клавиатуры (KBW) или COM-порта, убедитесь, что в драйвере торгового оборудования 1С настроены корректные префиксы и суффиксы для разбора составных данных, так как GS1 DataBar может передавать управляющие символы разделителей групп данных (GS - Group Separator, код ASCII 29).

Используя предложенные методики, вы сможете легко решить задачу вывода двустрочных штрихкодов без немедленного дорогостоящего перехода на «восьмерку», продлив жизненный цикл существующих систем автоматизации на базе платформы 1С 7.7.

← На главную