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