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

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


Ваиант 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 не будет опубликован. Обязательные поля помечены *