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

22.04.13

Задачи пользователя - Адаптация типовых решений

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


Ваиант 1

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

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

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

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

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

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

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

Вариант 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

 


См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4448    9    4    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    2950    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1278    dimanich70    6    

13

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    1991    13    avmartynov    10    

43

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ITEkb 17.04.13 07:43 Сейчас в теме
Ключ объекта с русских букв МИКО перекочевал на английские MIKO
Мануал для новичков, лучше их лишний раз не путать :)
2. boffart 297 17.04.13 08:58 Сейчас в теме
3. MaxS 2826 17.04.13 11:30 Сейчас в теме
В типовых на основе БСП можно так:
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(ИмяНастройки , , ЗначениеНастройки);
ЗначениеНастройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(ИмяНастройки );
Merkalov; marku; Sardukar; korppinen; belyakooov; Windsor77; zoikins; zaic; i.c.h; Elvira_Saydasheva; son_leon; DFinteX; olezhe; Basil_Kudinov; FlyBird; improg; magv; 3sf; adhocprog; bendarik; jif; D_e_X_T_e_R; user832369; tuprikov; json; +25 Ответить
4. boffart 297 17.04.13 12:36 Сейчас в теме
(3) MaxS, Да и так можно. Настройки будут сохранены / восстановлены по имени текущего пользователя.
Обязательными являются только параметры "КлючОбъекта" и "Настройки".
19. Johney20 26.03.18 12:51 Сейчас в теме
(3) Если сохранять настройки по такому принципу, то в роли имени настройки и значения что выступают?? Имени настройки и Значению настройки просто придумать строковые значения? Типа:

ИмяНастройки = "Отбор"
ЗначениеНастройки = "Сохранение отбора"

21. MaxS 2826 26.03.18 12:55 Сейчас в теме
(19) Да, можно так, там ещё есть ключ настройки, можно в параметрах процедуры глянуть назначение.
В качестве ИмяНастройки желательно уникальное значение, например "МояОбработка.МояФорма"
31. improg 568 30.06.21 13:55 Сейчас в теме
(3) Спасибо помогло, у меня такой вариант:

сохранение

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


загрузка

	
СтруктураОбщихПараметров = Неопределено;
СтруктураОбщихПараметров = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("КлючОбъекта", "КлючНастроек", , , ИмяПользователя());
	Если ТипЗнч(СтруктураОбщихПараметров) = Тип("Структура") Тогда
		СтруктураОбщихПараметров.Свойство("Организация", Отчет.Организация);
		СтруктураОбщихПараметров.Свойство("ДатаНач", Отчет.ДатаНач);
		СтруктураОбщихПараметров.Свойство("ДатаКон", Отчет.ДатаКон);
	КонецЕсли;
Показать
Sardukar; +1 Ответить
5. Synoecium 778 17.04.13 14:10 Сейчас в теме
в УПП есть очень удобный механизм, реализованный через регистр сведений Сохраненные настройки, пользуюсь им, очень доволен. Вызов выглядит примерно так:
УниверсальныеМеханизмы.СохранениеНастроек(СтруктураНастройки);
УниверсальныеМеханизмы.ВосстановлениеНастроек(СтруктураНастройки);

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

Плюсы: - можно сохранять для пользователей, для групп пользователей
- настройка прав, например, для групп сохранять настройки могут только Полные права
- легко посмотреть какие настройки есть в регистре и редактировать некоторые поля из записей регистра. (наименование, пользователь)
- есть флажки автосохранения и автозагрузки настроек, правда придется вызов соответствующих процедур прописывать явно в отчете.
- ключом является имя объекта, так что можно подменить один отчет другим, внешним например, лишь бы имена совпадали, они будут делить настройки. (с другой стороны это может быть минусом)
aleksey2; DiGanis; BarsukM; rname; Asfiry; itriot11; JohnyDeath; alexinzaz; json; Zircool; boffart; +11 Ответить
8. nataon 23.04.13 16:19 Сейчас в теме
За статью (+).
Присоединяюсь к (5) - в УПП удобный механизм
6. AnryMc 849 18.04.13 10:55 Сейчас в теме
Ещё один метод и решение - http://infostart.ru/public/77702/ , через файл

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

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

	КонецЦикла;

