При разработке отчетов на базе системы компоновки данных часто возникает задача вывести блок подписей, расшифровку ответственных лиц или пояснительный многострочный текст в самом конце отчета. Если попытаться привязать пользовательский макет типа Подвал к существующей группировке (например, по организации или подразделению), платформа выведет этот блок столько раз, сколько значений приняла данная группировка. Если в выборке десять организаций, то и подвал продублируется десять раз. Если же выбрать тип макета Общий итог подвал, при отключенном расчете общих итогов он может не появиться вовсе.
Проанализируем причины такого поведения системы компоновки данных и разберем по шагам надежные способы решения этой задачи: программный способ через модуль отчета и интерактивный вариант через служебную группировку.
Выясним причину ошибки в логике работы СКД:
Расположение итогов или Расположение общих итогов по вертикали установлено значение Нет, платформа полностью пропускает отрисовку строки общего итога, а значит, игнорирует и соответствующий макет.Рассмотрим наиболее гибкий и предсказуемый метод, позволяющий вывести любой сложный макет с форматированием, границами и объединенными ячейками строго после завершения формирования отчета.
Для этого в объект отчета добавляется отдельный табличный макет (например, с именем МакетПодвала), в котором оформляется область с именем Подвал. Затем в модуле объекта отчета переопределяется стандартная обработка компоновки данных.
Посмотрим на пример кода в процедуре ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
// Выводим результат компоновки данных
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Получаем пользовательскую область и дописываем ее в конец документа
ОбластьПодвал = ПолучитьМакет("МакетПодвала").ПолучитьОбласть("Подвал");
ДокументРезультат.Вывести(ОбластьПодвал);
КонецПроцедуры
Разберем важные нюансы этого подхода:
ДокументРезультат.Вывести() выполняется строго после того, как метод ПроцессорВывода.Вывести(ПроцессорКомпоновки) полностью завершил заполнение основного отчета.Если требуется решить задачу исключительно средствами схемы компоновки данных без изменения программного кода, воспользуемся механизмом служебной группировки.
Разберем по шагам правильную настройку схемы:
ПодвалОтчета.Авто, чтобы список выбранных полей остался абсолютно пустым.Без оформления, чтобы платформа не накладывала стандартную рамку ячеек.0 (либо выберем вариант использования группировки Дополнительная информация).ПодвалОтчета.В результате СКД сначала выведет все строки основного отчета, а затем обратится к служебной ветке и напечатает оформленный макет заголовка ровно один раз в самом конце результирующего табличного документа.