При разработке печатных форм, таких как сертификаты, грамоты или бланки строгой отчетности, часто возникает необходимость разместить на макете рамку или другой фоновый элемент в виде изображения. Стандартная проблема, с которой сталкиваются разработчики: после вставки картинки в редакторе макетов MXL, она располагается поверх ячеек и блокирует доступ к тексту для редактирования. Давайте разберем, почему так происходит и какие существуют способы решения этой задачи.
Причина проблемы кроется в том, что объект "Картинка" в редакторе макетов является отдельным слоем, который накладывается поверх сетки ячеек. Стандартные свойства вроде "Порядок" (на задний/передний план) управляют взаимным расположением нескольких объектов-картинок, но не их положением относительно ячеек макета. Картинка всегда будет сверху. Рассмотрим несколько подходов, от самых простых "ручных" до наиболее правильных программных.
Это самый профессиональный и гибкий подход. Его суть заключается в том, чтобы вообще не размещать картинку в макете в режиме Конфигуратора. Вместо этого мы будем назначать ее в качестве фона для уже сформированного табличного документа программно. Это полностью решает проблему редактирования, так как в макете рамки просто нет.
Разберем по шагам:
Подготовка макета. Откройте ваш макет MXL в Конфигураторе. Если вы уже вставили картинку с рамкой, выделите ее и удалите. Весь текст и поля для заполнения должны быть легко доступны.
Добавление картинки. Вашу рамку необходимо сохранить в конфигурации как отдельный объект. Для этого в дереве конфигурации найдите ветку "Общие" -> "Макеты". Создайте новый макет с типом "Картинка" и загрузите в него ваше изображение рамки. Дайте ему понятное имя, например, "РамкаСертификата".
Программная установка фона. В модуле, где формируется ваша печатная форма, найдите код, который выводит данные в табличный документ (объект ТабличныйДокумент). После того как все области макета выведены и документ полностью готов, добавьте одну строку кода, которая установит фоновое изображение.
Посмотрим на пример. Допустим, ваша переменная табличного документа называется ТабДок.
// ... здесь идет ваш код по формированию документа
// Например, получение областей и вывод в цикле
ТабДок.Вывести(ОбластьШапка);
ТабДок.Вывести(ОбластьСодержимое);
ТабДок.Вывести(ОбластьПодвал);
// После того, как ВЕСЬ документ сформирован, устанавливаем фон
ТабДок.ФоноваяКартинка = ПолучитьОбщийМакет("РамкаСертификата");
Важные моменты и доработки:
Фиксация фона. Чтобы рамка не прокручивалась вместе с содержимым, если оно занимает больше одной страницы, установите свойство ФиксированныйФон в значение Истина.
ТабДок.ФоноваяКартинка = ПолучитьОбщийМакет("РамкаСертификата");
ТабДок.ФиксированныйФон = Истина;
Обрезка фона. Иногда фоновая картинка может обрезаться по границе последней выведенной строки. Если, например, сертификат заполнен наполовину, рамка может не доходить до низа страницы. Чтобы этого избежать, можно принудительно расширить область печати, добавив несколько пустых строк, чтобы фон гарантированно занял всю страницу.
Этот метод является предпочтительным, так как он разделяет данные (текст в ячейках) и оформление (рамка), что делает макет чистым и удобным для поддержки.
Этот способ похож на предыдущий, но дает больше контроля над положением и размером картинки. Мы так же работаем с "чистым" макетом без рамки, но добавляем ее не как фон, а как отдельный объект-рисунок в коллекцию рисунков уже сформированного табличного документа.
Как это работает:
В конце процедуры формирования печатной формы мы программно создаем новый рисунок, загружаем в него нашу картинку из общего макета и точно позиционируем его поверх ячеек. Этот метод полезен, если рамку нужно сместить, масштабировать или наложить поверх определенных ячеек, а не всей страницы.
Посмотрим на пример кода:
// ТабДок - это ваш уже сформированный табличный документ
// Добавляем новый рисунок в коллекцию рисунков документа
РисунокРамка = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// Загружаем картинку из общего макета
РисунокРамка.Картинка = ПолучитьОбщийМакет("РамкаСертификата");
// Устанавливаем точное положение рисунка
// Координаты задаются через указание верхней, левой, нижней и правой ячеек
// Например, растянем рамку на всю первую страницу (приблизительно)
ВерхняяЯчейка = ТабДок.Область("R1C1");
НижняяЯчейка = ТабДок.Область("R50C20");
РисунокРамка.Расположить(ВерхняяЯчейка, ВерхняяЯчейка, НижняяЯчейка, НижняяЯчейка);
// Можно также настроить прозрачность, размер и другие свойства
РисунокРамка.РазмерКартинки = РазмерКартинки.Растянуть;
Этот способ более сложен в настройке, но предоставляет максимальный контроль над результатом.
Если вам нужно внести разовые правки и не хочется лезть в код, можно воспользоваться простыми приемами прямо в редакторе макетов.
Самый очевидный, но эффективный метод. Идея в том, чтобы убрать картинку на время редактирования текста, а потом вернуть ее на место.
Ctrl+X (Вырезать), чтобы скопировать картинку в буфер обмена и одновременно удалить ее из макета.Ctrl+V (Вставить). Картинка вернется на свое прежнее место.Этот способ идеально подходит для редких правок, когда нецелесообразно переделывать механизм формирования печатной формы.
Даже если ячейка визуально перекрыта картинкой, она все еще существует в структуре макета и на нее можно "перейти" с помощью клавиатуры.
Tab (для перехода к следующей ячейке) и Shift+Tab (для перехода к предыдущей), чтобы переместить фокус на нужную, пусть и невидимую, ячейку.Этот метод может не сработать в случае сложного объединения ячеек, но в большинстве простых случаев он позволяет быстро поправить текст, не трогая картинку.