Платформа 1с8 предлагает неплохой функционал хранения настроек пользователя - хранилище настроек. Оно прекрасно справляется с сохранением данных настроек в автоматическом режиме. Пока это касается данных конкретного пользователя. Но что, если нужно хранить общие для всех пользователей настройки? Например дополнительные настройки номенклатуры, сотрудников, видов расчета? Тут у хранилища включается ограничение прав - прочитать настройки других пользователей можно лишь обладая правами "АдминистрированиеДанных". Даже включение привилегированного режима не поможет.
Можно воспользоваться функционалом дополнительных реквизитов и сведений. Или создавать свои объекты для хранения, например регистры сведений, благо с расширениями это стало гораздо проще. Или сохранять данные во внешние источники, файлы или таблицы. Все это работает, но не всегда возможно.
Я обычно использую иной путь. Он опробован на нескольких проектах, и несколько лет работает без единого сбоя как в файловых базах, так и клиент-серверных, как в среде Windows, так и Linux.
Что предлагается?
В конфигурациях на базе БСП есть отличная подсистема - "Варианты отчетов". Вот ее я и предлагаю использовать.
Создаем служебный элемент в справочнике "ВариантыОтчетов". В реквизит КлючВарианта
помещаем строковый идентификатор нашей настройки. В дальнейшем по этому идентификатору будем читать сохраненные настройки. В реквизит Настройки
помещаем наши настройки в виде хранилища значений. Записываем элемент в базу, предварительно сняв пометку удаления (если она есть), чтобы особо ретивые админы не удалили наши данные. При следующем обращении к элементу ищем его по ключу варианта.
Данные настроек я разбил на два раздела - общие и персональные. Персональные по идее можно хранить по старому, пусть платформа этим занимается. Но раз уж я взялся, чтобы два раза не вставать, пишу сюда и персональные тоже. Для сохранения настроек передаёте их функции СохранитьНастройки в любом удобном для вас виде (в теле функции разделаете их, как бог черепаху, уже сами) и идентификатор настройки (необязательно, если у вас только один объект настройки). Для чтения необходим только идентификатор, опять же необязательный. Если в процессе работы над проектом структура настроек претерпела изменения, можно их скорректировать после чтения в функции ПереопределитьНастройкиНовымиЗначениями
.
Весь код под спойлером. Его можно вынести в общий модуль, можно в модуль отчета/обработки. Выполняется весь код на сервере. Метод зарекомендовал себя отлично, решил поделиться с сообществом.
Всем удачного кодинга!
Функция СохранитьНастройки(Настройки, ИДНастройки = Неопределено) Экспорт
СхемаНастроек = ПараметрыСохранения(ИДНастройки);
// На первом этапе заполняем в соответствие значения настроек, общие для инфформационной базы
ОбщиеНастройки = Новый Соответствие;
// ... код заполнения общих настроек
УстановитьПривилегированныйРежим(Истина);
// Сохраняем их в справочник
ХранилищеНастроек = ОбъектХранилищаНастроек(СхемаНастроек);
ХранилищеНастроек.Настройки = Новый ХранилищеЗначения(ОбщиеНастройки);
ХранилищеНастроек.Записать();
// На втором этапе заполняем в соответствие значения персональных настроек пользователя
ПерсональныеНастройки = Новый Соответствие;
// ... код заполнения персональных настроек
// Сохраняем их в хранилище общих настроек
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(СхемаНастроек.КлючОбъекта, СхемаНастроек.КлючНастроек, ПерсональныеНастройки);
КонецФункции
Функция ВосстановитьНастройки(ИДНастройки = "") Экспорт
СхемаНастроек = ПараметрыСохранения(ИДНастройки);
ОбщиеНастройки = ОбъектХранилищаНастроек(СхемаНастроек).Настройки.Получить();
ПерсональныеНастройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(СхемаНастроек.КлючОбъекта, СхемаНастроек.КлючНастроек);
ПереопределитьНастройкиНовымиЗначениями(ОбщиеНастройки, ПерсональныеНастройки);
Настройки = Новый Структура("ОбщиеНастройки, ПерсональныеНастройки",
ОбщиеНастройки,
ПерсональныеНастройки);
Возврат Настройки;
КонецФункции
Функция ПереопределитьНастройкиНовымиЗначениями(ОбщиеНастройки, ПерсональныеНастройки)
Если ТипЗнч(ОбщиеНастройки) <> Тип("Соответствие") Тогда
ОбщиеНастройки = Новый Соответствие;
КонецЕсли;
Если ТипЗнч(ПерсональныеНастройки) <> Тип("Соответствие") Тогда
ПерсональныеНастройки = Новый Соответствие;
КонецЕсли;
// В случае, если были доработки, влияющие на логику работы, можно переопределить их в этом блоке
КонецФункции
Функция ПараметрыСохранения(ИДНастройки = Неопределено, ДобавитьПользователя = Ложь)
Если ИДНастройки = Неопределено Тогда
ИДНастройки = "ИД по умолчанию";
КонецЕсли;
Настройки = Новый Структура;
Настройки.Вставить("КлючОбъекта", ИДНастройки); // Должен быть уникальным в пределах ИБ
Настройки.Вставить("КлючНастроек", "МоиНастройки/ПерсональныеНастройки");
Настройки.Вставить("КлючНастроекОбщ", "МоиНастройки/ОбщиеНастройки");
Если ДобавитьПользователя Тогда
Настройки.Вставить("КлючПользователя", "МоиНастройки/КлючПользователя");
Настройки.Вставить("Пользователь", ТекущийПользователь());
КонецЕсли;
Возврат Настройки;
КонецФункции
Функция ТекущийПользователь()
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователь <> Неопределено Тогда
Возврат Пользователь.Имя;
КонецЕсли;
Возврат Строка(Пользователи.АвторизованныйПользователь());
КонецФункции
Функция ОбъектХранилищаНастроек(СхемаНастроек = Неопределено, ИДНастройки = Неопределено)
Если СхемаНастроек = Неопределено Тогда
СхемаНастроек = ПараметрыСохранения(ИДНастройки);
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("КлючВарианта", СхемаНастроек.КлючНастроекОбщ);
Запрос.Текст = "Выбрать Первые 1 Ссылка Из Справочник.ВариантыОтчетов Где КлючВарианта = &КлючВарианта";
УстановитьПривилегированныйРежим(Истина);
РезЗапроса = Запрос.Выполнить();
Если Не РезЗапроса.Пустой() Тогда
Выборка = РезЗапроса.Выбрать();
Выборка.Следующий();
ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект();
Иначе
ВариантОбъект = Справочники.ВариантыОтчетов.СоздатьЭлемент();
ВариантОбъект.КлючВарианта = СхемаНастроек.КлючНастроекОбщ;
ВариантОбъект.Наименование = "Настройки моей обработки: НЕ УДАЛЯТЬ!";
ВариантОбъект.Описание = "Хранилище общих настроек для моей обработки";
ВариантОбъект.ТолькоДляАвтора = Истина;
ВариантОбъект.ВидимостьПоУмолчанию = Ложь;
КонецЕсли;
ВариантОбъект.ПометкаУдаления = Ложь;
ВариантОбъект.ОбменДанными.Загрузка = Истина;
Возврат ВариантОбъект;
КонецФункции
На тему БСП и смежные темы см. также публикации:
Получение контактной информации из отбора
СКД. Использование Менеджера временных таблиц в системе компоновки