При разработке печатных форм этикеток или документов в 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.
Рассмотрим по шагам, как корректно передать данные:
АвтоТип устанавливаем в Ложь.ТипКода равным 2 (что соответствует EAN-128).ТекстКода передаем строку со скобками — это сформирует красивую надпись под самим штрихкодом.Сообщение передаем чистые данные без скобок (с учетом разделителей FNC1, если компонента требует их явной передачи).Посмотрим на исправленный и надежный пример кода:
ТабДок = Новый ТабличныйДокумент;
ОбластьЗаголовок = ПолучитьМакет("Макет").ПолучитьОбласть("Заголовок");
РисунокШтрихкод = ОбластьЗаголовок.Рисунки.Штрихкод;
// 1. Обязательно отключаем автоопределение
РисунокШтрихкод.Объект.АвтоТип = Ложь;
// 2. Сначала задаем тип кода (2 = EAN-128)
РисунокШтрихкод.Объект.ТипКода = 2;
// 3. Задаем человекочитаемый текст (со скобками)
РисунокШтрихкод.Объект.ТекстКода = "(240)913202571(21)41600018";
// 4. Только теперь передаем само сообщение (данные для сканера)
РисунокШтрихкод.Объект.Сообщение = "2409132025712141600018";
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Показать();
Важное замечание: Не забудьте расширить границы самого рисунка на макете. Штрихкод EAN-128 физически занимает значительно больше места, чем классический EAN-13. Компонента масштабирует линии целочисленно, и если рамка слишком узкая, штрихкод может не поместиться или исказиться.
Старая ActiveX-компонента является 32-битным приложением и часто вызывает нестабильность (вылеты и закрытия 1С) при работе в 64-битных клиентах и современных ОС. Если настройки свойств не помогают, или платформа закрывается при попытке открыть свойства объекта, рекомендуется перейти на современные способы генерации: