Методы сохранения / восстановления настроек

Задача: Необходим механизм, позволяющий сохранять произвольные пользовательские данные (настройки). Настройки относятся к внешней обработке, вариант с изменением конфигурации не рассматривается. План видов характеристик трогать тоже нет желания.
В рамках заметки предложено два вариант работы с настройками пользователя.


Ваиант 1

Сохранение настроек:

    ИмяНастройки = «ТЕСТ»;
   
ЗначениеНастройки = Новый Структура(«Это настройки произвольного типа, к примеру структура», «»);
   
СохранитьЗначение(ИмяНастройки, ЗначениеНастройки) ;

  • ИмяНастройки — ключ настроек, тип “строка”.
  • значение — значение произвольного типа, возможность заманчивая, но не стоит слишком увлекаться и сохранять все подряд.

Восстановление настроек:

    ИмяНастройки = «ТЕСТ»;
   
ЗначениеНастройки = ВосстановитьЗначение(ИмяНастройки);
    Если
ЗначениеНастройки = Неопределено Тогда
       
Сообщить(«Нет настройки с ключем ТЕСТ!»);
    КонецЕсли;

  • ИмяНастройки — ключ настройки, тип “строка”
  • возвращает значение произвольного типа, сохраненное ранее.Если восстановить не удалось, возвращает “Неопределено”
Плюсы
  • прост в использовании
  • возможно сохранить настройки произвольного типа текущего пользователя в текущей информационной базе
Минусы
  • Только толстый клиент

  • Возможно работать ТОЛЬКО с настройками текущего пользователя

Вариант 2

Использование объекта ХранилищеОбщихНастроек. Считаю этот вариант наиболее удобным и гибким.

Объект доступен в глобальном контексте. Содержит следующие методы:

Сохранение настроек: 

    // ключи могут быть произвольными строками
   
КлючОбъекта  = «MIKO«;
   
КлючНастроек = «ПанельТелефонии»;
   
// настройки могут быть произвольного типа
   
Настройки    = Новый Структура(«Это настройки произвольного типа, к примеру структура», «»);
   
ИмяПользователя = ИмяПользователя();

    // имя пользователя — пользователь владелец настроек, если параметр не указать,
    // то настройки будут сохранены для ТЕКУЩЕГО пользователя
   
ИмяПользователя = ИмяПользователя();
   
ХранилищеОбщихНастроек.Cохранить(КлючОбъекта,  КлючНастроек, Настройки, , ИмяПользователя);

Под пользователем понимается именно пользователь информационной базы! Пример получения имени текущего пользователя:

    // получим имя
   
ИмяТекущегоПользователя = ИмяПользователя();
   
// в типовых конфигурация используется справочник «Пользователи»
    // в этом справочнике в стандартном реквизите «Код» обычно
    // хранят информацию по имени пользователя, пример получения имени:
   
ИмяПользователя = Справочники.Пользователи.НайтиПоНаименованию(«Администратор»).Код;
   
// обычно «Код», для этого справочника — строка фиксированной длинны, потому вероятно разумно обрезать пробелы справа:
   
ИмяПользователя = СокрП(ИмяПользователя);

Восстановление настроек: 

    КлючОбъекта  = «MIKO«;
   
КлючНастроек = «ПанельТелефонии»;
   
ВладелецНастроек = ИмяПользователя();
   
// Для восстановления настроек необходимо воспользоваться функцией Загрузить
   
СтруктураНастроек = Неопределено;
    Попытка
       
СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта,КлючНастроек,,ВладелецНастроек);
       
// если настроек нет, то будет возвращено значение «Неопределено»
   
Исключение
       
Сообщить(«Нет прав на восстановление настроек.»);
    КонецПопытки;

    Если СтруктураНастроек = Неопределено Тогда
       
Сообщить(«Не вышло восстановить настройки!»);
    КонецЕсли;

ВладелецНастроек — это имя пользователя, владельца настроек. Параметр очень важный. 

Настройки других пользователей могут получать ТОЛЬКО пользователи с расширенными правами.

Необходимо право «АдминистрированиеДанных«.

Пробелы справа игнорируются!


Плюсы
  • Возможно работать со значениями настроек других пользователей.
  • Доступность: Сервер, толстый клиент, внешнее соединение.

Получение всех ключей настроек по ключу объекта  

    // Пример получения всех настроек по ключу объекта
   
КлючОбъекта = «MIKO»;
   
ВладелецНастроек = ИмяПользователя();
    Попытка
       
// возвращает список значений
        // элементы списка — ключи настроек
       
СтруктураНастроек = ХранилищеОбщихНастроек.ПолучитьСписок(КлючОбъекта, ВладелецНастроек);
    Исключение
       
Сообщить(«Нет прав на восстановление настроек.»);
    КонецПопытки;

Подведем итог

В рамках этой заметки я рассказал о двух вариантах работы с настройками пользователя. Пробуйте :).

 


27 Comments

  1. OrsoBear

    Ключ объекта с русских букв МИКО перекочевал на английские MIKO

    Мануал для новичков, лучше их лишний раз не путать 🙂

    Reply ↓
  2. boffart

    Спасибо! Поправил.

    Reply ↓
  3. MaxS

    В типовых на основе БСП можно так:

    ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ИмяНастройки , , ЗначениеНастройки);
    ЗначениеНастройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(ИмяНастройки );
    Reply ↓
  4. boffart

    (3) MaxS, Да и так можно. Настройки будут сохранены / восстановлены по имени текущего пользователя.

    Обязательными являются только параметры «КлючОбъекта» и «Настройки«.

    Reply ↓
  5. Synoecium

    в УПП есть очень удобный механизм, реализованный через регистр сведений Сохраненные настройки, пользуюсь им, очень доволен. Вызов выглядит примерно так:

    УниверсальныеМеханизмы.СохранениеНастроек(СтруктураНастройки);

    УниверсальныеМеханизмы.ВосстановлениеНастроек(СтруктураНастройки);

    Есть еще справочник Сохраненные настройки, но мне РС показался более удобным.

    Плюсы: — можно сохранять для пользователей, для групп пользователей

    — настройка прав, например, для групп сохранять настройки могут только Полные права

    — легко посмотреть какие настройки есть в регистре и редактировать некоторые поля из записей регистра. (наименование, пользователь)

    — есть флажки автосохранения и автозагрузки настроек, правда придется вызов соответствующих процедур прописывать явно в отчете.

    — ключом является имя объекта, так что можно подменить один отчет другим, внешним например, лишь бы имена совпадали, они будут делить настройки. (с другой стороны это может быть минусом)

    Reply ↓
  6. AnryMc

    Ещё один метод и решение — http://infostart.ru/public/77702/ , через файл

    Ещё решение — http://infostart.ru/public/150007/

    Reply ↓
  7. LexSeIch

    Мир этому дому!

    Конструктивный подход — к вариантам автора добавились варианты с БСП, через использование регистра сведений, файл и т.д. Есть из чего выбирать. За статью плюс.

    Reply ↓
  8. nataon

    За статью (+).

    Присоединяюсь к (5) — в УПП удобный механизм

    Reply ↓
  9. uri1978

    Подскажите.

    Попробовал 2-й метод, для внешней обработки (обычное приложение).

    При вызове метода ХранилищеОбщихНастроек.Cохранить(… вываливается ошибка Метод объекта не обнаружен (Cохранить)

    Reply ↓
  10. AnryMc

    (9) uri1978, вроде с платформы 8,15 … у вас какая?

    Reply ↓
  11. boffart

    (9) uri1978, выложите текст примера.

    Reply ↓
  12. boffart

    (10) AnryMc, в данном случае проверена на 8.2.13 и старше

    Reply ↓
  13. uri1978

    Платформа 8.2.18.82

    Код (модуль объекта):

    Процедура СохранитьНастройки() Экспорт
    
    //Сохраним все реквизиты обработки
    РеквизитыОбработки = ЭтотОбъект.Метаданные().Реквизиты;
    
    Для каждого Реквизит из РеквизитыОбработки Цикл
    
    ХранилищеСистемныхНастроек.Cохранить(Реквизит.Имя,  ЭтотОбъект.Метаданные().Имя, ЭтотОбъект[Реквизит.Имя],,ИмяПользователя());
    
    КонецЦикла;
    
    КонецПроцедуры // СохранитьНастройки()
    

    Показать

    Reply ↓
  14. boffart

    (13) uri1978,

    сравните две строки (к примеру в табло)

    Сохранить — это правильно

    Cохранить — что то тут не так, не стал разбираться, скорее всего используются латинские символы

    Reply ↓
  15. boffart

    (13) uri1978, Рабочая процедура

    Процедура СохранитьНастройки() Экспорт
    //Сохраним все реквизиты обработки
    РеквизитыОбработки = ЭтотОбъект.Метаданные().Реквизиты;
    
    Для каждого Реквизит из РеквизитыОбработки Цикл
    ХранилищеОбщихНастроек.Сохранить(Реквизит.Имя,»», ЭтотОбъект[Реквизит.Имя],,ИмяПользователя());
    КонецЦикла;
    КонецПроцедуры // СохранитьНастройки()
    Reply ↓
  16. kraynev-navi

    (14) Поправьте как раз в вашей публикации («Сохранить» первый символ у вас латиница)

    Reply ↓
  17. NN2P

    Ваиант 1 тоже желательно поправить)

    Reply ↓
  18. EvgeniyNP

    А могу я сохранить в ХранилищеОбщихНастроек таблицу внешней обработки целиком? или нужно как-то построчно?

    Reply ↓
  19. Johney20

    (3) Если сохранять настройки по такому принципу, то в роли имени настройки и значения что выступают?? Имени настройки и Значению настройки просто придумать строковые значения? Типа:

    ИмяНастройки = «Отбор»
    ЗначениеНастройки = «Сохранение отбора»
    
    
    Reply ↓
  20. Johney20

    (18) У вас получилось в итоге сохранить сразу всю таблицу??

    Reply ↓
  21. MaxS

    (19) Да, можно так, там ещё есть ключ настройки, можно в параметрах процедуры глянуть назначение.

    В качестве ИмяНастройки желательно уникальное значение, например «МояОбработка.МояФорма»

    Reply ↓
  22. EvgeniyNP

    (20) Пока отказался от идеи, но буду еще пробовать

    Reply ↓
  23. mrm1212

    А кто знает как сохранитьвосстановить в настройку выбранный в работе тип реквизита составного типа???

    Reply ↓
  24. Boundless

    (22) Можно использовать события формы:

    &НаСервере
    Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    Настройки.Вставить(«ТЧ», Объект.ТЧ.Выгрузить());
    КонецПроцедуры
    
    &НаСервере
    Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
    Объект.ТЧ.Загрузить(Настройки.Получить(«ТЧ»));
    КонецПроцедуры
    

    Показать

    Reply ↓
  25. EvgeniyNP

    (24) Спасибо, попробую

    Reply ↓
  26. Yaga_2011

    Большое спасибо!

    Reply ↓
  27. redtram

    (23) выбранный тип реквизита — пустая ссылка, ничего же не изменилось? 🙂 Сохраняй да восстанавливай.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *