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