Хранилище настроек

Хранилище настроек — специальный элемент проекта, который реализует механизм хранения настроек каких-либо настраиваемых объектов, а также предоставляет функционал по управлению настройками и организации доступа к ним.

Пользовательские настройки

Пользовательская настройка — это некоторая совокупность сохраняемых данных, привязанная к пользователю системы и настраиваемому объекту (например, отчету или форме). Чтобы указать, какому объекту принадлежит настройка, используется ключ объекта — значение, которое однозначно идентифицирует настраиваемый объект.

У настраиваемого объекта может быть несколько настроек. В этом случае, чтобы отличить одну настройку объекта и пользователя от другой, используется ключ настройки — значение, которое однозначно идентифицирует данную настройку в разрезе ключа объекта и пользователя. Обычно в качестве ключа настройки используется созданный системой технический идентификатор сохраняемого варианта.

Для некоторых видов объектов (например, для формы или отчета) пользователь может сохранять несколько вариантов настроек. В этом случает используется представление настройки — понятное пользователю наименование настройки. Сохраняя настройку, пользователь сам задает ее представление и потом может выбрать его.
Настройка может быть:
  • уникальной (единичной) — для пользователя существует только одна запись уникальной настройки с уникальными ключами объекта и настройки;
  • вариантом (множественной) — для пользователя существует несколько записей вариантов настройки с уникальными ключами объекта и настройки.

Сценарии работы с хранилищем настроек

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

Системный элемент проекта «СтандартноеХранилищеНастроек»

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

Стандартное хранилище настроек используется системными механизмами настраиваемых объектов по умолчанию. Прикладное решение может использовать его через объектную модель.

Стандартное хранилище настроек предоставляет стандартную систему прав доступа к записям хранилища:
  • пользователь имеет полный доступ к собственным настройкам;
  • администраторы имеют полный доступ к настройкам других пользователей;
  • пользователь может поделиться вариантом собственных настроек;
  • пользователь может загрузить (только чтение) общий вариант настроек (вариант, которым поделился другой пользователь).

Элемент проекта «Хранилище Настроек»

Элемент проекта Хранилище Настроек позволяет реализовать собственный механизм хранения пользовательских настроек между сеансами работы и обеспечивает доступ к настройкам пользователей. Он позволяет расширить функциональность стандартного хранилища и используется, если требуется:

  • добавить собственные реквизиты;
  • реализовать нестандартные права доступа;
  • выполнить дополнительную программную обработку;
  • сохранять настройки в разных хранилищах и т. п.
Пример YAML-файла элемента проекта ХранилищеНастроек с именем МоеХранилищеНастроек, для которого задаются разрешения доступа по умолчанию, форма объекта ХранилищеНастроекФормаОбъекта и дополнительный реквизит ТипОтчета:
ВидЭлемента: ХранилищеНастроек
Ид: e12ee87e-34f8-4b8b-854d-7d73fe217fa0
Имя: МоеХранилищеНастроек
ОбластьВидимости: ВПодсистеме
КонтрольДоступа:
    Разрешения:
        ПоУмолчанию: РазрешенияВычисляютсяДляКаждогоОбъекта
    РасчетРазрешенийПо:
        - Пользователь
Интерфейс:
    Объект:
        Форма: ХранилищеНастроекФормаОбъекта
Представление: Наименование
Реквизиты:
    -
        Ид: cd9a570e-b463-49fa-8183-ef7b7b839d36
        Имя: ТипОтчета
        Тип: Отчеты.ТипыОтчетов
Для каждого элемента проекта Хранилище Настроек в базе данных создается таблица ИмяХранилищаНастроек. Строки этой таблицы содержат данные, которые являются записями хранилища. Каждая такая запись имеет набор стандартных системных реквизитов:
  • Вариант — Булево. Позволяет различить, является ли запись вариантом настройки или уникальной записью.
  • Значение — Строка. Сохраняемые данные настраиваемого объекта.
  • КлючНастройки — Строка. Однозначно идентифицирует данную настройку в разрезе ключа объекта и пользователя.
  • КлючОбъекта — Строка. Идентифицирует настраиваемый объект.
  • Наименование — Строка. Отображаемое наименование сохраненной настройки. По умолчанию используется в качестве представления записи хранилища.
  • Общая — Булево. Флаг, указывающий на то, что запись может быть доступна другим пользователям.
  • Пользователь — Пользователь.Ссылка?. Пользователь, для которого сохраняется данная настройка.
  • Представление — Строка. Представление записи хранилища.
  • Ссылка — имя-хранилища-настроек.Ссылка. Ссылка на объект хранилища настроек.
Примечание: В хранилище должна быть одна уникальная запись для набора значений КлючОбъекта, КлючНастройки, Пользователь и значением реквизита Вариант равным Ложь. При этом может быть несколько записей с теми же значениями полей КлючОбъекта, КлючНастройки, Пользователь и значением реквизита Вариант равным Истина.
Пример выбора настроек по заданным реквизитам:
ВЫБРАТЬ
    Ссылка,
    Значение,
    Наименование
ИЗ
    МоеХранилищеНастроек
ГДЕ
    КлючОбъекта == %ИдентификаторСписка
    И Пользователь == %ТекущийПользователь
    И Общая == Истина
УПОРЯДОЧИТЬ ПО
    Представление

