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

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

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

Почему стандартный перенос на задний план не работает?

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

  1. Сетка ячеек табличного документа (нижний слой). Здесь располагаются обычные текстовые данные, параметры, формулы, границы ячеек и их заливка.
  2. Графический слой рисунков (верхний слой). Сюда помещаются все объекты, которые создаются через меню «Таблица — Рисунки». Это могут быть картинки, диаграммы, геометрические фигуры и графические надписи (объекты типа «Текст»).

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

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

---

Способ 1. Использование графического объекта «Текст» поверх объекта «Картинка»

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

Разберем этот метод по шагам:

  1. Откроем макет печатной формы в конфигураторе.
  2. Добавим картинку (логотип): перейдем в меню Таблица — Рисунки — Картинка, выберем нужный файл и разместим его в макете.
  3. Добавим графический текст: перейдем в меню Таблица — Рисунки — Текст. Нарисуем текстовую область непосредственно поверх нашей картинки.
  4. Настроим свойства созданного текстового рисунка. Для этого вызовем палитру свойств (F4) для текстового объекта:
    • В свойстве Линия выберем значение Нет линии, чтобы убрать рамку вокруг текста.
    • В свойстве Узор установим значение Без узора (или прозрачный фон), чтобы картинка под текстом не перекрывалась сплошным белым фоном.
    • В свойстве Тип значения при необходимости укажем Шаблон или Параметр для динамического заполнения данными из кода.
  5. Настроим взаимное расположение объектов. Выделим картинку, нажмем правую кнопку мыши и выберем Порядок — На задний план. Выделим текстовый рисунок и выберем Порядок — На передний план.

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

Представим ситуацию, когда нам нужно вывести длинное наименование и автоматически уменьшить шрифт графического текста, если строка превышает 120 символов. Назовем наш графический объект текста в макете именем D3. Код управления в модуле будет выглядеть следующим образом:


// Получаем область макета, в которой расположены наши графические объекты
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");

// Проверяем длину выводимого текста
Если СтрДлина(Фурнитура) > 120 Тогда
    // Создаем новый шрифт меньшего размера (например, 7 пункт)
    ШрифтСжатый = Новый Шрифт(ОбластьШапки.Рисунки.D3.Шрифт, , 7);
    // Применяем шрифт непосредственно к графическому объекту Текст
    ОбластьШапки.Рисунки.D3.Шрифт = ШрифтСжатый;
КонецЕсли;

// Заполняем текст параметра внутри графического объекта
ОбластьШапки.Рисунки.D3.Текст = Фурнитура;

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

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

---

Способ 2. Использование свойства «ФоноваяКартинка» табличного документа

Если вам требуется разместить логотип или водяной знак (например, надпись «КОПИЯ» или «ОПЛАЧЕНО») под всей печатной формой целиком, лучшим решением будет использование штатного свойства ФоноваяКартинка объекта ТабличныйДокумент. Если же вам необходимо наносить аналогичные штампы на уже сформированные и сохраненные файлы, можно использовать обработку для добавления штампа или текста в PDF средствами 1С.

В этом случае картинка действительно уходит на самый нижний слой под сетку ячеек. Однако здесь есть важные нюансы позиционирования, которые необходимо учитывать.

Рассмотрим особенности работы с фоновым изображением:

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


// Создаем объект Картинка из библиотеки или загружаем из внешнего источника/макета
КартинкаФона = ПолучитьМакет("ЛоготипФон").ПолучитьКартинку();

// Устанавливаем картинку в качестве фона табличного документа
ТабличныйДокумент.ФоноваяКартинка = КартинкаФона;

Важное предупреждение: Фоновая картинка в 1С отображается только в пределах выведенных ячеек табличного документа. Если ваша печатная форма содержит всего несколько строк, фоновый рисунок ниже этих строк просто обрежется. Чтобы этого избежать, разработчики заполняют оставшуюся часть страницы пустыми строками.

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


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

// Получаем пустую строку-шаблон для заполнения листа
ПустаяСтрока = Макет.ПолучитьОбласть("ПустаяСтрока");

// Заполняем страницу до конца, проверяя возможность вывода
Пока ТабличныйДокумент.ПроверитьВывод(ПустаяСтрока) Цикл
    ТабличныйДокумент.Вывести(ПустаяСтрока);
КонецЦикла;

---

Рекомендации по выбору формата графики

Для достижения наилучшего качества печати и корректного отображения прозрачности следуйте простым правилам выбора формата файлов:

← На главную