Как сохранить общие настройки без привязки к пользователю и без прав администратора в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке универсальных внешних отчетов и обработок часто возникает необходимость сохранить общие промежуточные данные, служебные параметры или единые настройки для всех пользователей информационной базы. Стандартный платформенный механизм ХранилищеОбщихНастроек кажется очевидным выбором, однако разработчики нередко сталкиваются с ошибкой «Нарушение прав доступа». Разберем, почему возникает эта проблема, почему не срабатывает УстановитьПривилегированныйРежим и какими способами можно организовать надежное хранение общих настроек без изменения типовой конфигурации.

Причины возникновения ошибки доступа при работе с ХранилищемОбщихНастроек

Проанализируем архитектурные ограничения платформы 1С:Предприятие 8.3, которые приводят к блокировке записи настроек:

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

Способ 1. Отключение безопасного режима при регистрации обработки в БСП

Если мы используем обработку в типовых конфигурациях (1С:ERP, УТ 11, КА 2, БП 3), правильным подходом является ее подключение через подсистему «Дополнительные отчеты и обработки» библиотеки стандартных подсистем (БСП). В этом случае мы можем явно запросить отключение безопасного режима.

Посмотрим на пример экспортной функции в модуле объекта внешней обработки:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Наименование = "Моя универсальная обработка";
    ПараметрыРегистрации.Версия = "1.0";
    
    // Явно указываем отключение безопасного режима
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Открыть обработку";
    НоваяКоманда.Идентификатор = "ОткрытьОбработку";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    
    Возврат ПараметрыРегистрации;

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

При добавлении такой обработки администратор подтверждает отключение безопасного режима. После этого серверные процедуры обработки получают возможность полноценно управлять привилегированным режимом:


&НаСервере
Процедура СохранитьОбщуюНастройкуНаСервере(ИмяНастройки, ЗначениеНастройки)

    УстановитьПривилегированныйРежим(Истина);
    
    // В качестве пользователя передаем строку
    ХранилищеОбщихНастроек.Сохранить("МояОбработка", ИмяНастройки, ЗначениеНастройки, , "ОбщиеНастройки");
    
    УстановитьПривилегированныйРежим(Ложь);

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

&НаСервере
Функция ЗагрузитьОбщуюНастройкуНаСервере(ИмяНастройки)

    УстановитьПривилегированныйРежим(Истина);
    
    ЗначениеНастройки = ХранилищеОбщихНастроек.Загрузить("МояОбработка", ИмяНастройки, , "ОбщиеНастройки");
    
    УстановитьПривилегированныйРежим(Ложь);
    
    Возврат ЗначениеНастройки;

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

Способ 2. Использование реквизита «ХранилищеНастроек» самой дополнительной обработки

Когда обработка уже зарегистрирована в справочнике Справочники.ДополнительныеОтчетыИОбработки, мы можем сохранять данные в реквизит самого элемента этого справочника. У элемента есть реквизит ХранилищеНастроек с типом ХранилищеЗначения.

Разберем по шагам, как прочитать и перезаписать такие настройки:


&НаСервере
Процедура СохранитьНастройкиВЭлементеОбработки(СсылкаНаОбработку, СтруктураНастроек)

    ОбъектОбработки = СсылкаНаОбработку.ПолучитьОбъект();
    ОбъектОбработки.ХранилищеНастроек = Новый ХранилищеЗначения(СтруктураНастроек, Новый СжатиеДанных(9));
    ОбъектОбработки.Записать();

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

&НаСервере
Функция ЗагрузитьНастройкиИзЭлементаОбработки(СсылкаНаОбработку)

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

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

Важно: Для выполнения записи у пользователя должны быть права на изменение справочника дополнительных отчетов и обработок, либо запись должна выполняться с повышением привилегий (как описано в Способе 1).

Способ 3. Использование типовых справочников БСП («Варианты отчетов»)

В типовых конфигурациях для хранения настроек существует справочник Справочники.ВариантыОтчетов. Он пришел на смену устаревшему справочнику СохраненныеНастройки обычных форм.

Преимущества использования данного справочника:

  1. Реквизит Отчет позволяет привязать произвольный строковый идентификатор или имя объекта.
  2. Реквизит Настройки имеет тип ХранилищеЗначения, куда можно сериализовать любые типы данных: структуры, соответствия, таблицы значений.
  3. Права на добавление и чтение предопределенных или общих вариантов отчетов обычно открыты для широкого круга типовых ролей.

Способ 4. Хранение настроек через присоединенные файлы

Если в базе подключена подсистема работы с файлами БСП, можно использовать присоединенные файлы. Практически в любой типовой базе (УТ 11, БП 3, КА 2) есть справочники присоединенных файлов, права на работу с которыми открыты большинству пользователей информационной базы.

Посмотрим, как выглядит механизм сохранения данных через текстовый или двоичный формат:

  1. Сериализуем структуру общих настроек в строку формата JSON или XML.
  2. Создаем или обновляем элемент справочника присоединенных файлов, записывая в него полученные данные в виде двоичных данных (Новый ДвоичныеДанные(...)).
  3. При чтении получаем двоичные данные, восстанавливаем строку и десериализуем ее обратно в структуру параметров 1С.

Способ 5. Использование расширения конфигурации (.cfe)

Если проектные ограничения строго запрещают вносить изменения в основную конфигурацию, но позволяют добавлять расширения, наиболее надежным решением будет создание небольшого вспомогательного расширения:

  1. Создаем в расширении общий модуль с признаками Сервер и Привилегированный.
  2. Выносим в этот модуль функции работы с ХранилищеОбщихНастроек или создаем собственный служебный независимый регистр сведений без измерений пользователей.
  3. Код внешних обработок сможет обращаться к экспортным методам этого модуля, минуя ограничения безопасного режима.

Выбор конкретного решения зависит от того, каким образом запускается обработка (через меню «Файл — Открыть» или встроенную подсистему БСП) и какими правами наделены конечные пользователи.

← На главную