Как сделать колонтитулы (итоги) на каждой странице в 1С

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

Как же реализовать вывод подобных колонтитулов или итогов на каждой странице в системе 1С:Предприятие?

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

  • во-первых, мы не можем знать настройки принтера пользователя (а там могут быть разные поля, ориентация страниц и т.п.);
  • во-вторых, размер строк таблицы тоже может быть разным (например, может перенестись на несколько строк длинное наименование товара).

Поэтому разработчики 1С создали функцию, которая проверяет, умещается ли фрагмент, который вы хотите вывести, на страницу. Это функция ПроверитьВывод(). Функция применяется для табличного документа и имеет один параметр:

  • ПроверяемыеТаблицы — это табличный документ (может быть, область макета) или массив табличных документов (областей), которые мы хотим проверить на предмет помещения на одну страницу.

Функция работает следующим образом. Допустим, мы имеем некий табличный документ, в который уже вывели некоторое количество информации. Нам нужно проверить, поместится ли еще одна область с очередной порцией информации на одну страницу, но саму эту область пока не выводить. При этом мы пользуемся следующей конструкцией:

ТабДок.ПроверитьВывод(ОбластьМакета);
//ТабДок - уже имеющийся табличный документ
//Область макета - та область, которую надо проверить

В результате функция ПроверитьВывод() возвращает значение Истина, если область помещается на страницу, и Ложь — если не помещается.

А теперь давайте посмотрим, как применять эту функцию на практике. Допустим, у нас есть некая печатная форма, состоящая из заголовка и таблицы (например, это может быть форма какого-то акта, накладной или счета-фактуры). Наша задача в конце каждой страницы выводить строку с итогами, а в начале каждой новой страницы — шапку таблицы.

Опустим формирование заголовков печатной формы и начнем с вывода строк таблицы.

ТабДок = новый ТабличныйДокумент;

//Тут подготовительные процедуры и формирование заголовка

ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТаблицы");
ОбластьИтогов = Макет.ПолучитьОбласть("ИтогиСтраницы");
ОбластьШапкиТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");

Для каждого Строка из Таблица Цикл

//Тут должно быть заполнение параметров области

//Формируем массив областей для проверки
МассивОбластей = новый Массив;
МассивОбластей.Добавить(ОбластьМакета);
МассивОбластей.Добавить(ОбластьИтогов);

//Проверяем, помещаются ли обе эти области на страницу в табличном документе
Результат = ТабДок.ПроверитьВывод(МассивОбластей);

//Если не помещается, выводим итоги, разделитель страницы и шапку на новой странице
Если Не Результат Тогда

ТабДок.Вывести(ОбластьИтогов);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
ТабДок.Вывести(ОбластьШапкиТаблицы);

КонецЕсли;

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

Немного о том, как работает данный код. При каждом выводе строки таблицы мы проверяем, поместится ли она на странице вместе со строкой итогов. Если поместится, то выводим одну строку таблицы, без итогов. Если не поместится, то выводим итоги (а они поместятся, это мы проверили на предыдущей итерации), разделитель страниц и шапку таблицы в начале новой страницы. Дальше все повторяется.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *