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