При формировании печатных форм документов, этикеток и ценников часто возникает задача динамического вывода штрихкода для каждой строки номенклатуры. Разберем распространенную ситуацию, когда штрихкод добавлен в макет как внедренный объект, но при выводе строк данные не обновляются или возникает ошибка неопределенной переменной.
Рассмотрим исходный фрагмент кода, в котором выполняется обход строк таблицы значений:
Для Каждого ТекСтрока ИЗ ТаблицаЗначений Цикл
ОбластьСтрока.Параметры.Номенклатура = ТекСтрока.Номенклатура;
ОбластьСтрока.Параметры.ХарактеристикаНоменклатуры = ТекСтрока.ХарактеристикаНоменклатуры;
ОбластьСтрока.Параметры.Штрихкода = ТекСтрока.Штрихкода;
ОбластьСтрока.Рисунки.ШтрихкодВставка.Объект.ТипКода = 1;
//ОбластьСтрока.Рисунки.ШтрихкодВставка.Объект.Сообщение = Штрихкод;
//ОбластьСтрока.Рисунки.ШтрихкодВставка.Объект.ТекстКода = Штрихкод;
ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Проанализируем, почему закомментированные строки вызывали ошибку или не изменяли значение:
Штрихкод не объявлена в локальной области видимости процедуры. Данные штрихкода хранятся в реквизите текущей строки таблицы — ТекСтрока.Штрихкода.Сообщение внедренного объекта. Если оно не заполнено или закомментировано, объект отображает значение по умолчанию, заданное в макете.Выясним, как правильно передавать значение штрихкода в цикле. Для этого присвоим свойству Сообщение значение из поля текущей строки ТекСтрока.Штрихкода, предварительно приведя его к строковому типу.
Посмотрим на исправленный вариант обработчика:
Для Каждого ТекСтрока ИЗ ТаблицаЗначений Цикл
// Заполнение текстовых параметров области
ОбластьСтрока.Параметры.Номенклатура = ТекСтрока.Номенклатура;
ОбластьСтрока.Параметры.ХарактеристикаНоменклатуры = ТекСтрока.ХарактеристикаНоменклатуры;
ОбластьСтрока.Параметры.Штрихкода = ТекСтрока.Штрихкода;
// Получение ссылки на внедренный объект штрихкода
ОбъектШтрихкода = ОбластьСтрока.Рисунки.ШтрихкодВставка.Объект;
// Установка типа кодирования (например, 1 = EAN-13)
ОбъектШтрихкода.ТипКода = 1;
// Передача значения штрихкода
ОбъектШтрихкода.Сообщение = СокрЛП(Строка(ТекСтрока.Штрихкода));
// Вывод области в итоговый табличный документ
ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Рассмотрим подробнее доступные параметры элемента управления при работе через Область.Рисунки.ИмяЭлемента.Объект:
ТипКода (Число) — определяет стандарт кодирования:
Сообщение (Строка) — закодированные данные. Для стандарта EAN-13 строка должна содержать ровно 12 цифр (13-й контрольный символ рассчитывается автоматически) или 13 корректных цифр.ОтображатьТекст (Булево) — управляет видимостью буквенно-цифровой надписи под полосами штрихкода.ТекстКода (Строка) — позволяет переопределить текст под штрихкодом, если требуется отобразить информацию, отличную от закодированной в свойстве Сообщение.АвтоТип (Булево) — включает автоматический выбор формата в зависимости от структуры переданной строки.Использование свойства Объект у элементов табличного документа базируется на технологии ActiveX (библиотека 1CBarCod.dll). Разберем ограничения этого подхода:
Объект вернет Неопределено.Для создания универсальных и стабильных печатных форм рекомендуется использовать следующие альтернативы:
В макет добавляется элемент с типом ТипРисункаТабличногоДокумента.Картинка. Внешняя компонента подключается через ПодключитьВнешнююКомпоненту() на сервере или клиенте, генерирует двоичные данные штрихкода и присваивает их напрямую свойству Картинка:
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "ВКШтрихкод", ТипПодключенияВнешнейКомпоненты.Native);
Компонента = Новый("AddIn.ВКШтрихкод.Barcode");
// Генерация штрихкода и установка в область
ОбластьСтрока.Рисунки.ШтрихкодВставка.Картинка = ПолученнаяКартинка;
В типовых конфигурациях применяются встроенные серверные функции генерации штрихкодов, возвращающие объект Картинка без прямой ручной низкоуровневой работы с OLE.
Штрихкод выводится в стандартную ячейку макета текстом со специальным шрифтом (например, Code 128 или EAN-13). Для корректного сканирования строка предварительно рассчитывается алгоритмом с добавлением стартовых, контрольных и стоповых символов.