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