При разработке внешних и дополнительных отчетов для типовых конфигураций (например, «1С:Бухгалтерия предприятия 3.0») нередко возникает задача: задать общие фильтры, параметры или список используемых дополнительных реквизитов один раз для всех пользователей информационной базы. Стандартное поведение платформенного хранилища настроек сохраняет параметры индивидуально для каждого сеанса, что заставляет либо вручную копировать настройки между пользователями, либо искать альтернативные варианты архитектуры.
Разберем подробнее, почему возникает данное ограничение, и рассмотрим практические способы организации единого хранилища настроек без доработки конфигурации и снятия ее с поддержки.
Объект ХранилищеОбщихНастроек физически сохраняет записи в системной таблице базы данных с обязательной привязкой к имени пользователя. Если при вызове методов сохранения или чтения параметр имени пользователя не указан, платформа 1С автоматически подставляет имя текущего авторизованного пользователя.
Если же мы явно передаем чужое или фиксированное имя пользователя, платформа требует наличия административного права АдминистрированиеДанных. У рядовых пользователей такого права нет, поэтому при попытке чтения или записи настроек под общим ключом возникает ошибка прав доступа.
Самый компактный программный способ обойти ограничение прав — выполнять чтение и запись настроек в серверном контексте с включением привилегированного режима. При этом платформа не проверяет реальное существование пользователя в списке пользователей ИБ, что позволяет использовать строковую константу в качестве общего идентификатора.
Рассмотрим реализацию сохранения общих настроек отчета на сервере:
&НаСервере
Процедура СохранитьОбщиеНастройкиОтчетаНаСервере(СтруктураНастроек)
УстановитьПривилегированныйРежим(Истина);
КлючОбъекта = "ДополнительныйОтчет_МойОтчет";
КлючНастроек = "ОсновныеПараметрыИФильтры";
ИмяОбщегоПользователя = "__ОбщиеНастройкиДляВсех";
ХранилищеОбщихНастроек.Сохранить(
КлючОбъекта,
КлючНастроек,
СтруктураНастроек,
,
ИмяОбщегоПользователя
);
КонецПроцедуры
Чтение сохраненных настроек выполняется аналогично на стороне сервера перед открытием формы отчета или при инициализации компоновщика:
&НаСервере
Функция ЗагрузитьОбщиеНастройкиОтчетаНаСервере()
УстановитьПривилегированныйРежим(Истина);
КлючОбъекта = "ДополнительныйОтчет_МойОтчет";
КлючНастроек = "ОсновныеПараметрыИФильтры";
ИмяОбщегоПользователя = "__ОбщиеНастройкиДляВсех";
Возврат ХранилищеОбщихНастроек.Загрузить(
КлючОбъекта,
КлючНастроек,
,
ИмяОбщегоПользователя
);
КонецФункции
Важный момент: вызов метода УстановитьПривилегированныйРежим(Истина) работает только в серверных процедурах и функциях модуля формы, модуля объекта или серверного модуля внешнего отчета. При попытке вызова на клиенте возникнет синтаксическая ошибка.
Если отчет подключается в базу через типовой механизм подсистемы БСП «Дополнительные отчеты и обработки», его метаданные сохраняются в одноименном справочнике. В типовом справочнике СправочникСсылка.ДополнительныеОтчетыИОбработки предусмотрен реквизит ХранилищеНастроек (тип ХранилищеЗначения).
Проанализируем преимущества этого подхода:
Пример программной записи настроек в справочник:
&НаСервере
Процедура ЗаписатьНастройкиВЭлементСправочника(СсылкаНаОтчет, СтруктураНастроек)
УстановитьПривилегированныйРежим(Истина);
ОбъектОтчета = СсылкаНаОтчет.ПолучитьОбъект();
ОбъектОтчета.ХранилищеНастроек = Новый ХранилищеЗначения(СтруктураНастроек, Новый СжатиеДанных(9));
ОбъектОтчета.Записать();
КонецПроцедуры
Если дополнительный отчет создан на базе системы компоновки данных (СКД), можно воспользоваться типовым пользовательским функционалом подсистемы «Варианты отчетов»:
Этот способ не требует написания программного кода и полностью поддерживается типовыми механизмами 1С:Предприятия.
Если требуется строго структурированное хранение параметров с удобным пользовательским интерфейсом управления, создается расширение конфигурации (CFE):
НастройкиДополнительныхОтчетов).ХранилищеЗначения).