Как в СКД программно применить параметры, заданные пользователем на форме?

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

При переходе от автоматического формирования отчетов в системе компоновки данных к программному выводу разработчики часто сталкиваются с ситуацией: пользователь интерактивно меняет даты периода, отборы или параметры на форме, нажимает кнопку формирования, но отчет упорно формируется с начальными значениями или значениями по умолчанию. Проанализируем, почему так происходит, и разберем способы корректного применения пользовательских настроек.

В чем причина сброса параметров пользователя

Посмотрим на классический фрагмент программного формирования отчета:


СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

Выясним причину ошибки: свойство СхемаКомпоновкиДанных.НастройкиПоУмолчанию возвращает статические настройки, которые были заложены в схему разработчиком на этапе конфигурирования в конфигураторе. Когда пользователь работает с отчетом, он взаимодействует с объектом КомпоновщикНастроек, меняя значения в пользовательских настройках. Если передавать в компоновщик макета СхемаКомпоновкиДанных.НастройкиПоУмолчанию, все введенные пользователем данные просто игнорируются, а отчет строится по исходным значениям схемы.

Основное решение: получение результирующих настроек из компоновщика

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

Заменим строчку инициализации настроек. Исправленный рабочий код формирования отчета выглядит следующим образом:


// Получаем схему из макета
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

// Помещаем в переменную данные о расшифровке
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

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

// Выполняем компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

// Очищаем поле табличного документа
Результат = ЭлементыФормы.Результат;
Результат.Очистить();

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

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

Особенности работы с пользовательскими настройками

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

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

// Поиск параметра в основных настройках
ПараметрПериод = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
Если ПараметрПериод <> Неопределено Тогда
    // Поиск соответствующего элемента в пользовательских настройках
    ЭлементПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрПериод.ИдентификаторПользовательскойНастройки);
    Если ЭлементПользовательскойНастройки <> Неопределено Тогда
        ЭлементПользовательскойНастройки.Значение = ТекущаяДата();
        ЭлементПользовательскойНастройки.Использование = Истина;
    КонецЕсли;
КонецЕсли;

Для скрытых технических параметров, которые не отображаются пользователю, достаточно вызова метода УстановитьЗначениеПараметра:


КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ОрганизацияПоУмолчанию", ВыбОрганизация);

Альтернативный способ: штатное формирование через модуль отчета

Проанализируем еще одну типовую ситуацию: если в отчете не требуется построчная ручная обработка выводимых ячеек через ПроцессорВывода, создание полной цепочки низкоуровневых объектов СКД избыточно. Платформа 1С предоставляет штатный метод формирования.

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // При необходимости модифицируем параметры здесь
    
    // Платформа сама объединит настройки и учтет пользовательский ввод
    СкомпоноватьРезультат(ДокументРезультат, ДанныеРасшифровки);
    
КонецПроцедуры

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

← На главную