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