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