Как исправить ошибку при печати штрихкода EAN-128 в 1С?

Программист 1С v8.3 (Обычные формы) Торговля и дистрибуция
← На главную

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

Правильный порядок присвоения свойств

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


ТабДок           = Новый ТабличныйДокумент;
ОбластьЗаголовок = ПолучитьМакет("Макет").ПолучитьОбласть("Заголовок");
РисунокШтрихкод  = ОбластьЗаголовок.Рисунки.Штрихкод;
// ОШИБКА: Сообщение присваивается до указания типа кода
РисунокШтрихкод.Объект.Сообщение = "(240)913202571(21)41600018";
РисунокШтрихкод.Объект.ТипКода = 2;
ТабДок.Вывести(ОбластьЗаголовок);

Выясним причину: компонента пытается обработать значение Сообщение сразу в момент его присвоения, используя текущий тип кода (часто по умолчанию это EAN-13, которому соответствует значение 0). Строка для EAN-128 не проходит валидацию для формата EAN-13, происходит внутренний сбой, и компонента выводит стандартный пустой штрихкод. Чтобы этого избежать, строку с указанием типа кода необходимо всегда ставить над строкой передачи сообщения.

Разделение машиночитаемых данных и визуального текста

Формат EAN-128 обладает строгой внутренней структурой. Скобки в идентификаторах применения, например (240) и (21), служат исключительно для визуального удобства человека. Если передать строку со скобками напрямую в свойство Сообщение, компонента может не распознать формат. В считываемом коде вместо скобок для разделения полей переменной длины должен использоваться специальный невидимый символ FNC1.

Рассмотрим по шагам, как корректно передать данные:

  1. Отключаем автоопределение типа кода, чтобы избежать ошибок валидации: свойство АвтоТип устанавливаем в Ложь.
  2. Устанавливаем свойство ТипКода равным 2 (что соответствует EAN-128).
  3. В свойство ТекстКода передаем строку со скобками — это сформирует красивую надпись под самим штрихкодом.
  4. В свойство Сообщение передаем чистые данные без скобок (с учетом разделителей FNC1, если компонента требует их явной передачи).

Посмотрим на исправленный и надежный пример кода:


ТабДок = Новый ТабличныйДокумент;
ОбластьЗаголовок = ПолучитьМакет("Макет").ПолучитьОбласть("Заголовок");
РисунокШтрихкод = ОбластьЗаголовок.Рисунки.Штрихкод;

// 1. Обязательно отключаем автоопределение
РисунокШтрихкод.Объект.АвтоТип = Ложь;

// 2. Сначала задаем тип кода (2 = EAN-128)
РисунокШтрихкод.Объект.ТипКода = 2;

// 3. Задаем человекочитаемый текст (со скобками)
РисунокШтрихкод.Объект.ТекстКода = "(240)913202571(21)41600018";

// 4. Только теперь передаем само сообщение (данные для сканера)
РисунокШтрихкод.Объект.Сообщение = "2409132025712141600018";

ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Показать();

Важное замечание: Не забудьте расширить границы самого рисунка на макете. Штрихкод EAN-128 физически занимает значительно больше места, чем классический EAN-13. Компонента масштабирует линии целочисленно, и если рамка слишком узкая, штрихкод может не поместиться или исказиться.

Ограничения старой компоненты и современные альтернативы

Старая ActiveX-компонента является 32-битным приложением и часто вызывает нестабильность (вылеты и закрытия 1С) при работе в 64-битных клиентах и современных ОС. Если настройки свойств не помогают, или платформа закрывается при попытке открыть свойства объекта, рекомендуется перейти на современные способы генерации:

  1. Встроенный ГенераторШтрихкода: В новых версиях платформы 1С:Предприятие 8.3 функции генерации штрихкодов встроены в ядро платформы. Вы можете создавать картинки встроенными методами без регистрации сторонних DLL, что полностью решает проблемы с совместимостью разрядностей.
  2. БПО и БСП: Используйте Native-компоненту, поставляемую в составе Библиотеки подключаемого оборудования (БПО) или Библиотеки стандартных подсистем. Она формирует картинки в формате PNG или Base64, стабильно работает на серверах (включая Linux) и отлично справляется со сложными кодами, включая GS1-128.
  3. Утилита Zint: Если требуется высочайшая точность работы со спецсимволами (FNC1) для специфичных терминалов сбора данных, можно использовать консольную утилиту Zint, которая запускается из 1С, генерирует эталонное изображение и передает его в табличный документ.
← На главную