gifts2017

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

Опубликовал Алексей Портнов (boffart) в раздел Программирование - Практика программирования

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


Ваиант 1

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

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

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

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

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

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

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

Вариант 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

 


См. также

Подписаться Добавить вознаграждение

Комментарии

1. Alex Steiner (OrsoBear) 17.04.13 07:43
Ключ объекта с русских букв МИКО перекочевал на английские MIKO
Мануал для новичков, лучше их лишний раз не путать :)
2. Astor (boffart) 17.04.13 08:58
3. Максим Сухов (MaxS) 17.04.13 11:30
В типовых на основе БСП можно так:
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ИмяНастройки , , ЗначениеНастройки);
ЗначениеНастройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(ИмяНастройки );
yurii_host; +1 Ответить 1
4. Astor (boffart) 17.04.13 12:36
(3) MaxS, Да и так можно. Настройки будут сохранены / восстановлены по имени текущего пользователя.
Обязательными являются только параметры "КлючОбъекта" и "Настройки".
5. Сергей Лесовой (Synoecium) 17.04.13 14:10
в УПП есть очень удобный механизм, реализованный через регистр сведений Сохраненные настройки, пользуюсь им, очень доволен. Вызов выглядит примерно так:
УниверсальныеМеханизмы.СохранениеНастроек(СтруктураНастройки);
УниверсальныеМеханизмы.ВосстановлениеНастроек(СтруктураНастройки);

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

Плюсы: - можно сохранять для пользователей, для групп пользователей
- настройка прав, например, для групп сохранять настройки могут только Полные права
- легко посмотреть какие настройки есть в регистре и редактировать некоторые поля из записей регистра. (наименование, пользователь)
- есть флажки автосохранения и автозагрузки настроек, правда придется вызов соответствующих процедур прописывать явно в отчете.
- ключом является имя объекта, так что можно подменить один отчет другим, внешним например, лишь бы имена совпадали, они будут делить настройки. (с другой стороны это может быть минусом)
alexinzaz; yurii_host; Zircool; boffart; +4 Ответить 1
6. anry mc (AnryMc) 18.04.13 10:55
Ещё один метод и решение - http://infostart.ru/public/77702/ , через файл

Ещё решение - http://infostart.ru/public/150007/
7. Сергей Маслов (LexSeIch) 22.04.13 07:16
Мир этому дому!
Конструктивный подход - к вариантам автора добавились варианты с БСП, через использование регистра сведений, файл и т.д. Есть из чего выбирать. За статью плюс.
8. nataon (nataon) 23.04.13 16:19
За статью (+).
Присоединяюсь к (5) - в УПП удобный механизм
9. uri1978 uri1978 (uri1978) 28.05.13 18:32
Подскажите.
Попробовал 2-й метод, для внешней обработки (обычное приложение).
При вызове метода ХранилищеОбщихНастроек.Cохранить(... вываливается ошибка Метод объекта не обнаружен (Cохранить)
10. anry mc (AnryMc) 28.05.13 22:50
(9) uri1978, вроде с платформы 8,15 ... у вас какая?
11. Алексей Портнов (boffart) 28.05.13 22:59
(9) uri1978, выложите текст примера.
12. Алексей Портнов (boffart) 28.05.13 23:00
(10) AnryMc, в данном случае проверена на 8.2.13 и старше
13. uri1978 uri1978 (uri1978) 29.05.13 09:42
Платформа 8.2.18.82
Код (модуль объекта):
Процедура СохранитьНастройки() Экспорт

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

	КонецЦикла;

КонецПроцедуры // СохранитьНастройки()
...Показать Скрыть
14. Алексей Портнов (boffart) 18.06.13 18:04
(13) uri1978,
сравните две строки (к примеру в табло)
Сохранить - это правильно
Cохранить - что то тут не так, не стал разбираться, скорее всего используются латинские символы
15. Алексей Портнов (boffart) 18.06.13 18:05
(13) uri1978, Рабочая процедура

Процедура СохранитьНастройки() Экспорт
   //Сохраним все реквизиты обработки
   РеквизитыОбработки = ЭтотОбъект.Метаданные().Реквизиты;
   
   Для каждого Реквизит из РеквизитыОбработки Цикл
	   ХранилищеОбщихНастроек.Сохранить(Реквизит.Имя,"", ЭтотОбъект[Реквизит.Имя],,ИмяПользователя());
   КонецЦикла;
КонецПроцедуры // СохранитьНастройки()
...Показать Скрыть
16. С К (kraynev-navi) 27.03.14 09:27
(14) Поправьте как раз в вашей публикации ("Сохранить" первый символ у вас латиница)
BoryaMbi; 7OH; Mi4man; Spacer; +4 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа