При разработке универсальных внешних отчетов и обработок часто возникает необходимость сохранить общие промежуточные данные, служебные параметры или единые настройки для всех пользователей информационной базы. Стандартный платформенный механизм ХранилищеОбщихНастроек кажется очевидным выбором, однако разработчики нередко сталкиваются с ошибкой «Нарушение прав доступа». Разберем, почему возникает эта проблема, почему не срабатывает УстановитьПривилегированныйРежим и какими способами можно организовать надежное хранение общих настроек без изменения типовой конфигурации.
Проанализируем архитектурные ограничения платформы 1С:Предприятие 8.3, которые приводят к блокировке записи настроек:
"" либо произвольное общее имя, платформа жестко требует наличия административного права Администрирование данных. У обычных пользователей с типовыми профилями доступа этого права нет.ХранилищеОбщихНастроек.Загрузить() и ХранилищеОбщихНастроек.Сохранить() четвертым параметром ожидается строковое имя пользователя информационной базы (тип Строка). Передача ссылки на элемент справочника (например, Справочники.ГруппыПользователей.ВсеПользователи) недопустима с точки зрения API платформы.БезопасныйРежим() = Истина). В безопасном режиме метод УстановитьПривилегированныйРежим(Истина) блокируется: вызов метода не вызывает синтаксической ошибки, однако фактического повышения привилегий на сервере не происходит. Попытка снять безопасный режим вызовом УстановитьБезопасныйРежим(Ложь) изнутри самого исполняемого кода внешней обработки также отклоняется платформой.Если мы используем обработку в типовых конфигурациях (1С:ERP, УТ 11, КА 2, БП 3), правильным подходом является ее подключение через подсистему «Дополнительные отчеты и обработки» библиотеки стандартных подсистем (БСП). В этом случае мы можем явно запросить отключение безопасного режима.
Посмотрим на пример экспортной функции в модуле объекта внешней обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Моя универсальная обработка";
ПараметрыРегистрации.Версия = "1.0";
// Явно указываем отключение безопасного режима
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Открыть обработку";
НоваяКоманда.Идентификатор = "ОткрытьОбработку";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
При добавлении такой обработки администратор подтверждает отключение безопасного режима. После этого серверные процедуры обработки получают возможность полноценно управлять привилегированным режимом:
&НаСервере
Процедура СохранитьОбщуюНастройкуНаСервере(ИмяНастройки, ЗначениеНастройки)
УстановитьПривилегированныйРежим(Истина);
// В качестве пользователя передаем строку
ХранилищеОбщихНастроек.Сохранить("МояОбработка", ИмяНастройки, ЗначениеНастройки, , "ОбщиеНастройки");
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
&НаСервере
Функция ЗагрузитьОбщуюНастройкуНаСервере(ИмяНастройки)
УстановитьПривилегированныйРежим(Истина);
ЗначениеНастройки = ХранилищеОбщихНастроек.Загрузить("МояОбработка", ИмяНастройки, , "ОбщиеНастройки");
УстановитьПривилегированныйРежим(Ложь);
Возврат ЗначениеНастройки;
КонецФункции
Когда обработка уже зарегистрирована в справочнике Справочники.ДополнительныеОтчетыИОбработки, мы можем сохранять данные в реквизит самого элемента этого справочника. У элемента есть реквизит ХранилищеНастроек с типом ХранилищеЗначения.
Разберем по шагам, как прочитать и перезаписать такие настройки:
&НаСервере
Процедура СохранитьНастройкиВЭлементеОбработки(СсылкаНаОбработку, СтруктураНастроек)
ОбъектОбработки = СсылкаНаОбработку.ПолучитьОбъект();
ОбъектОбработки.ХранилищеНастроек = Новый ХранилищеЗначения(СтруктураНастроек, Новый СжатиеДанных(9));
ОбъектОбработки.Записать();
КонецПроцедуры
&НаСервере
Функция ЗагрузитьНастройкиИзЭлементаОбработки(СсылкаНаОбработку)
Хранилище = СсылкаНаОбработку.ХранилищеНастроек;
Значение = Хранилище.Получить();
Если Значение = Неопределено Тогда
Возврат Новый Структура;
КонецЕсли;
Возврат Значение;
КонецФункции
Важно: Для выполнения записи у пользователя должны быть права на изменение справочника дополнительных отчетов и обработок, либо запись должна выполняться с повышением привилегий (как описано в Способе 1).
В типовых конфигурациях для хранения настроек существует справочник Справочники.ВариантыОтчетов. Он пришел на смену устаревшему справочнику СохраненныеНастройки обычных форм.
Преимущества использования данного справочника:
Отчет позволяет привязать произвольный строковый идентификатор или имя объекта.Настройки имеет тип ХранилищеЗначения, куда можно сериализовать любые типы данных: структуры, соответствия, таблицы значений.Если в базе подключена подсистема работы с файлами БСП, можно использовать присоединенные файлы. Практически в любой типовой базе (УТ 11, БП 3, КА 2) есть справочники присоединенных файлов, права на работу с которыми открыты большинству пользователей информационной базы.
Посмотрим, как выглядит механизм сохранения данных через текстовый или двоичный формат:
Новый ДвоичныеДанные(...)).Если проектные ограничения строго запрещают вносить изменения в основную конфигурацию, но позволяют добавлять расширения, наиболее надежным решением будет создание небольшого вспомогательного расширения:
ХранилищеОбщихНастроек или создаем собственный служебный независимый регистр сведений без измерений пользователей.Выбор конкретного решения зависит от того, каким образом запускается обработка (через меню «Файл — Открыть» или встроенную подсистему БСП) и какими правами наделены конечные пользователи.