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