Как программно выбрать вариант отчета в СКД 1С?

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

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

Где хранятся варианты настроек отчета

Все варианты отчета, созданные в схеме компоновки, находятся в коллекции СхемаКомпоновкиДанных.ВариантыНастроек. Найти конкретный вариант можно по его имени с помощью метода Найти().

Чтобы применить выбранный вариант к отчету, необходимо выгрузить его настройки и загрузить их в КомпоновщикНастроек. Разберем базовый пример получения и применения вариантов:


// Находим нужный вариант по имени
ВариантОтчета = СхемаКомпоновкиДанных.ВариантыНастроек.Найти("ОсновнойВариант");

Если ВариантОтчета <> Неопределено Тогда
    // Загружаем настройки выбранного варианта в компоновщик
    КомпоновщикНастроек.ЗагрузитьНастройки(ВариантОтчета.Настройки);
КонецЕсли;

Программный выбор варианта в событии ПриКомпоновкеРезультата

Рассмотрим частую проблему, с которой сталкиваются разработчики при обработке события ПриКомпоновкеРезультата в модуле объекта отчета. Если получить результирующие настройки до загрузки нового варианта, а затем передать старую переменную в КомпоновщикМакета.Выполнить(), отчет сформируется по первичному варианту.

Проанализируем ошибочный сценарий:


// ОШИБКА: переменная НастройкиОтчета получена ДО загрузки нового варианта
НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

ВариантОтчета = СхемаКомпоновкиДанных.ВариантыНастроек.Найти("КредитнаяЛиния");
КомпоновщикНастроек.ЗагрузитьНастройки(ВариантОтчета.Настройки);

// В Выполнить() передаются СТАРАЕМЫЕ настройки!
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

Для исправления этой ошибки нужно передавать актуальные настройки компоновщика после загрузки варианта или использовать настройки напрямую из выбранного варианта.

Исправленный и правильный вариант выполнения выглядит следующим образом:


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

Динамическое смена вариантов на форме

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


Процедура СменаВариантаНастройки(Элемент)
    
    Для Каждого ВариантИзСхемы Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
        Если Элемент.Текст = ВариантИзСхемы.Представление Тогда
            КомпоновщикНастроек.ЗагрузитьНастройки(ВариантИзСхемы.Настройки);
            Заголовок = Элемент.Текст;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Важные нюансы работы с настройками

  1. Различие методов получения настроек: Свойство КомпоновщикНастроек.Настройки содержит только базовые настройки варианта. Чтобы учитывать установленные пользователем отборы и параметры на форме, используйте метод КомпоновщикНастроек.ПолучитьНастройки().
  2. Сброс пользовательских отборов: Вызов метода ЗагрузитьНастройки() сбрасывает текущие пользовательские изменения. Если их необходимо сохранить, после загрузки базовых настроек следует повторно применить отборы с помощью метода ЗагрузитьПользовательскиеНастройки().
← На главную