Как настроить колонтитулы в отчете СКД на управляемых формах в 1С?

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

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

Способ 1. Установка свойств колонтитулов в обработчике ПриКомпоновкеРезультата

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

Посмотрим на пример реализации в модуле объекта:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Включаем отображение нижнего колонтитула
    ДокументРезультат.НижнийКолонтитул.Выводить = Истина;
    
    // Начинаем вывод колонтитула со второй страницы (чтобы титульный лист остался чистым)
    ДокументРезультат.НижнийКолонтитул.НачальнаяСтраница = 2;
    
    // Задаем шаблоны текста с макроподстановками
    ДокументРезультат.НижнийКолонтитул.ТекстВЦентре = "Стр. [&НомерСтраницы] из [&СтраницВсего]";
    ДокументРезультат.НижнийКолонтитул.ТекстСправа = "Дата: [&Дата] [&Время]";
    
    // Оставляем СтандартнаяОбработка = Истина, платформа выведет отчет автоматически
    
КонецПроцедуры

#КонецЕсли

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

Способ 2. Полное программное формирование отчета с учетом пользовательских настроек

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

Разберем по шагам, как выглядит корректный код программного вывода:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    ДокументРезультат.Очистить();
    
    // Получаем текущие настройки схемы
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Формируем макет компоновки с передачей пользовательских настроек
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(
        СхемаКомпоновкиДанных, 
        Настройки, 
        ДанныеРасшифровки, , , 
        Ложь, 
        КомпоновщикНастроек.ПользовательскиеНастройки
    );
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // Настраиваем параметры колонтитулов
    ДокументРезультат.НижнийКолонтитул.Выводить = Истина;
    ДокументРезультат.НижнийКолонтитул.НачальнаяСтраница = 2;
    ДокументРезультат.НижнийКолонтитул.ТекстВЦентре = "Стр. [&НомерСтраницы] из [&СтраницВсего]";
    ДокументРезультат.НижнийКолонтитул.ТекстСправа = "Дата печати: [&Дата]/[&Время]";
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

#КонецЕсли

Обратите внимание: если в метод Выполнить объекта КомпоновщикМакетаКомпоновкиДанных не передать КомпоновщикНастроек.ПользовательскиеНастройки, отчет сформируется по исходным настройкам схемы, проигнорировав изменения пользователя на форме.

Способ 3. Настройка через управляемую форму отчета

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

  1. Программно в модуле формы: в обработчике ПриСозданииНаСервере можно обратиться к реквизиту формы, отображающему отчет (обычно Результат или ОтчетТабличныйДокумент):
    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Элементы.Результат.НижнийКолонтитул.Выводить = Истина;
        Элементы.Результат.НижнийКолонтитул.ТекстВЦентре = "Стр. [&НомерСтраницы] из [&СтраницВсего]";
    КонецПроцедуры
    
  2. Интерактивно: в палитре свойств элемента формы типа ПолеТабличногоДокумента раскрыть группу свойств НижнийКолонтитул или ВерхнийКолонтитул и установить флаг отображения, а также требуемый текст.

Служебные макроподстановки и параметры оформления

Рассмотрим специальные теги, которые платформа 1С автоматически заменяет на системные значения в свойствах ТекстСлева, ТекстВЦентре и ТекстСправа:

  1. [&НомерСтраницы] — текущий порядковый номер страницы.
  2. [&СтраницВсего] — общее число страниц в сформированном документе.
  3. [&Дата] — системная дата на момент печати/формирования.
  4. [&Время] — текущее системное время.
  5. [&Пользователь] — имя текущего пользователя информационной базы.
  6. [&Раздел] и [&НомерРаздела] — наименование и порядковый номер текущего раздела отчета.
  7. [&НомерСтраницыВРазделе] и [&СтраницВРазделе] — нумерация листов в рамках отдельного раздела.

Дополнительно для объектов ВерхнийКолонтитул и НижнийКолонтитул можно управлять шрифтом (свойство Шрифт), позиционированием (свойство ВертикальноеПоложение) и раздельной печатью для четных и нечетных страниц с помощью свойства ЧетныеНечетные.

← На главную