Повторение шапки отчета в начале каждого листа при печати (СКД) + вывод колонтитулов.

Повторение шапки отчета в начале каждого печатного листа при использовании системы компоновки данных (СКД).
Пример выводов колонтитулов.
Направление мысли выдернуто из типовой БП2.0.: ОбщийМодуль.СтандартныеОтчеты.ПолучитьМакетШапки(…). Но в случае использования «Таблицы» (как в примере) эта функция к сожалению не подоходит.


Основная сложность при решении задачи состоит в определении области шапки отчета, которую нужно затем указать в свойстве табличного документа «ПовторятьПриПечатиСтроки».

 

Повторение шапки получается по следующему алгоритму:

1. Когда программно формируем отчетик по СКД имеем в своем распоряжении «Макет компоновки«, определяем в его теле «Макет области макета» (когда платформописатели придумывали имена объектам КД, они наверно хотели окончательно запутать программеров 1С и в без того запутанной компоновке), итак, определяем «Макет области макета», из которого будет формироваться шапка отчета, путем его нехитрого анализа (это лучше один раз поглядеть в функции «ПолучитьМакетШапки», чем писать много слов).

2. При выводе отчета «по элементно» анализируем «Элементы вывода компоновки» и высоту табличного документа (Результата), откуда определяем первую и последнюю строчку «Шапки отчета».

3. ОбластьШапки = ТабличныйДокумент.Область(НачальнаяСтрокаШапки, , КонечнаяСтрокаШапки).

4. ТабличныйДокумент.ПовторятьПриПечатиСтроки = ОбластьШапки.

Ну, вот и все. Дело в шляпе!!!

 

Колонтитулы это просто.

Примерный код:

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

// Нижний колонтитул ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.Шрифт = Новый Шрифт(Результат.ВерхнийКолонтитул.Шрифт, , , , Истина);
ТабДок.НижнийКолонтитул.ТекстВЦентре = "Заголовок отчета";

