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

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

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

Почему стандартная фоновая картинка не подходит для одной страницы

В объекте ТабличныйДокумент есть стандартное свойство ФоноваяКартинка. Однако оно применяется глобально ко всему документу. Если документ содержит несколько страниц, заданное изображение продублируется на каждой из них. Штатного параметра, ограничивающего действие этого свойства диапазоном строк или номерами страниц, в платформе не предусмотрено.

Вторая сложность связана с Z-порядком слоев табличного документа. Выясним, как платформа отрисовывает элементы:

  1. Нижний слой — свойство ФоноваяКартинка самого табличного документа.
  2. Средний слой — сетка, фон ячеек и текст ячеек.
  3. Верхний слой — коллекция Рисунки (графические объекты, диаграммы, линии).

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

Способ 1. Использование объекта ПакетОтображаемыхДокументов

Наиболее надежный и архитектурно правильный способ в 1С — разделение печатной формы на два независимых табличных документа с последующим объединением их в пакет. Рассмотрим этот подход подробнее.

Создаем первый табличный документ ровно на одну страницу и устанавливаем для него персональное свойство ФоноваяКартинка. Все остальные страницы выводим во второй табличный документ без фона. Затем объединяем их с помощью объекта ПакетОтображаемыхДокументов.

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


// Формируем первую страницу с фоном
ТабДокСтр1 = Новый ТабличныйДокумент;
ТабДокСтр1.ФоноваяКартинка = БиблиотекаКартинок.ФирменныйБланк;
ТабДокСтр1.РежимОтображенияФоновойКартинки = РежимОтображенияФоновойКартинки.Авто;

ОбластьТитул = Макет.ПолучитьОбласть("ШапкаПервойСтраницы");
// Заполнение параметров области
ТабДокСтр1.Вывести(ОбластьТитул);

// Формируем остальные страницы без фона
ТабДокОстальное = Новый ТабличныйДокумент;
ОбластьДанные = Макет.ПолучитьОбласть("СтрокаТаблицы");
Для Каждого Стр Из ТаблицаДанных Цикл
    // Заполнение параметров
    ТабДокОстальное.Вывести(ОбластьДанные);
КонецЦикла;

// Объединяем документы в единое задание для печати и просмотра
Пакет = Новый ПакетОтображаемыхДокументов;
ЭлементСостава1 = Пакет.Состав.Добавить();
ЭлементСостава1.Данные = ПоместитьВоВременноеХранилище(ТабДокСтр1, Новый УникальныйИдентификатор);

ЭлементСостава2 = Пакет.Состав.Добавить();
ЭлементСостава2.Данные = ПоместитьВоВременноеХранилище(ТабДокОстальное, Новый УникальныйИдентификатор);

// Пакет можно вывести пользователю или сразу отправить на печать
Пакет.Показать("Печатная форма");

Способ 2. Контроль заполнения первой страницы методом ПроверитьВывод

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

Для решения этой задачи используем метод ПроверитьВывод(). Проанализируем алгоритм динамического вывода строк:


МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьДанных);

// Проверяем, поместится ли следующая строка на текущую страницу
Если НЕ ТабДок.ПроверитьВывод(МассивПроверки) Тогда
    // Если первая страница заполнилась, переходим к выводу на вторую
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    // Либо здесь переключаемся на заполнение второго табличного документа
КонецЕсли;

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

Также полезно использовать свойство ТабличныйДокумент.КоличествоСтраниц() для контроля текущего состояния документа после вывода очередной секции.

Способ 3. Преобразование ячеек в графические надписи макета

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

  1. В макете печатной формы на первой странице очищаем фон и текст обычных ячеек таблицы.
  2. Вставляем графический объект подложки, задаем его размеры и координаты:
    
    Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
    Рисунок.Лево = 0;
    Рисунок.Верх = 0;
    Рисунок.Ширина = 210; // Соответствует формату А4 в миллиметрах
    Рисунок.Высота = 297;
    Рисунок.Картинка = БиблиотекаКартинок.ФонБланка;
    
  3. Весь текст и линии, которые должны выводиться поверх подложки, оформляем не в ячейках, а с помощью графических элементов типа Текст и Линия из коллекции Рисунки.
  4. В свойствах макета для графического объекта подложки вызываем команду изменения порядка и отправляем его на задний план. Поскольку текст теперь также представлен фигурами из коллекции рисунков, он корректно отобразится поверх фоновой иллюстрации.

Способ 4. Добавление подложки при постобработке через MS Word

Если печатная форма формируется для последующей выгрузки и редактирования в формате Microsoft Word, наложение подложки можно делегировать офисному пакету через COM-соединение.

Разберем основные шаги реализации через VBA-модель Word:

  1. В документе Word включается разделение колонтитулов для первой страницы: свойство ActiveDocument.PageSetup.DifferentFirstPageHeaderFooter = True.
  2. Подложка помещается в коллекцию графических фигур верхнего колонтитула первой страницы:
    
    Ворд = Новый COMОбъект("Word.Application");
    Документ = Ворд.Documents.Open(ПутьКФайлу);
    
    Документ.PageSetup.DifferentFirstPageHeaderFooter = Истина;
    Колонтитул = Документ.Sections(1).Headers(wdHeaderFooterFirstPage); // Константа wdHeaderFooterFirstPage = 2
    
    // Добавляем фигуру в колонтитул с положением за текстом
    РисунокВорд = Колонтитул.Shapes.AddPicture(ПутьКФайлуПодложки, Ложь, Истина);
    РисунокВорд.WrapFormat.Type = 3; // wdWrapNone (за текстом)
    

Такой подход полностью изолирует подложку от структуры табличного документа 1С и гарантирует её отображение строго на первой странице созданного файла.

← На главную