Как программно вывести и обновить штрихкод в печатной форме 1С?

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

При формировании печатных форм документов, этикеток и ценников часто возникает задача динамического вывода штрихкода для каждой строки номенклатуры. Разберем распространенную ситуацию, когда штрихкод добавлен в макет как внедренный объект, но при выводе строк данные не обновляются или возникает ошибка неопределенной переменной.

Анализ проблемы и причина ошибки

Рассмотрим исходный фрагмент кода, в котором выполняется обход строк таблицы значений:


Для Каждого ТекСтрока ИЗ ТаблицаЗначений Цикл
    
    ОбластьСтрока.Параметры.Номенклатура = ТекСтрока.Номенклатура;
    ОбластьСтрока.Параметры.ХарактеристикаНоменклатуры = ТекСтрока.ХарактеристикаНоменклатуры;
    ОбластьСтрока.Параметры.Штрихкода = ТекСтрока.Штрихкода;
    
    ОбластьСтрока.Рисунки.ШтрихкодВставка.Объект.ТипКода = 1;
    //ОбластьСтрока.Рисунки.ШтрихкодВставка.Объект.Сообщение = Штрихкод;
    //ОбластьСтрока.Рисунки.ШтрихкодВставка.Объект.ТекстКода = Штрихкод;
    
    ТабДокумент.Вывести(ОбластьСтрока);
    
КонецЦикла;

Проанализируем, почему закомментированные строки вызывали ошибку или не изменяли значение:

  1. Обращение к неопределенной переменной: переменная Штрихкод не объявлена в локальной области видимости процедуры. Данные штрихкода хранятся в реквизите текущей строки таблицы — ТекСтрока.Штрихкода.
  2. Свойство для передачи данных: за закодированную последовательность штрихов отвечает свойство Сообщение внедренного объекта. Если оно не заполнено или закомментировано, объект отображает значение по умолчанию, заданное в макете.

Исправление кода и правильная передача параметров

Выясним, как правильно передавать значение штрихкода в цикле. Для этого присвоим свойству Сообщение значение из поля текущей строки ТекСтрока.Штрихкода, предварительно приведя его к строковому типу.

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


Для Каждого ТекСтрока ИЗ ТаблицаЗначений Цикл
    
    // Заполнение текстовых параметров области
    ОбластьСтрока.Параметры.Номенклатура = ТекСтрока.Номенклатура;
    ОбластьСтрока.Параметры.ХарактеристикаНоменклатуры = ТекСтрока.ХарактеристикаНоменклатуры;
    ОбластьСтрока.Параметры.Штрихкода = ТекСтрока.Штрихкода;
    
    // Получение ссылки на внедренный объект штрихкода
    ОбъектШтрихкода = ОбластьСтрока.Рисунки.ШтрихкодВставка.Объект;
    
    // Установка типа кодирования (например, 1 = EAN-13)
    ОбъектШтрихкода.ТипКода = 1;
    
    // Передача значения штрихкода
    ОбъектШтрихкода.Сообщение = СокрЛП(Строка(ТекСтрока.Штрихкода));
    
    // Вывод области в итоговый табличный документ
    ТабДокумент.Вывести(ОбластьСтрока);
    
КонецЦикла;

Основные свойства внедренного OLE-компонента «1С:Печать штрихкодов»

Рассмотрим подробнее доступные параметры элемента управления при работе через Область.Рисунки.ИмяЭлемента.Объект:

  1. ТипКода (Число) — определяет стандарт кодирования:
    0 — EAN-8;
    1 — EAN-13;
    2 — EAN-128;
    4 — Code39;
    6 — Code128.
  2. Сообщение (Строка) — закодированные данные. Для стандарта EAN-13 строка должна содержать ровно 12 цифр (13-й контрольный символ рассчитывается автоматически) или 13 корректных цифр.
  3. ОтображатьТекст (Булево) — управляет видимостью буквенно-цифровой надписи под полосами штрихкода.
  4. ТекстКода (Строка) — позволяет переопределить текст под штрихкодом, если требуется отобразить информацию, отличную от закодированной в свойстве Сообщение.
  5. АвтоТип (Булево) — включает автоматический выбор формата в зависимости от структуры переданной строки.

Ограничения OLE-объектов и современные способы формирования штрихкодов

Использование свойства Объект у элементов табличного документа базируется на технологии ActiveX (библиотека 1CBarCod.dll). Разберем ограничения этого подхода:

  1. Несовместимость с управляемым приложением и Linux: OLE-компоненты не поддерживаются на 64-разрядном сервере 1С, веб-клиенте и серверах под управлением ОС Linux. Свойство Объект вернет Неопределено.
  2. Особенности кэширования: при многократном выводе области в цикле возможно некорректное дублирование изображения штрихкода.

Для создания универсальных и стабильных печатных форм рекомендуется использовать следующие альтернативы:

  1. Использование Native-компоненты и типа «Картинка»:

    В макет добавляется элемент с типом ТипРисункаТабличногоДокумента.Картинка. Внешняя компонента подключается через ПодключитьВнешнююКомпоненту() на сервере или клиенте, генерирует двоичные данные штрихкода и присваивает их напрямую свойству Картинка:

    
    ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "ВКШтрихкод", ТипПодключенияВнешнейКомпоненты.Native);
    Компонента = Новый("AddIn.ВКШтрихкод.Barcode");
    // Генерация штрихкода и установка в область
    ОбластьСтрока.Рисунки.ШтрихкодВставка.Картинка = ПолученнаяКартинка;
    
  2. Использование подсистем БСП / БПО:

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

  3. Шрифты штрихкодирования (TrueType):

    Штрихкод выводится в стандартную ячейку макета текстом со специальным шрифтом (например, Code 128 или EAN-13). Для корректного сканирования строка предварительно рассчитывается алгоритмом с добавлением стартовых, контрольных и стоповых символов.

← На главную