КонецПроцедуры // СохранитьНастройки()
Показать
user717534; +1 Ответить
14. boffart 297 18.06.13 18:04 Сейчас в теме
(13) uri1978,
сравните две строки (к примеру в табло)
Сохранить - это правильно
Cохранить - что то тут не так, не стал разбираться, скорее всего используются латинские символы
16. kraynev-navi 647 27.03.14 09:27 Сейчас в теме
(14) Поправьте как раз в вашей публикации ("Сохранить" первый символ у вас латиница)
3man001; Serg2000mr; BoryaMbi; 7OH; Mi4man; Spacer; +6 Ответить
15. boffart 297 18.06.13 18:05 Сейчас в теме
(13) uri1978, Рабочая процедура

Процедура СохранитьНастройки() Экспорт
   //Сохраним все реквизиты обработки
   РеквизитыОбработки = ЭтотОбъект.Метаданные().Реквизиты;
   
   Для каждого Реквизит из РеквизитыОбработки Цикл
	   ХранилищеОбщихНастроек.Сохранить(Реквизит.Имя,"", ЭтотОбъект[Реквизит.Имя],,ИмяПользователя());
   КонецЦикла;
КонецПроцедуры // СохранитьНастройки()
FlyBird; user717534; Светлый ум; +3 Ответить
28. Serg2000mr 311 24.11.20 01:54 Сейчас в теме
(15)
Сохранить


Поправьте, пожалуйста, в самой публикации. Люди до сих пор мучаются ) Комментарии не всегда время есть читать.
itoptimum; +1 Ответить
17. NN2P 414 19.04.17 12:46 Сейчас в теме
Ваиант 1 тоже желательно поправить)
18. EvgeniyNP 07.02.18 15:36 Сейчас в теме
А могу я сохранить в ХранилищеОбщихНастроек таблицу внешней обработки целиком? или нужно как-то построчно?
20. Johney20 26.03.18 12:54 Сейчас в теме
(18) У вас получилось в итоге сохранить сразу всю таблицу??
22. EvgeniyNP 28.03.18 10:43 Сейчас в теме
(20) Пока отказался от идеи, но буду еще пробовать
24. Boundless 19 06.05.18 23:22 Сейчас в теме
(22) Можно использовать события формы:
&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)	
	Настройки.Вставить("ТЧ", Объект.ТЧ.Выгрузить());
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	Объект.ТЧ.Загрузить(Настройки.Получить("ТЧ"));	
КонецПроцедуры
Показать
25. EvgeniyNP 10.05.18 17:37 Сейчас в теме
23. mrm1212 34 19.04.18 08:32 Сейчас в теме
А кто знает как сохранить\восстановить в настройку выбранный в работе тип реквизита составного типа???
27. redtram 29 08.10.19 19:01 Сейчас в теме
(23) выбранный тип реквизита - пустая ссылка, ничего же не изменилось? :) Сохраняй да восстанавливай.
26. Yaga_2011 5 09.07.19 16:39 Сейчас в теме
29. r_aleksander 13.01.21 09:38 Сейчас в теме
Код ниже - не рабочий! Ключ структуры не божет быть указанного вида!
Настройки = Новый Структура("Это настройки произвольного типа, к примеру структура", "");
user645801_yyyuuu123q; +1 Ответить
33. user645801_yyyuuu123q 22.11.22 09:57 Сейчас в теме
(29) Это просто рыба.
Структура может быть любого вида Новый Структура("Ключ",НашеЗначение тип);
30. ixijixi 1775 05.03.21 09:11 Сейчас в теме
Еще вариант сохранения, только для конфигураций на БСП: https://infostart.ru/public/1330558/
32. pyrkin_vanya 488 08.10.21 11:26 Сейчас в теме
А как сохранить настройки под любым пользователем, а восстановить при выполнении регламентного задания?
aleksey2; belyakooov; Nemo74; SagittariusA; user848218; rabota.v8.1c; +6 Ответить
34. odinsmot 25.07.23 05:57 Сейчас в теме
(32) ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище, ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища
Оставьте свое сообщение