Почему штрихкод в печатной форме 1С выводится со значением по умолчанию и как это исправить?

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

При разработке или изменении печатных форм в среде «1С:Предприятие 8» программисты часто сталкиваются с задачей вывода штрихкода номенклатуры в табличную часть (например, в строки накладной, приходного ордера или спецификации). Однако на практике нередко возникает проблема: какую бы номенклатуру мы ни выбирали, на печать выводится один и тот же стандартный штрихкод со значением по умолчанию (обычно это демонстрационный код вида «1234567890128» или пустое поле).

В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем взаимосвязь геометрии макета и работы внешних компонент, а также изучим правильные методики вывода штрихкодов с использованием механизмов Библиотеки стандартных подсистем (БСП) и Библиотеки подключаемого оборудования (БПО).

1. Ошибка жизненного цикла области макета (Макет vs Область макета)

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


Процедура ВывестиШтрихкодВСтрокуТаблицы(ТабличныйДокумент, Макет, ШтрихкодНоменклатуры) Экспорт
    УстановитьПривилегированныйРежим(Истина);
    
    // Получаем область из макета
    ОбластьМакетаШтрихкод = Макет.ПолучитьОбласть("СтрокаТаблицы");
    
    ПараметрыШтрихкодаТаблицы = Новый Структура;
    ПараметрыШтрихкодаТаблицы.Вставить("Ширина", 50);
    ПараметрыШтрихкодаТаблицы.Вставить("Высота", 10);
    ПараметрыШтрихкодаТаблицы.Вставить("Штрихкод", ШтрихкодНоменклатуры);
    ПараметрыШтрихкодаТаблицы.Вставить("ТипКода", 4); // Code128
    ПараметрыШтрихкодаТаблицы.Вставить("ОтображатьТекст", Ложь);
    
    // Пытаемся присвоить картинку рисунку в области макета
    ОбластьМакетаШтрихкод.Рисунки.ШКНоменклатуры.Картинка = 
        МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкодаТаблицы);
КонецПроцедуры

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

Правильное решение: Любые изменения рисунков, текстов и параметров области должны производиться строго до того, как область будет выведена в табличный документ с помощью метода Вывести(). Нам необходимо передавать в процедуру генерации штрихкода уже полученную область строки таблицы, заполнять в ней картинку и только затем осуществлять вывод в итоговый документ. Посмотрим на правильный шаблон работы:


// В модуле менеджера или объекта при формировании печати:
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаТаблицы");
// Заполняем текстовые параметры строки
ЗаполнитьЗначенияСвойств(ОбластьСтроки.Параметры, ВыборкаСтрок);

// Формируем и устанавливаем штрихкод прямо в текущую область
УстановитьШтрихкодВОбласти(ОбластьСтроки, ВыборкаСтрок.Штрихкод);

// И только теперь выводим подготовленную область в итоговый документ!
ТабличныйДокумент.Вывести(ОбластьСтроки);

2. Конфликт типов объектов в макете: Элемент управления (ActiveX) против стандартного Рисунка

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

В старых версиях платформы «1С:Предприятие» и в Обычных формах для вывода штрихкодов использовался специальный элемент управления ActiveX — компонента «1С:Печать штрихкодов» (объект Barcode.ocx). Программное обращение к нему выглядело как работа со свойствами ActiveX-объекта:

Область.Рисунки.ШКНоменклатуры.Объект.Сообщение = ШтрихкодНоменклатуры;

В современных конфигурациях на Управляемых формах (с использованием БПО) печать штрихкодов реализуется совершенно иначе. Внешняя компонента генерирует бинарные данные картинки (обычно в формате PNG или BMP) на стороне сервера, после чего готовый объект типа Картинка помещается в обычный графический рисунок табличного документа. Обращение происходит через свойство Картинка:

Область.Рисунки.ШКНоменклатуры.Картинка = ПолученнаяКартинкаШтрихкода;

Если вы просто скопировали штрихкод из старого макета, велика вероятность, что скопировался именно объект ActiveX (Элемент управления). При попытке присвоить свойству Картинка такого объекта новое значение платформа не выдаст явной ошибки, но визуально штрихкод останется прежним и сохранит свое значение по умолчанию.

