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