Интерактивная функциональность

Элемент проекта Хранилище Настроек поддерживает стандартные формы списка и редактирования объекта, которые могут быть полезны для администрирования.

Пример автоматической формы объекта хранилища настроек:

Доступ к записям хранилища настроек

Настройка доступа к элементу проекта Хранилище Настроек осуществляется через свойство КонтрольДоступа. Права на такие операции, как Создание, Чтение, Изменение и Удаление, свойство РасчетРазрешенийПо, а также права, заданные по умолчанию, описываются в свойстве Разрешения.

Для элемента проекта Хранилище Настроек доступно свойство СтандартныеРазрешения. Если значение свойства равно Истина, то хранилище настроек использует следующую стандартную реализацию контроля доступа на уровне отдельных элементов проекта (RLS):
  • аутентифицированный пользователь имеет полный доступ к собственным настройкам;
  • администраторы имеют полный доступ к настройкам других пользователей;
  • аутентифицированный пользователь может загрузить (только чтение) общую настройку.
Использование свойства «СтандартныеРазрешения»:
  • Свойство СтандартныеРазрешения по умолчанию имеет значение Ложь.
  • Значение Истина для свойства СтандартныеРазрешения допускается, только если для прав используются настройки РазрешенияВычисляются или РазрешенияВычисляютсяДляКаждогоОбъекта.
  • Если свойство СтандартныеРазрешения имеет значение Истина, то:
    • указание реквизитов для расчета разрешений (РасчетРазрешенийПо) является недопустимым;
    • обработчики ВычислитьРазрешенияДоступа и ВычислитьРазрешенияДоступаДляОбъектов не требуются и считаются недопустимыми;
    • при расчете разрешений доступа вместо обработчиков используются стандартные разрешения доступа, определяемые видом элемента проекта.
...
КонтрольДоступа:
    Разрешения:
        ПоУмолчанию: РазрешенияВычисляются
    СтандартныеРазрешения: Истина
...

Примеры

  1. Как сохранить настройку в хранилище настроек МоеХранилищеНастроек:
    метод СохранитьНастройку(ИдентификаторСписка: Строка, 
        НаименованиеНастройки: Строка,
        Настройка: Строка)
    
        пер ТекущийПользователь = Пользователи.ТекущийПользователь
    
        // Отбираем настройку, соответствующую заданным реквизитам
        пер Запрос = Запрос{Выбрать Первые 1
            Ссылка
         Из
            МоеХранилищеНастроек
         Где
            КлючОбъекта == %ИдентификаторСписка
            И Пользователь == %ТекущийПользователь
            И Представление == %НаименованиеНастройки
         Упорядочить По
            Ссылка}
    
        исп РезультатЗапроса = Запрос.Выполнить()
        пер НастройкаОбъект: неизвестно
        знч РезультатЗапросаСтроки = новый ЧитаемыйМассив(РезультатЗапроса)
    
        // Если для заданных реквизитов настройка найдена, загружаем ее.
        // Иначе создаем новую множественную настройку (вида "Вариант")
        // и заполняем ее реквизиты
        если (не РезультатЗапросаСтроки.Пусто())
            НастройкаОбъект = РезультатЗапросаСтроки[0].Ссылка.ЗагрузитьОбъект() 
        иначе
            НастройкаОбъект = новый МоеХранилищеНастроек.Объект()
            НастройкаОбъект.Пользователь = ТекущийПользователь
            НастройкаОбъект.КлючОбъекта = ИдентификаторСписка
            НастройкаОбъект.Наименование = НаименованиеНастройки
            НастройкаОбъект.Вариант = Истина
        ;
    
        // Сохраняем новое значение настройки,
        // а затем саму настройку записываем в хранилище
        НастройкаОбъект.Значение = Настройка
        НастройкаОбъект.Записать()
    ;
  2. Как считать настройку из хранилища настроек МоеХранилищеНастроек в экземпляр структуры СохраненнаяНастройка:
    структура СохраненнаяНастройка
        пер Ссылка: МоеХранилищеНастроек.Ссылка?
        пер Представление: Строка
    ;
    
    метод СчитатьСохраненныеНастройки(ИдентификаторСписка: Строка): Соответствие<МоеХранилищеНастроек.Ссылка, СохраненнаяНастройка>
        
        пер Список = новый Соответствие<МоеХранилищеНастроек.Ссылка, СохраненнаяНастройка>()
        
        пер ТекущийПользователь = Пользователи.ТекущийПользователь
    
        // Отбираем настройки, соответствующие заданным реквизитам
        пер Запрос = Запрос{Выбрать
            Ссылка,
            Представление
         Из
            МоеХранилищеНастроек
         Где
            КлючОбъекта == %ИдентификаторСписка
            И Пользователь == %ТекущийПользователь
         Упорядочить По
            Представление}
    
        исп Результат = Запрос.Выполнить()
    
        // Составляем список отобранных настроек,
        // сохраненных в экземпляры структуры "СохраненнаяНастройка"
        для РезультатСтрока из Результат
            пер МояНастройка = новый СохраненнаяНастройка()
            МояНастройка.Ссылка = РезультатСтрока.Ссылка
            МояНастройка.Представление = РезультатСтрока.Представление
            Список.Вставить(МояНастройка.Ссылка, МояНастройка)
        ;
    
         возврат Список
    ;