29 Comments

  1. _qqq

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

    Андрей Андревич, есть ли способ доработать Ваш алгоритм в этом направлении?

    Reply ↓
  2. link_l

    спасибо, помогло =)

    Reply ↓
  3. nalivai-chai

    (1) _qqq, добавил пример с выводом страниц. (колонтитулы)

    Reply ↓
  4. KliMich

    Спасибо, зачастую это крайне необходимо (особенно при массивных отчетах)

    Reply ↓
  5. unis

    Мне как раз это нужно!!! спасибо за обработку!!!

    Reply ↓
  6. Rustig

    спасибо, работает

    Reply ↓
  7. Yury1001

    Где то я это уже видел…

    …а, точно, это ж Гилёв Профессиональная работа с СКД, бонус проекта Spec8.ru, 81-82 файлы 😉

    Reply ↓
  8. nalivai-chai

    (7) Yury1001, там вроде только о фиксации строк.

    Reply ↓
  9. nurislam

    Спасибо нужная вещь

    Reply ↓
  10. ЧИА

    Очень помогло.

    Reply ↓
  11. rozer

    Спасибо!!!

    Reply ↓
  12. glek

    Спасибо. Пока нет необходимости, но была ситуация, когда надо было. И пришлось играться гем….

    Reply ↓
  13. SemenovaMarinaV

    А я не догодалась…

    Reply ↓
  14. Poplar

    Как раз то, что я искал. Спасибо!

    Reply ↓
  15. nalivai-chai

    (15) logarifm, хоть 5, хоть 10 группировок, область шапки отчета будет прочитана в любом случае, а иначе какой кайф от предложенного подхода.

    Reply ↓
  16. nalivai-chai

    (16) logarifm, по-моему изложено все, что необходимо.

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

    Можно конечно вдаться в разбор макета компоновки, но это тема для отдельной статьи.

    Reply ↓
  17. logarifm

    А что произойдет с областью шапки если пользователь изменит вариант отчета? И накидает вместо одной группировки 5, а еще к области шапки добавится вывод Параметров отчета и его отборы. Я не увидел решение этой задачи.

    Reply ↓
  18. logarifm

    Отчет скачал и посмтрел все сделано грамотно. Просто в статье не указано всего. Старайтесь излагать все в статье.

    Reply ↓
  19. victor_k

    У кого не выводиться колонтитул, надо отрегулировать ширину поля

    Результат.ПолеСверху = 20;

    Reply ↓
  20. fedor40

    Я думал будет пример с управляемой формой.

    В управляемой форме в процедуре ПриКомпоновкеРезультата не работает.

    Reply ↓
  21. Vovanches

    На управляемых формах тоже всё работает, нужно только слегка подпилить. Стоящая фича, спасибо, мне понравилось!

    Reply ↓
  22. eigen20

    Огромнейшее спасибо автору))

    Reply ↓
  23. user_2010

    Хм… недавно искала информацию по данной теме — и ничего не нашла… а ваша статья от 12 года!

    Попробую применить…

    Спасибо!

    Reply ↓
  24. vis_tmp

    Спасибо, пригодилось!

    Reply ↓
  25. fish249

    Спасибо автору, полезная обработка

    Reply ↓
  26. websamson

    Как вывести колонтитулы на Управляемых формах (БП 3.0)? Отчет сам запускается, а колонтитулов нет

    Reply ↓
  27. websamson

    (26) Ответ на свой вопрос:

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

    Показать

    Reply ↓
  28. AKV77

    Всех приветствую. Выкладываю работоспособный код… Нашел на просторах интернета и немного изменил…

    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    ДокументРезультат.Очистить();

    КомпановщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    МакетКомпановки = КомпановщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

    ПроцессорКомпоновки.Инициализировать(МакетКомпановки, , ДанныеРасшифровки, Истина);

    //фиксировать шапку можно только для ОДНОЙ таблицы или группировки

    КоличествоТаблиц = 0;

    ВысотаШапки = 0;

    ВерхОбластиДанных = 1;

    Для Каждого ЭлементТела из МакетКомпановки.Тело Цикл

    ТипЭлементаТела = ТипЗнч(ЭлементТела);

    Если ТипЭлементаТела = Тип(«ТаблицаМакетаКомпоновкиДанных»)

    ИЛИ ТипЭлементаТела = Тип(«ГруппировкаМакетаКомпоновкиДанных») Тогда//Тут надо уточнить что значат другие типы в теле макета

    КоличествоТаблиц = КоличествоТаблиц + 1;

    ИначеЕсли ТипЭлементаТела <> Тип(«МакетОбластиМакетаКомпоновкиДанных») Тогда

    КоличествоТаблиц = 99;

    КонецЕсли;

    Если КоличествоТаблиц > 1 Тогда

    Прервать;

    КонецЕсли;

    Если ТипЭлементаТела = Тип(«МакетОбластиМакетаКомпоновкиДанных») Тогда

    ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.Макет].Макет.Количество();

    ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;

    ИначеЕсли ТипЭлементаТела = Тип(«ТаблицаМакетаКомпоновкиДанных») Тогда

    ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.МакетШапки].Макет.Количество();

    ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;

    КонецЕсли;

    КонецЦикла;

    ДокументРезультат.ПовторятьПриПечатиСтроки = ДокументРезультат.Область(ВерхОбластиДанных — ВысотаШапки,,ВерхОбластиДанных-1,);

    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

    ДокументРезультат.АвтоМасштаб = Истина;

    ДокументРезультат.НижнийКолонтитул.Выводить = Истина;

    ДокументРезультат.НижнийКолонтитул.НачальнаяСтраница = 2;

    ДокументРезультат.НижнийКолонтитул.ТекстВЦентре = «Стр. [&НомерСтраницы] из [&СтраницВсего]»;

    ДокументРезультат.НижнийКолонтитул.ТекстСправа = «Дата/время печати: [&Дата]/[&Время]»;

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    КонецПроцедуры

    Reply ↓
  29. user612919_maxim
    Reply ↓

Leave a Comment

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