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