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

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

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

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

Разбор основной ошибки: Макет против Области

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

Если изменять свойства рисунков в самом макете (например, Макет.Рисунки.Картинка1.ВыводитьНаПечать = Ложь), это может не возыметь мгновенного действия на уже полученную область или, что еще хуже, заблокировать вывод этой картинки для всех последующих итераций печати. Правильный подход — всегда работать с объектом, который вернул метод ПолучитьОбласть().

Решение №1: Программное удаление рисунков из области

Наиболее надежный способ оставить в области только нужную картинку — это физическое удаление лишних объектов из коллекции Рисунки конкретной области перед её выводом в ТабличныйДокумент. Разберем этот процесс по шагам.

Предположим, у нас есть область «ОбластьПечать», в которой созданы два рисунка с именами «КартинкаОрг» и «КартинкаИП». Нам нужно оставить только одну из них в зависимости от ИНН организации.


// 1. Получаем макет из метаданных или через менеджер печати
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.СверкаВзаиморасчетов.ПФ_MXL_АктСверки");

// 2. Получаем конкретную область макета
ОбластьКартинка = Макет.ПолучитьОбласть("ОбластьПечать");

// 3. Проверяем условие и удаляем ненужный объект
Если СведенияОбОрганизации.ИНН = "145456455" Тогда
    // Если это основная организация, удаляем картинку для ИП
    Если ОбластьКартинка.Рисунки.Найти("КартинкаИП") <> Неопределено Тогда
        ОбластьКартинка.Рисунки.Удалить(ОбластьКартинка.Рисунки.КартинкаИП);
    КонецЕсли;
Иначе
    // В противном случае удаляем основную картинку
    Если ОбластьКартинка.Рисунки.Найти("КартинкаОрг") <> Неопределено Тогда
        ОбластьКартинка.Рисунки.Удалить(ОбластьКартинка.Рисунки.КартинкаОрг);
    КонецЕсли;
КонецЕсли;

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

Важный момент: использование метода Удалить() гарантирует, что в результирующий ТабличныйДокумент попадет только тот графический объект, который соответствует условию. Это исключает любые проблемы с «фантомным» отображением скрытых рисунков.

Решение №2: Использование разных областей в макете

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

Рассмотрим алгоритм реализации этого метода:

  1. В макете создаем две разные области, например, «ОбластьЛоготипТип1» и «ОбластьЛоготипТип2».
  2. В каждую область помещаем соответствующий рисунок.
  3. В коде используем простую логику выбора области для вывода.

Если ЭтоИндивидуальныйПредприниматель Тогда
    ОбластьДляВывода = Макет.ПолучитьОбласть("ОбластьЛоготипТип2");
Иначе
    ОбластьДляВывода = Макет.ПолучитьОбласть("ОбластьЛоготипТип1");
КонецЕсли;

// Заполняем параметры области, если они есть
// ОбластьДляВывода.Параметры.Заполнить(Данные);

ТабличныйДокумент.Вывести(ОбластьДляВывода);

Этот метод считается наиболее «чистым», так как мы не манипулируем составом объектов программно, а используем штатные средства платформы 1С по выводу секций макета.

Решение №3: Метод «Одной картинки-заглушки»

Существует еще более изящный способ, который часто применяется в типовых конфигурациях. Вместо того чтобы плодить в макете множество рисунков и управлять их видимостью, мы создаем один пустой объект-рисунок (рамку) и программно подставляем в него нужные двоичные данные картинки.

Разберем, как это реализовать:

  1. Добавим в макет один рисунок типа «Картинка» и дадим ему имя, например, ДинамическийЛоготип.
  2. В коде определим, какое изображение нам нужно вывести.
  3. Присвоим это изображение свойству Картинка объекта рисунка внутри области.

Область = Макет.ПолучитьОбласть("Заголовок");

// Предположим, картинка хранится в справочнике Организации
ДанныеКартинки = СведенияОбОрганизации.Организация.Логотип.Получить(); 

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

ТабличныйДокумент.Вывести(Область);

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

Технические нюансы и рекомендации

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

1. Форматы изображений и прозрачность. При использовании печатей и подписей, которые должны накладываться на текст или сетку таблицы, всегда используйте формат PNG с поддержкой прозрачности (альфа-канал). В свойствах рисунка в макете обязательно установите параметр Узор в значение «Прозрачный».

2. Метод Расположить(). Если вы добавляете рисунок программно (через Область.Рисунки.Добавить()), используйте метод Расположить(ОбластьЯчеек). Это позволит привязать картинку к конкретным координатам (строкам и колонкам) макета, чтобы она не «уплыла» при изменении шрифтов или ширины колонок пользователем.

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

4. Проверка на пустые значения. Перед выводом области всегда проверяйте наличие данных картинки. Попытка установить в Область.Рисунки.Имя.Картинка значение Неопределено может привести к тому, что в печатной форме останется картинка от предыдущего документа в очереди печати или возникнет ошибка отображения.

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

← На главную