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

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, и по шагам рассмотрим правильный алгоритм создания печатной формы со штрихкодом на управляемых формах — ускорить разработку поможет готовый инструмент вывода штрихкодов в печатные формы 1С.

Анализ причин возникновения ошибок

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

Ошибка 1: «Переменная не определена» и некорректная работа на сервере.

В первоначальном варианте кода автор пытался напрямую обращаться из серверной процедуры к элементу макета, как к элементу формы (Результат.Очистить()), и использовать функцию РеквизитФормыВЗначение. Это фундаментальная ошибка, связанная с непониманием клиент-серверной архитектуры 1С. Процедура формирования отчета, выполняемая на сервере (&НаСервере), не имеет прямого доступа к элементам управления формы или макета, которые существуют на клиенте. Формирование печатной формы на сервере всегда происходит в отрыве от ее визуального представления. Для упрощения процесса разработки и тестирования таких механизмов полезно использовать универсальную форму отладки для внешней обработки печатных форм.

Ошибка 2: «Поле объекта недоступно для записи (Картинка)».

Это ключевая проблема, которая возникает даже при правильной серверной логике. Автор получает эту ошибку в строке:


Рисунок.Картинка = Картинка; // Ошибка!

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

  1. Таблица → Рисунки → Вставить объект... Этот способ вставляет в макет OLE-объект или компонент ActiveX. Именно так вставляется компонент «1С:Печать штрихкодов». У такого объекта свойство Картинка действительно недоступно для записи из кода в управляемых формах.
  2. Таблица → Рисунки → Картинка... Этот способ вставляет в макет стандартный платформенный объект типа РисунокТабличногоДокумента. Вот у этого объекта свойство Картинка доступно для записи, и именно его следует использовать для программного вывода изображений. Стоит также учитывать, что при работе с графикой в макетах иногда возникают нюансы отображения, например, когда не отображается текст сгруппированных текстовых блоков при сохранении документа в PDF.

Таким образом, корень проблемы — неправильный выбор элемента при конструировании макета. Решение заключается в замене объекта ActiveX на обычную картинку.

Пошаговый алгоритм создания отчета со штрихкодом

Теперь, когда мы разобрались с причинами, давайте по шагам создадим рабочий механизм вывода штрихкода.

Шаг 1. Правильная подготовка макета

Это самый важный этап, от которого зависит успех всей операции.

  1. Откройте ваш отчет или обработку в конфигураторе и перейдите на вкладку «Макеты». Создайте новый макет табличного документа.
  2. Выделите несколько ячеек и задайте им имя области, например, ОбластьШтрихкода.
  3. Установите курсор внутри этой именованной области и перейдите в меню Таблица → Рисунки → Картинка. Не перепутайте с пунктом «Вставить объект»!
  4. Разместите появившуюся рамку картинки внутри вашей области. Растяните ее до нужных размеров.
  5. Выделите вставленную картинку, нажмите правую кнопку мыши и выберите «Свойства». В поле «Имя» задайте уникальное имя, например, РисунокШтрихкода.

Шаг 2. Написание серверного кода

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


&НаСервере
Функция СформироватьОтчетНаСервере()
    
    // 1. Создаем итоговый табличный документ
    ТабДок = Новый ТабличныйДокумент;
    
    // 2. Получаем наш макет
    Макет = ПолучитьМакет("Макет");
    
    // 3. Получаем именованную область из макета
    Область = Макет.ПолучитьОбласть("ОбластьШтрихкода");
    
    // 4. Получаем объект рисунка из области по имени
    Рисунок = Область.Рисунки.РисунокШтрихКода;
    
    // 5. Рассчитываем размеры для генерации штрихкода
    Эталон = ПолучитьМакет("ЭталонДляОпределенияКоэффициентовЕдиницИзмерения");
    КоличествоМиллиметровВПикселеВысота = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
    КоличествоМиллиметровВПикселеШирина = Эталон.Рисунки.Квадрат100Пикселей.Ширина / 100;
    ШиринаШтрихкода = Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселеШирина);
    ВысотаШтрихкода = Окр(Рисунок.Высота / КоличествоМиллиметровВПикселеВысота);
    
    // 6. Задаем данные для кодирования
    ВходныеДанные = "(01)04600822901507(11)161109(30)2434";
    
    // 7. Генерируем изображение штрихкода. 
    // В данном примере используется БСП, но возможна и простая генерация QR и штрихкодов без библиотек и компонент.
    Картинка = ПолучитьИзображениеШтрихкода(ШиринаШтрихкода, ВысотаШтрихкода, ВходныеДанные, 24);  
    
    // 8. Присваиваем сгенерированную картинку нашему рисунку в макете.
    Рисунок.Картинка = Картинка;
    
    // 9. Выводим заполнению область в итоговый табличный документ
    ТабДок.Вывести(Область); 
    
    // 10. Возвращаем сформированный документ
    Возврат ТабДок;
    
КонецФункции

&НаСервере
Функция ПолучитьИзображениеШтрихкода(Ширина, Высота, ЗначениеШтрихкода, ТипКода)
    
    ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода();
    ПараметрыШтрихкода.Ширина = Ширина;
    ПараметрыШтрихкода.Высота = Высота;
    ПараметрыШтрихкода.ТипКода = ТипКода;
    ПараметрыШтрихкода.Штрихкод = ЗначениеШтрихкода;
    ПараметрыШтрихкода.ПрозрачныйФон = Истина;
    ПараметрыШтрихкода.ОтображатьТекст = Ложь;
    
    РезультатГенерации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);
    
    Если РезультатГенерации.Результат Тогда
        Возврат РезультатГенерации.Картинка;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции

Шаг 3. Вызов формирования и отображение результата

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


&НаКлиенте
Процедура Сформировать(Команда)
    Результат.Очистить();
    СформированныйДокумент = СформироватьОтчетНаСервере();
    ЭтотОбъект.Результат.ВставитьОбласть(СформированныйДокумент.ПолучитьОбласть(), , , Ложь);
КонецПроцедуры

Итоги и рекомендации

Мы рассмотрели полный цикл создания печатной формы со штрихкодом и разобрались в причинах распространенных ошибок. Сформулируем главные выводы:

  1. Разделяйте логику: все операции по генерации данных и заполнению макета выполняйте на сервере.
  2. Используйте правильный объект: для программной вставки изображений в макет всегда используйте объект «Картинка» (РисунокТабличногоДокумента).
  3. Именуйте элементы: всегда давайте осмысленные имена областям и рисункам в макете.
  4. Используйте стандартные механизмы: для генерации штрихкодов предназначен общий модуль ГенерацияШтрихкода из состава БСП — также для этой задачи есть универсальный модуль автоматического добавления QR-кодов в любые печатные формы 1С.

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

← На главную