При формировании печатных форм в 1С:Предприятии разработчики часто сталкиваются с требованием заказчика вывести логотипы или сложные графические элементы в верхней и нижней части каждой страницы. Стандартный механизм ТабличныйДокумент.ВерхнийКолонтитул и НижнийКолонтитул поддерживает только текстовые данные и служебные символы (номер страницы, дата и т. д.). Вывести туда полноценное изображение невозможно. В этой статье мы подробно разберем, как обойти это ограничение, используя программные методы управления выводом.
Проблема вывода графических колонтитулов распадается на две части. Во-первых, нам нужно заставить изображение повторяться на каждом печатном листе. Во-вторых, необходимо обеспечить «прижатие» нижнего колонтитула к самому краю страницы, даже если на листе выведено всего несколько строк данных. Если просто вывести область с картинкой после строк, она «всплывет» на середину листа, что нарушит визуальную структуру документа.
Для верхней части страницы (шапки с логотипом) в 1С предусмотрен достаточно простой штатный механизм. Мы можем назначить определенные строки макета повторяющимися. Рассмотрим этот процесс по шагам:
ПовторятьПриПечатиСтроки.Проанализируем пример кода:
ТабДок.ПовторятьПриПечатиСтроки = ТабДок.Область(1, , ОбластьШапки.ВысотаТаблицы, );
Этот способ эффективен для заголовков, но для нижних колонтитулов аналогичного свойства «снизу» не существует. Поэтому нам придется реализовать ручной контроль заполнености страницы.
Метод ПроверитьВывод() позволяет заранее узнать, поместится ли массив областей на текущую страницу с учетом заданных полей и настроек принтера. Это ключевой инструмент для нашей задачи. Мы будем собирать в массив текущую строку данных и область нашего нижнего колонтитула.
Разберем логику работы: перед выводом каждой строки основной таблицы мы спрашиваем систему: «Поместится ли эта строка ВМЕСТЕ с нижним колонтитулом на текущий лист?». Если ответ «Нет», значит, пора выводить подвал, делать разрыв страницы и начинать новый лист.
Рассмотрим пример функции, которая выполняет такую проверку:
Процедура ВывестиСтрокуСКонтролем(ТабличныйДокумент, Макет, ТекущаяСтрока)
ОбластьВерх = Макет.ПолучитьОбласть("ВерхнийКолонтитул");
ОбластьНиз = Макет.ПолучитьОбласть("НижнийКолонтитул");
// Формируем массив для проверки
МассивДляПроверки = Новый Массив;
МассивДляПроверки.Добавить(ТекущаяСтрока);
МассивДляПроверки.Добавить(ОбластьНиз);
Если Не ТабличныйДокумент.ПроверитьВывод(МассивДляПроверки) Тогда
// Если не влезает, выводим подвал на текущей странице
ТабличныйДокумент.Вывести(ОбластьНиз);
// Переходим на новую страницу
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
// Выводим шапку на новой странице
ТабличныйДокумент.Вывести(ОбластьВерх);
КонецЕсли;
// Выводим саму строку данных
ТабличныйДокумент.Вывести(ТекущаяСтрока);
КонецПроцедуры
Вышеописанный метод решает проблему переноса, но не решает проблему «пустого места». Если строк мало, нижний колонтитул будет идти сразу за ними. Чтобы картинка всегда была внизу, мы воспользуемся техникой «дозабивки» страницы пустыми строками.
Идея заключается в следующем: после вывода всех полезных данных мы запускаем цикл, который выводит пустую строку минимальной высоты до тех пор, пока на странице остается место для этой строки и нижнего колонтитула.
Выясним, как это выглядит на практике:
// Предположим, основные данные уже выведены
ОбластьПустаяСтрока = Макет.ПолучитьОбласть("ПустаяСтрока"); // Высота строки в макете, например, 2-3 пункта
ОбластьНиз = Макет.ПолучитьОбласть("НижнийКолонтитул");
Пока Истина Цикл
ПроверочныйМассив = Новый Массив;
ПроверочныйМассив.Добавить(ОбластьПустаяСтрока);
ПроверочныйМассив.Добавить(ОбластьНиз);
Если ТабличныйДокумент.ПроверитьВывод(ПроверочныйМассив) Тогда
ТабличныйДокумент.Вывести(ОбластьПустаяСтрока);
Иначе
Прервать; // Место закончилось, пора выводить подвал
КонецЕсли;
КонецЦикла;
// Теперь выводим финальный графический колонтитул
ТабличныйДокумент.Вывести(ОбластьНиз);
Чтобы наши графические области не искажались и ПроверитьВывод() работал максимально точно, проанализируем настройки самих картинок в макете 1С:
Пропорционально. Это защитит логотип от растягивания, если пользователь изменит масштаб печати в настройках.Создавать области или Вместе со строками. Это гарантирует, что картинка будет жестко привязана к ячейкам макета.
ТабДок.РазмерКолонтитулаСверху = 0;
ТабДок.РазмерКолонтитулаСнизу = 0;
В реальных задачах у нас часто есть титульный лист, который не должен содержать стандартных колонтитулов. В таком случае мы сначала выводим титульную область целиком, делаем ВывестиГоризонтальныйРазделительСтраниц(), и только потом включаем алгоритм проверки для последующих листов.
Также стоит учитывать фоновые изображения. В современных версиях платформы 8.3 появилось свойство ФоноваяКартинка у табличного документа. Если ваша задача — сделать «водяной знак» или сложную рамку по всему периметру листа, этот метод может быть предпочтительнее. Однако для классических верхних и нижних штампов метод с областями и ПроверитьВывод() остается самым надежным и гибким.
Подведем итог: использование ПроверитьВывод() в сочетании с циклом «дозабивки» пустыми строками позволяет имитировать поведение MS Word в табличных документах 1С. Это требует написания дополнительного кода, но обеспечивает безупречный внешний вид печатных форм с использованием любой корпоративной графики. При необходимости можно воспользоваться примером печатной формы Word с заполнением колонтитулов.