В процессе разработки печатных форм часто возникает задача динамического изменения графической информации. Это может быть вывод логотипа конкретной организации, отображение штрихкода или QR-кода при определенных условиях, либо полное скрытие декоративных элементов. Разберем подробно, какими инструментами располагает разработчик 1С для решения этой задачи.
Самый прямой способ управления графикой в макете — обращение к объекту через коллекцию Рисунки табличного документа. Каждый графический объект, добавленный в макет вручную через меню «Таблица — Рисунки — Вставить картинку», получает уникальное имя.
Рассмотрим по шагам, как реализовать этот метод:
ЛоготипКомпании.Проанализируем пример кода, где мы скрываем картинку, если не выполнено условие:
Область = Макет.ПолучитьОбласть("Заголовок");
// Если условие не выполнено, скрываем объект
Если НЕ НужноВыводитьЛоготип Тогда
Область.Рисунки.ЛоготипКомпании.Видимость = Ложь;
КонецЕсли;
ТабДок.Вывести(Область);
Важно помнить, что если нам необходимо полностью исключить объект из итогового документа, мы можем использовать метод Удалить(). Это полезно, когда объектов много и скрытые элементы могут излишне увеличивать размер файла (например, при сохранении в PDF).
// Полное удаление рисунка из области
Область.Рисунки.Удалить(Область.Рисунки.ЛоготипКомпании);
Этот метод считается более профессиональным и гибким, так как он позволяет не просто скрывать объект, а динамически подставлять в него любые изображения из информационной базы (например, из справочника «Номенклатура» или «Присоединенные файлы»).
Разберем алгоритм настройки:
ФотоТовара.Картинка.Посмотрим на пример реализации:
Область = Макет.ПолучитьОбласть("Строка");
// Предположим, что ДанныеСтроки.Ссылка - это ссылка на номенклатуру
Если ЗначениеЗаполнено(ДанныеСтроки.Ссылка.ОсновноеИзображение) Тогда
// Получаем картинку из хранилища значений
КартинкаИзБазы = ДанныеСтроки.Ссылка.ОсновноеИзображение.Хранилище.Получить();
Область.Рисунки.ФотоТовара.Картинка = КартинкаИзБазы;
Иначе
// Если картинки нет, скрываем контейнер
Область.Рисунки.ФотоТовара.Видимость = Ложь;
КонецЕсли;
ТабДок.Вывести(Область);
Этот подход избавляет от необходимости плодить множество областей макета под каждый тип изображения.
Выясним причину популярности этого метода среди начинающих разработчиков. Он прост в визуальной настройке, но менее эффективен при большом количестве условий. Суть заключается в создании нескольких версий одной и той же области в макете: одна с картинкой, другая — без нее. Для изучения реализации подобного функционала подойдёт пример внешней печатной формы с выводом печати и подписей на БСП.
Рассмотрим ситуацию, когда нам нужно вывести заголовок счета либо с печатью организации, либо без нее:
Если ВыводитьСПечатью Тогда
Область = Макет.ПолучитьОбласть("ЗаголовокСПечатью");
Иначе
Область = Макет.ПолучитьОбласть("ЗаголовокБезПечати");
КонецЕсли;
ТабДок.Вывести(Область);
Важный нюанс: как заметили участники обсуждения на форуме, если картинка находится внутри области, которую вы выводите, она «приедет» в табличный документ вместе с ней. Поэтому манипуляции с видимостью (как в способе 1) нужно производить строго между вызовом метода ПолучитьОбласть() и Вывести(). Если вы попытаетесь изменить видимость в макете после того, как область уже была выведена в ТабДок, это не повлияет на уже отрисованные данные.
Иногда местоположение картинки заранее неизвестно. В этом случае мы можем не добавлять рисунок в макет заранее, а создать его полностью программно. Мы задаем координаты в привязке к ячейкам (строкам и колонкам) сформированного документа.
Проанализируем пример кода:
// Добавляем новый объект "Рисунок" в табличный документ
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Картинка = БиблиотекаКартинок.ВажноеСобытие;
// Указываем, какие ячейки будет занимать картинка (стр1, кол1, стр2, кол2)
НовыйРисунок.Расположить(ТабДок.Область("R5C2:R10C4"));
// Дополнительные настройки оформления
НовыйРисунок.ГраницаСверху = Ложь;
НовыйРисунок.ГраницаСнизу = Ложь;
НовыйРисунок.РазмерКартинки = РазмерКартинки.АвтоРазмер;
Если изображение не требует сложного позиционирования и должно находиться строго внутри ячейки, можно использовать свойство Картинка объекта ОбластьЯчеекТабличногоДокумента. Это более лаконичный способ, если вам нужно просто показать небольшую иконку (например, индикатор статуса).
Посмотрим, как управлять этим свойством:
ОбластьЯчейки = ТабДок.Область(5, 5); // Обращаемся к конкретной ячейке
Если Статус = Истина Тогда
ОбластьЯчейки.Картинка = БиблиотекаКартинок.Выполнено;
Иначе
// Чтобы "скрыть" картинку, присваиваем пустой объект
ОбластьЯчейки.Картинка = Новый Картинка;
КонецЕсли;
Разберем основные моменты, на которых спотыкаются разработчики:
Макет.Рисунки.Имя.Видимость не даст результата для уже выведенных областей. Нужно менять свойства объекта в полученной копии области.Логотип1, Логотип2). Всегда проверяйте свойства имен после копирования.Таким образом, для простых задач (показать/скрыть один логотип) лучше всего подходит Способ 1. Для сложных отчетов с выводом множества разных изображений (каталоги товаров, галереи) рекомендуется использовать Способ 2 с параметрами.