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