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