Хранение значений (настроек) 8.1
Более универсальные функции СохранитьЗначение/ВосстановитьЗначение
- Описание
- Подробнее
Описание
Стандартные механизмы сохранения пользовательских данных («настроек») имеют недостатки:
1. Работают только на компьютере пользователя (т.к. хранятся в папке пользователя, а не в базе)
2. Настройки теряются при динамическом обновлении или смене компьютера
в 8.2 эта проблема решена механизмом платформы
для 8.1 используются встроенные в типовые конфигурации механизмы хранения (регистр сведений «СохраненныеНастройки») для создания более универсальных функций сохранения настроек и сохранения универсальности приходится проверять, какие методы доступны и использовать оптимальные (код ниже)
Интерфейсы использования функций такие же, как и у СохранитьЗначение/ВосстановитьЗначение принцип действия прост, если доступны методы сохранения типовых конфигураций 1С используются они иначе платформенные
Фунции гл_ВосстановитьЗначение; гл_СохранитьЗначение — замена СохранитьЗначение;ВосстановитьЗначение, ТекущийПользовательВСправочникеПользователи; НеДоступныМеханизмыСохраненияНастроекВКонфигурации — вспомогательные
Процедура гл_СохранитьЗначение(ИмяНастройки, ЗначениеНастройки) Экспорт
Если НедоступныМеханизмыСохраненияНастроекВКонфигурации() Тогда
СохранитьЗначение(ИмяНастройки, ЗначениеНастройки);
Иначе
НаименованиеНастройки = «Основная»;
ТекПользовательВСправочнике = ТекущийПользовательВСправочникеПользователи();
НаборЗаписей = РегистрыСведений.СохраненныеНастройки.СоздатьНаборЗаписей();
//Установка отборов
НаборЗаписей.Отбор.Пользователь.Установить(ТекПользовательВСправочнике);
НаборЗаписей.Отбор.ИмяОбъекта.Установить(ИмяНастройки);
//Добавление записи настройки в регистр
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ИмяОбъекта = ИмяНастройки;
НоваяЗапись.Пользователь = ТекПользовательВСправочнике;
НоваяЗапись.СохраненнаяНастройка = Новый ХранилищеЗначения(ЗначениеНастройки);
НоваяЗапись.НаименованиеНастройки = НаименованиеНастройки;
НаборЗаписей.Записать();
КонецЕсли;
КонецПроцедуры
Функция гл_ВосстановитьЗначение(ИмяНастройки) Экспорт
Если НедоступныМеханизмыСохраненияНастроекВКонфигурации() Тогда
Возврат ВосстановитьЗначение(ИмяНастройки);
Иначе
Запрос = Новый Запрос(«ВЫБРАТЬ ПЕРВЫЕ 1
| СохраненныеНастройки.СохраненнаяНастройка
|ИЗ
| РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
|ГДЕ
| СохраненныеНастройки.Пользователь = &Пользователь
| И СохраненныеНастройки.ИмяОбъекта = &ИмяОбъекта
| И СохраненныеНастройки.НаименованиеНастройки = «»Основная»»»);
Запрос.УстановитьПараметр(«Пользователь», ТекущийПользовательВСправочникеПользователи());
Запрос.УстановитьПараметр(«ИмяОбъекта», ИмяНастройки);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
Иначе
СохраненноеЗначениеХранилище = Результат.Выгрузить()[0].СохраненнаяНастройка;
Возврат СохраненноеЗначениеХранилище.Получить();
КонецЕсли;
КонецЕсли;
КонецФункции
Функция ТекущийПользовательВСправочникеПользователи()
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
ИмяТекущегоПользователя = ? (ПустаяСтрока(ТекущийПользователь), «НеАвторизован», ТекущийПользователь);
Возврат Справочники.Пользователи.НайтиПоКоду(ИмяТекущегоПользователя);
КонецФункции
Функция НедоступныМеханизмыСохраненияНастроекВКонфигурации()
//Для доступности сохранения в конфигурация… должны присутствовать регистр сведений СохраненныеНастройки и справочник Пользователи
Возврат ( Метаданные.РегистрыСведений.Найти(«СохраненныеНастройки») = Неопределено ИЛИ
Метаданные.Справочники.Найти(«Пользователи») = Неопределено);
КонецФункции
p.s. Приходилось не раз использовать т.к. стадартные функции не сохраняют в ИБ, а механизмы типовых не универсальны