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