Как программно скрыть или заменить картинку в макете 1С

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

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

Способ 1: Управление видимостью через коллекцию рисунков

Самый прямой способ управления графикой в макете — обращение к объекту через коллекцию Рисунки табличного документа. Каждый графический объект, добавленный в макет вручную через меню «Таблица — Рисунки — Вставить картинку», получает уникальное имя.

Рассмотрим по шагам, как реализовать этот метод:

  1. Откроем макет и выделим добавленную картинку.
  2. В свойствах картинки на закладке Другие найдем поле Имя и зададим понятный идентификатор, например, ЛоготипКомпании.
  3. В коде формирования печатной формы обратимся к этому свойству.

Проанализируем пример кода, где мы скрываем картинку, если не выполнено условие:


Область = Макет.ПолучитьОбласть("Заголовок");
// Если условие не выполнено, скрываем объект
Если НЕ НужноВыводитьЛоготип Тогда
    Область.Рисунки.ЛоготипКомпании.Видимость = Ложь;
КонецЕсли;
ТабДок.Вывести(Область);

Важно помнить, что если нам необходимо полностью исключить объект из итогового документа, мы можем использовать метод Удалить(). Это полезно, когда объектов много и скрытые элементы могут излишне увеличивать размер файла (например, при сохранении в PDF).


// Полное удаление рисунка из области
Область.Рисунки.Удалить(Область.Рисунки.ЛоготипКомпании);

Способ 2: Использование картинки как параметра

Этот метод считается более профессиональным и гибким, так как он позволяет не просто скрывать объект, а динамически подставлять в него любые изображения из информационной базы (например, из справочника «Номенклатура» или «Присоединенные файлы»).

Разберем алгоритм настройки:

  1. В свойствах рисунка в макете установим флажок Параметр.
  2. В поле Текст/Параметр укажем имя переменной, например, ФотоТовара.
  3. В программном коде передадим в этот параметр объект типа Картинка.

Посмотрим на пример реализации:


Область = Макет.ПолучитьОбласть("Строка");
// Предположим, что ДанныеСтроки.Ссылка - это ссылка на номенклатуру
Если ЗначениеЗаполнено(ДанныеСтроки.Ссылка.ОсновноеИзображение) Тогда
    // Получаем картинку из хранилища значений
    КартинкаИзБазы = ДанныеСтроки.Ссылка.ОсновноеИзображение.Хранилище.Получить();
    Область.Рисунки.ФотоТовара.Картинка = КартинкаИзБазы;
Иначе
    // Если картинки нет, скрываем контейнер
    Область.Рисунки.ФотоТовара.Видимость = Ложь;
КонецЕсли;
ТабДок.Вывести(Область);

Этот подход избавляет от необходимости плодить множество областей макета под каждый тип изображения.

Способ 3: Разделение макета на разные секции (области)

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

Рассмотрим ситуацию, когда нам нужно вывести заголовок счета либо с печатью организации, либо без нее:


Если ВыводитьСПечатью Тогда
    Область = Макет.ПолучитьОбласть("ЗаголовокСПечатью");
Иначе
    Область = Макет.ПолучитьОбласть("ЗаголовокБезПечати");
КонецЕсли;
ТабДок.Вывести(Область);

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

Способ 4: Программное добавление рисунка в нужные координаты

Иногда местоположение картинки заранее неизвестно. В этом случае мы можем не добавлять рисунок в макет заранее, а создать его полностью программно. Мы задаем координаты в привязке к ячейкам (строкам и колонкам) сформированного документа.

Проанализируем пример кода:


// Добавляем новый объект "Рисунок" в табличный документ
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Картинка = БиблиотекаКартинок.ВажноеСобытие;

// Указываем, какие ячейки будет занимать картинка (стр1, кол1, стр2, кол2)
НовыйРисунок.Расположить(ТабДок.Область("R5C2:R10C4"));

// Дополнительные настройки оформления
НовыйРисунок.ГраницаСверху = Ложь;
НовыйРисунок.ГраницаСнизу = Ложь;
НовыйРисунок.РазмерКартинки = РазмерКартинки.АвтоРазмер;

Способ 5: Использование фоновых картинок ячеек

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

Посмотрим, как управлять этим свойством:


ОбластьЯчейки = ТабДок.Область(5, 5); // Обращаемся к конкретной ячейке
Если Статус = Истина Тогда
    ОбластьЯчейки.Картинка = БиблиотекаКартинок.Выполнено;
Иначе
    // Чтобы "скрыть" картинку, присваиваем пустой объект
    ОбластьЯчейки.Картинка = Новый Картинка;
КонецЕсли;

Типичные ошибки при работе с рисунками в макетах

Разберем основные моменты, на которых спотыкаются разработчики:

Таким образом, для простых задач (показать/скрыть один логотип) лучше всего подходит Способ 1. Для сложных отчетов с выводом множества разных изображений (каталоги товаров, галереи) рекомендуется использовать Способ 2 с параметрами.

← На главную