gifts2017

Хранение значений (настроек) 8.1

Опубликовал Евгений Люлюк (Evg-Lylyk) в раздел Программирование - Практика программирования

Более универсальные функции СохранитьЗначение/ВосстановитьЗначение

Стандартные механизмы сохранения пользовательских данных ("настроек") имеют недостатки:

1. Работают только на компьютере пользователя (т.к. хранятся в папке пользователя, а не в базе)

2. Настройки теряются при динамическом обновлении или смене компьютера

в 8.2 эта проблема решена механизмом платформы

для 8.1 используются встроенные в типовые конфигурации механизмы хранения (регистр сведений "СохраненныеНастройки") для создания более универсальных функций сохранения настроек и сохранения универсальности приходится проверять, какие методы доступны и использовать оптимальные (код ниже)

Интерфейсы использования функций такие же, как и у СохранитьЗначение/ВосстановитьЗначение принцип действия прост, если доступны методы сохранения типовых конфигураций 1С используются они иначе платформенные

Фунции гл_ВосстановитьЗначение; гл_СохранитьЗначение - замена СохранитьЗначение;ВосстановитьЗначение, ТекущийПользовательВСправочникеПользователи; НеДоступныМеханизмыСохраненияНастроекВКонфигурации - вспомогательные

Процедура гл_СохранитьЗначение(ИмяНастройки, ЗначениеНастройки) Экспорт

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

       
НаборЗаписей = РегистрыСведений.СохраненныеНастройки.СоздатьНаборЗаписей();

       
//Установка отборов
       
НаборЗаписей.Отбор.Пользователь.Установить(ТекПользовательВСправочнике);
       
НаборЗаписей.Отбор.ИмяОбъекта.Установить(ИмяНастройки);

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

КонецПроцедуры

Функция
гл_ВосстановитьЗначение(ИмяНастройки) Экспорт

    Если
НедоступныМеханизмыСохраненияНастроекВКонфигурации() Тогда
        Возврат
ВосстановитьЗначение(ИмяНастройки);
    Иначе
       
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
        |   СохраненныеНастройки.СохраненнаяНастройка
        |ИЗ
        |   РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
        |ГДЕ
        |   СохраненныеНастройки.Пользователь = &Пользователь
        |   И СохраненныеНастройки.ИмяОбъекта = &ИмяОбъекта
        |   И СохраненныеНастройки.НаименованиеНастройки = ""Основная"""
);
       
Запрос.УстановитьПараметр("Пользователь", ТекущийПользовательВСправочникеПользователи());
       
Запрос.УстановитьПараметр("ИмяОбъекта", ИмяНастройки);
       
Результат = Запрос.Выполнить();

        Если
Результат.Пустой() Тогда
            Возврат Неопределено;
        Иначе
           
СохраненноеЗначениеХранилище = Результат.Выгрузить()[0].СохраненнаяНастройка;
            Возврат
СохраненноеЗначениеХранилище.Получить();
        КонецЕсли;
    КонецЕсли;

КонецФункции

Функция
ТекущийПользовательВСправочникеПользователи()

   
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
   
ИмяТекущегоПользователя = ? (ПустаяСтрока(ТекущийПользователь), "НеАвторизован", ТекущийПользователь);

    Возврат
Справочники.Пользователи.НайтиПоКоду(ИмяТекущегоПользователя);

КонецФункции

Функция
НедоступныМеханизмыСохраненияНастроекВКонфигурации()

   
//Для доступности сохранения в конфигурация... должны присутствовать регистр сведений СохраненныеНастройки и справочник Пользователи
   
Возврат (   Метаданные.РегистрыСведений.Найти("СохраненныеНастройки") = Неопределено ИЛИ
               
Метаданные.Справочники.Найти("Пользователи") = Неопределено);

КонецФункции

p.s. Приходилось не раз использовать т.к. стадартные функции не сохраняют в ИБ, а механизмы типовых не универсальны

См. также

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

Комментарии

1. Сергей Ожерельев (Поручик) 03.09.09 16:30
Хорошая идея. Сам делал подобное ещё в клюшечные времена.
2. Алекс Ю (AlexO) 09.09.10 01:43
А где тут "Внешний отчет, обработка для 1С" из заголовка?
И привязка к пользователю - не всегда хорошо. Есть ли какие-то более универсальные механизмя сохранения общих настроек различного типа (что в 8.1, что в 8.2), или нужно свой регистр создавать?
3. Евгений Люлюк (Evg-Lylyk) 09.09.10 11:34
(2)
А где тут "Внешний отчет, обработка для 1С" из заголовка?

поправил
В типовых конфигурациях 8.1 есть нужный регистр "СохраненныеНастройки"
Настройки обычно для каждого польз. свои (т.е. каждый настраивает как ему нужно) иначе лучше использ. другие механизмы например, "Константы"
В 8.2 есть механизм настроек (они теперь хранятся в базе ) и данный алгоритм не актуален для 8.2
Ответил так как понял ... вопрос задан оторвано от задачи. Что за настройки что сохраняют?
4. Иван Иванчиков (Dr.ZIG) 20.09.10 08:33
Как раз задачка у мя есть - у пользователя слетают настройки отчётов при вылете 1Ски. Попробую реализовать через регистр. Плюс авансом, надеюсь работать будет =)
7. Игорь Смирнов (MrVesna) 02.05.12 22:05
Если у пользователя нет соответствующих прав, то выскакивает ошибка: Недостаточно прав для работы с таблицей "РегистрСведений.СохраненныеНастройки". В основном правами для изменения и редактирования этого регистра обладает Администратор с полными правами (в БП 8.2 еще и Бухгалтер), т.е. список пользователей не велик! Придется предоставлять Пользователям полные права, что нехорошо.
8. Александр Топольский (AlexanderKai) 11.04.14 17:54
(7) MrVesna,
Зачем им предоставлять полные права? Предоставь просто права на этот регистр сведений.
9. anry mc (AnryMc) 11.04.14 18:37
В 2010 году я решал через сохранение настройки во внешнем файле
http://infostart.ru/public/77702/
"Сохранение - восстановление настроек отчета через файл"
Позволяет сохранять и восстанавливать (переносить) настройки отчетов через внешний файл
Обработка «ВНЕШНЯЯ» в конфигурацию встраивать не надо, работает с любым «встроенным» в конфигурацию отчетом
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа