При переходе на новые стандарты маркировки товаров (например, при продаже весовой продукции, табака или фармацевтических препаратов) часто возникает необходимость вывода двустрочных штрихкодов семейства GS1 DataBar Stacked. В среде устаревшей, но все еще активно используемой платформы 1С:Предприятие 7.7 стандартная компонента печати штрихкодов часто ограничена простыми одномерными кодами типа Code 128 или EAN-13. Вывод сложных составных и многострочных символик требует привлечения сторонних инструментов.
В этой статье мы подробно разберем несколько наиболее эффективных и проверенных практикой способов реализации двустрочного DataBar в 1С 7.7, а также рассмотрим особенности настройки торгового оборудования для успешного считывания таких кодов.
Прежде чем переходить к программной реализации, определимся с терминологией. Термином «двустрочный» чаще всего называют следующие типы символик:
Одним из самых надежных и элегантных способов отрисовки сложных штрихкодов является использование популярной внешней компоненты FormEx. Начиная с определенных версий, в ней присутствует мощный встроенный движок генерации штрихкодов на базе библиотеки Zint.
Для рисования штрихкода используется метод НарисоватьШтрихкод объекта Сервис. Разберем его синтаксис подробнее:
Сервис.НарисоватьШтрихкод(<Картинка>, <ТипКода>, <ЗначениеКода>, <ПрятатьТекст>, <eci>, <input_mode>)
Важные параметры метода:
79 — GS1 DataBar Stacked;80 — GS1 DataBar Stacked Omnidirectional;81 — GS1 DataBar Expanded Stacked.Посмотрим на практический пример реализации в модуле отчета или обработки 1С 7.7:
// Создаем объект Сервис из компоненты FormEx
Сервис = СоздатьОбъект("Сервис");
// Загружаем макет печатной формы
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Макет");
// Получаем область с рисунком штрихкода
// Предполагается, что на макете размещен пустой объект "Картинка" с именем "Штрихкод"
Таб.ВывестиСекцию("Шапка");
РисунокШк = Таб.ПолучитьРисунок("Штрихкод");
Если ПустоеЗначение(РисунокШк) = 0 Тогда
// Кодируемое значение (например, GTIN с весом)
ДанныеКода = "(01)04601234567890(3103)001500";
// Рисуем двустрочный GS1 DataBar Expanded Stacked (тип 81)
// Скрываем текстовую расшифровку снизу (передаем 1)
Сервис.НарисоватьШтрихкод(РисунокШк.Картинка, 81, ДанныеКода, 1);
Иначе
Предупреждение("На макете не найден рисунок с именем Штрихкод!");
КонецЕсли;
Таб.Показать();
Важная рекомендация: Во избежание искажения пропорций штрихкода при печати на различных моделях принтеров, рекомендуется сначала формировать изображение в объекте «Картинка» на печатной форме динамически, а не пытаться рисовать поверх существующей сетки таблицы программными методами позиционирования. Это гарантирует стабильное качество печати.
Если по каким-то причинам использование FormEx невозможно, отличной альтернативой является специализированная внешняя компонента OcvitaBarcode. Она распространяется бесплатно, легко интегрируется и поддерживает десятки различных типов штрихкодов, включая семейство DataBar.
Разберем по шагам процесс подключения и использования этой компоненты:
ocvitabarcode.ocx в системную папку (например, C:\Windows\System32\ или в каталог базы данных).regsvr32 ocvitabarcode.ocx
Программное управление свойствами компоненты в кодовой части выглядит следующим образом:
// Получаем объект ActiveX из макета таблицы
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("МакетСАктивксом");
Таб.ВывестиСекцию("СтрокаШК");
Попытка
ШКОбъект = Таб.ПолучитьРисунок("ЭлементActiveX").Объект;
// Устанавливаем тип кода (в документации Ocvita найдите индекс для DataBar Stacked)
ШКОбъект.Type = 35; // Условный индекс типа кода из спецификации компоненты
// Передаем данные для кодирования
ШКОбъект.Value = "04601234567890";
// Настраиваем отображение текста и пропорции
ШКОбъект.ShowText = 0;
ШКОбъект.Refresh();
Исключение
Сообщить("Ошибка обращения к ActiveX-компоненте Ocvita: " + ОписаниеОшибки(), "!");
КонецПопытки;
Если вы хотите избежать регистрации дополнительных ActiveX в системе (что особенно критично при работе пользователей в терминальных сессиях RDP без прав администратора), можно использовать автономную консольную утилиту zint.exe.
Этот метод работает по следующей схеме: программа 1С выгружает текстовые данные во временный файл, запускает утилиту zint.exe с нужными параметрами командной строки, которая генерирует PNG-картинку штрихкода, после чего 1С загружает эту картинку в макет печатной формы.
Давайте проанализируем параметры вызова утилиты для двустрочного кода:
--barcode=79 или -b 79 — указывает утилите генерировать GS1 DataBar Stacked.--barcode=81 — генерирует GS1 DataBar Expanded Stacked.-o "путь_к_файлу.png" — путь для сохранения результирующего изображения.-d "данные" — кодируемая строка.Важная техническая особенность 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!", "!");
КонецЕсли;
Мало кто из разработчиков знает, что официальная компонента 1CBarCode.dll, поставляемая фирмой «1С» для современных версий платформы 1С:Предприятие 8, является стандартным COM/ActiveX-объектом. Она прекрасно регистрируется и работает в среде старой доброй «семерки».
Для реализации этого подхода выполните следующие шаги:
1CBarCode.dll (версии 8.0.x.x или выше, так как в старых версиях не было поддержки DataBar).regsvr32 1CBarCode.dll на рабочих станциях пользователей.
Попытка
КомпонентаШК = СоздатьОбъект("AddIn.1CBarCode");
// Настраиваем тип кода: для GS1 DataBar Expanded Stacked в компоненте 1С используется тип 32
КомпонентаШК.ТипКода = 32;
КомпонентаШК.Сообщение = "01046012345678901721123110BATCH123";
КомпонентаШК.ОтображатьТекст = 0;
// Сохраняем в файл для последующего вывода в макет
ИмяФайла = КаталогВременныхФайлов() + "barcode_1c.wmf";
КомпонентаШК.ЗаписатьШтрихкод(ИмяФайла, 400, 200);
// Выводим полученный файл wmf в макет аналогично Способу 3
Исключение
Сообщить("Компонента 1CBarCode не зарегистрирована на компьютере!", "!");
КонецПопытки;
Существует теоретическая возможность вывода двустрочного штрихкода без использования внешних библиотек и ActiveX — с помощью специальных шрифтов штрихкодов (например, от IDAutomation). При этом методе символы штрихкода отображаются как обычный текст, к которому применен соответствующий TrueType-шрифт.
Однако этот метод является самым трудоемким для реализации в 1С 7.7:
Этот способ оправдан только в жестко контролируемых средах и бездисковых терминальных клиентах, где полностью запрещена установка стороннего ПО, но в большинстве стандартных задач рекомендуется использовать первые четыре способа.
При внедрении двустрочных штрихкодов разработчики часто сталкиваются с проблемой: штрихкод идеально выводится на печать, выглядит красиво и аккуратно, но торговое оборудование отказывается его считывать. Причина кроется в аппаратных настройках самих сканеров.
В отличие от стандартного одномерного кода EAN-13, чтение семейства кодов GS1 DataBar (особенно двустрочных и составных версий Stacked/Expanded) во многих моделях сканеров отключено на уровне заводской прошивки для ускорения декодирования стандартных кодов.
Для решения этой проблемы выполните следующие действия:
Используя предложенные методики, вы сможете легко решить задачу вывода двустрочных штрихкодов без немедленного дорогостоящего перехода на «восьмерку», продлив жизненный цикл существующих систем автоматизации на базе платформы 1С 7.7.