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