При формировании печатных форм часто возникает задача: разместить фирменный бланк, подложку или водяной знак строго на первой странице документа, оставив последующие страницы с обычным белым фоном. Разберем особенности платформы 1С, из-за которых стандартные средства вызывают трудности, и рассмотрим проверенные практические решения этой задачи.
В объекте ТабличныйДокумент есть стандартное свойство ФоноваяКартинка. Однако оно применяется глобально ко всему документу. Если документ содержит несколько страниц, заданное изображение продублируется на каждой из них. Штатного параметра, ограничивающего действие этого свойства диапазоном строк или номерами страниц, в платформе не предусмотрено.
Вторая сложность связана с Z-порядком слоев табличного документа. Выясним, как платформа отрисовывает элементы:
ФоноваяКартинка самого табличного документа.Рисунки (графические объекты, диаграммы, линии).Если мы попытаемся вставить изображение через коллекцию Рисунки программно или в макете, то столкнемся с тем, что графический объект перекроет собой текст ячеек. Команда изменения порядка «На задний план» действует только внутри самой коллекции графических фигур и не позволяет опустить изображение под стандартные ячейки таблицы.
Наиболее надежный и архитектурно правильный способ в 1С — разделение печатной формы на два независимых табличных документа с последующим объединением их в пакет. Рассмотрим этот подход подробнее.
Создаем первый табличный документ ровно на одну страницу и устанавливаем для него персональное свойство ФоноваяКартинка. Все остальные страницы выводим во второй табличный документ без фона. Затем объединяем их с помощью объекта ПакетОтображаемыхДокументов.
Посмотрим на пример программной реализации:
// Формируем первую страницу с фоном
ТабДокСтр1 = Новый ТабличныйДокумент;
ТабДокСтр1.ФоноваяКартинка = БиблиотекаКартинок.ФирменныйБланк;
ТабДокСтр1.РежимОтображенияФоновойКартинки = РежимОтображенияФоновойКартинки.Авто;
ОбластьТитул = Макет.ПолучитьОбласть("ШапкаПервойСтраницы");
// Заполнение параметров области
ТабДокСтр1.Вывести(ОбластьТитул);
// Формируем остальные страницы без фона
ТабДокОстальное = Новый ТабличныйДокумент;
ОбластьДанные = Макет.ПолучитьОбласть("СтрокаТаблицы");
Для Каждого Стр Из ТаблицаДанных Цикл
// Заполнение параметров
ТабДокОстальное.Вывести(ОбластьДанные);
КонецЦикла;
// Объединяем документы в единое задание для печати и просмотра
Пакет = Новый ПакетОтображаемыхДокументов;
ЭлементСостава1 = Пакет.Состав.Добавить();
ЭлементСостава1.Данные = ПоместитьВоВременноеХранилище(ТабДокСтр1, Новый УникальныйИдентификатор);
ЭлементСостава2 = Пакет.Состав.Добавить();
ЭлементСостава2.Данные = ПоместитьВоВременноеХранилище(ТабДокОстальное, Новый УникальныйИдентификатор);
// Пакет можно вывести пользователю или сразу отправить на печать
Пакет.Показать("Печатная форма");
Часто возникает ситуация, когда объем информации на первой странице непостоянен (например, длинный юридический адрес или динамический состав реквизитов). В этом случае важно точно знать момент, когда место на первой странице заканчивается, чтобы данные не перетекли на вторую страницу подложки.
Для решения этой задачи используем метод ПроверитьВывод(). Проанализируем алгоритм динамического вывода строк:
МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьДанных);
// Проверяем, поместится ли следующая строка на текущую страницу
Если НЕ ТабДок.ПроверитьВывод(МассивПроверки) Тогда
// Если первая страница заполнилась, переходим к выводу на вторую
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
// Либо здесь переключаемся на заполнение второго табличного документа
КонецЕсли;
ТабДок.Вывести(ОбластьДанные);
Также полезно использовать свойство ТабличныйДокумент.КоличествоСтраниц() для контроля текущего состояния документа после вывода очередной секции.
Если требуется сохранить единый табличный документ без использования пакетов, можно применить обходной прием с организацией слоев внутри коллекции графических фигур:
Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Лево = 0;
Рисунок.Верх = 0;
Рисунок.Ширина = 210; // Соответствует формату А4 в миллиметрах
Рисунок.Высота = 297;
Рисунок.Картинка = БиблиотекаКартинок.ФонБланка;
Рисунки.Если печатная форма формируется для последующей выгрузки и редактирования в формате Microsoft Word, наложение подложки можно делегировать офисному пакету через COM-соединение.
Разберем основные шаги реализации через VBA-модель Word:
ActiveDocument.PageSetup.DifferentFirstPageHeaderFooter = True.
Ворд = Новый COMОбъект("Word.Application");
Документ = Ворд.Documents.Open(ПутьКФайлу);
Документ.PageSetup.DifferentFirstPageHeaderFooter = Истина;
Колонтитул = Документ.Sections(1).Headers(wdHeaderFooterFirstPage); // Константа wdHeaderFooterFirstPage = 2
// Добавляем фигуру в колонтитул с положением за текстом
РисунокВорд = Колонтитул.Shapes.AddPicture(ПутьКФайлуПодложки, Ложь, Истина);
РисунокВорд.WrapFormat.Type = 3; // wdWrapNone (за текстом)
Такой подход полностью изолирует подложку от структуры табличного документа 1С и гарантирует её отображение строго на первой странице созданного файла.