Решение проблемы:

  1. Откройте макет печатной формы в конфигураторе.
  2. Удалите проблемный рисунок штрихкода.
  3. Добавьте новый пустой рисунок через меню: Таблица -> Рисунки -> Вставить картинку...
  4. В появившемся диалоге выберите любой пустой или тестовый графический файл (минимального размера).
  5. В свойствах созданного рисунка задайте имя (например, ШКНоменклатуры).
  6. Убедитесь, что тип созданного объекта — именно «Картинка», а не «Элемент управления».

Теперь программное присвоение картинки будет отрабатывать корректно.

3. Геометрические ограничения рисунка и миф о «колонках таблицы»

В ходе обсуждения часто высказывается мнение, что штрихкод не кодируется в картинку, если он расположен в области с колонками (то есть непосредственно внутри таблицы). Это популярное заблуждение. На самом деле штрихкоды отлично выводятся в любые области табличного документа. Истинная причина сбоя кроется в геометрических размерах рисунка.

Для кодирования информации (особенно при использовании типа кода Code128, который гораздо длиннее стандартного EAN-13) внешней компоненте генерации требуется определенное соотношение ширины и высоты картинки. Проанализируем поведение компоненты:

Когда вы выносите штрихкод из «области с колонками» в шапку или подвал, ширина ячеек там перестает жестко ограничивать размеры рисунка. Вы делаете рисунок шире, и компонента успешно генерирует изображение. Чтобы решить эту проблему непосредственно в табличной части, необходимо увеличить ширину колонки, в которой расположен рисунок штрихкода, либо объединить несколько ячеек по горизонтали, чтобы предоставить рисунку больше физического пространства.

Также обязательно добавляйте в код проверку возвращаемого значения:


КартинкаШтрихкода = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкодаТаблицы);

Если ЗначениеЗаполнено(КартинкаШтрихкода) Тогда
    ОбластьМакетаШтрихкод.Рисунки.ШКНоменклатуры.Картинка = КартинкаШтрихкода;
Иначе
    // Выводим предупреждение в журнал регистрации для диагностики
    ЗаписьЖурналаРегистрации("ПечатьШтрихкода", УровеньЖурналаРегистрации.Предупреждение,,, 
        "Не удалось сформировать картинку штрихкода. Возможная причина - недостаточная ширина рисунка в макете.");
КонецЕсли;

4. Проверка подключения внешней компоненты и актуальные методы БСП

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

  1. Внешняя компонента AddIn.КартинкаШтрихкода.Barcode должна быть зарегистрирована в системе или находиться в составе макетов конфигурации.
  2. На сервере приложений 1С должен быть разрешен запуск внешних компонент (особенно актуально для Linux-серверов, где могут потребоваться дополнительные графические библиотеки, такие как libgsf или glib).

Кроме того, метод МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода() в современных версиях программ 1С признан устаревшим. При работе в новых редакциях ERP, УТ и КА рекомендуется использовать функции общего модуля ГенерацияШтрихкодаВызовСервера. Рассмотрим пример современного и надежного кода для вывода штрихкода:


Процедура ЗаполнитьШтрихкодВОбластиСтроки(ОбластьСтроки, ЗначениеШтрихкода) Экспорт
    
    // Задаем параметры генерации штрихкода
    ПараметрыШтрихкода = Новый Структура;
    ПараметрыШтрихкодаВставить("Штрихкод",      ЗначениеШтрихкода);
    ПараметрыШтрихкода.Вставить("ТипКода",       4); // Code128
    ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
    ПараметрыШтрихкода.Вставить("РазмерШрифта",   6);
    
    // Получаем размеры рисунка непосредственно из макета печатной формы
    РисунокМакета = ОбластьСтроки.Рисунки.ШКНоменклатуры;
    ПараметрыШтрихкода.Вставить("Ширина",  РисунокМакета.Ширина * 3.8); // Перевод в пиксели/миллиметры
    ПараметрыШтрихкода.Вставить("Высота", РисунокМакета.Высота * 3.8);
    
    // Используем актуальный метод генерации БПО
    КартинкаШК = ГенерацияШтрихкодаВызовСервера.ИзображениеШтрихкода(ПараметрыШтрихкода);
    
    Если ТипЗнч(КартинкаШК) = Тип("Картинка") Тогда
        РисунокМакета.Картинка = КартинкаШК;
    КонецЕсли;
    
КонецПроцедуры

Использование свойства оригинального рисунка (РисунокМакета.Ширина) для динамического расчета передаваемых параметров позволяет гарантировать, что внешняя компонента сгенерирует изображение ровно под те размеры, которые заданы в макете конфигуратором, предотвращая появление пустых областей и ошибок масштабирования.

← На главную