При разработке расширений для платформы 1С:Предприятие 8.3 программисты часто сталкиваются с тем, что стандартный метод УстановитьПривилегированныйРежим(Истина) в серверном модуле расширения не дает ожидаемого результата. При проверке через ПривилегированныйРежим() система возвращает Ложь, а операции, требующие повышенных прав, завершаются ошибками доступа. Рассмотрим подробно, почему это происходит и как правильно настроить расширение для работы в привилегированном режиме.
Первое, что нам необходимо понять: метод УстановитьПривилегированныйРежим не является абсолютной командой. Это запрос к платформе, который может быть отклонен, если текущий контекст выполнения считается «недоверенным». Проанализируем основные факторы, блокирующие переход в этот режим:
УстановитьПривилегированныйРежим на уровне политик сервера.Выясним причину, которая чаще всего встречается на практике. Если вы запускаете код из внешней обработки, платформа принудительно устанавливает БезопасныйРежим() = Истина. Чтобы внутри расширения заработали привилегии, нам нужно сначала «сбросить» ограничения безопасности. Рассмотрим, как это реализовать программно в серверном общем модуле расширения.
Для корректного включения привилегированного режима воспользуемся следующей конструкцией:
// В начале процедуры или функции серверного модуля
Попытка
// Сначала отключаем безопасный режим, наложенный платформой
УстановитьОтключениеБезопасногоРежима(Истина);
// Теперь включаем привилегированный режим
УстановитьПривилегированныйРежим(Истина);
Исключение
// Обработка ситуации, когда права пользователя не позволяют отключить безопасный режим
ЗаписьЖурналаРегистрации("Расширение.ОшибкаДоступа", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось установить привилегированный режим: " + ОписаниеОшибки());
КонецПопытки;
// Проверяем результат
Если ПривилегированныйРежим() Тогда
// Здесь выполняем действия с полными правами
Иначе
// Режим не включился, логика пойдет под текущими правами пользователя
КонецЕсли;
Важный момент: Метод УстановитьОтключениеБезопасногоРежима(Истина) сработает только в том случае, если у пользователя есть роль Администратор системы или аналогичные права на управление безопасностью. Обычный пользователь без специальных прав не сможет таким образом «взломать» систему защиты.
Проанализируем ситуацию, когда расширение работает в связке с библиотекой стандартных подсистем (БСП). Если внешняя обработка зарегистрирована в справочнике Дополнительные отчеты и обработки, по умолчанию она запускается в безопасном режиме. Это ограничение распространяется на все модули, которые вызываются из этой обработки, включая модули расширений.
Чтобы избежать блокировки привилегированного режима, выполним следующие шаги:
БезопасныйРежим() = Ложь, и метод УстановитьПривилегированныйРежим(Истина) заработает без дополнительных ухищрений.Посмотрим на настройки самих модулей расширения. Существует распространенное заблуждение, что в расширении можно создать Привилегированный общий модуль. На самом деле, платформа накладывает следующие ограничения:
&Вместо или &После) приводит к тому, что код расширения выполняется в обычном режиме, если иное не разрешено в профиле безопасности.Поэтому правильной стратегией будет использование обычного серверного модуля расширения с явным вызовом УстановитьПривилегированныйРежим(Истина) внутри конкретных процедур, где это необходимо.
Если вышеописанные методы не помогают, проанализируем настройки кластера серверов. В современных высокозащищенных системах используются Профили безопасности. Если базе назначен профиль, то даже администратор может быть ограничен в правах на программное включение привилегированного режима.
Рассмотрим порядок действий для системного администратора:
УстановитьПривилегированныйРежим и отключение безопасного режима.Вместо того чтобы постоянно бороться с безопасным режимом внутри расширения, разберем архитектурно верный подход. Если расширению требуется выполнить действие с высокими правами, лучше всего делегировать эту задачу привилегированному модулю основной конфигурации.
Посмотрим на пример такой реализации:
Код в привилегированном модуле основной конфигурации сохраняет свои права даже при вызове из «безопасного» расширения. Это самый надежный способ работы, который не требует манипуляций с УстановитьОтключениеБезопасногоРежима.
Подводя итог, отметим: если вы столкнулись с невозможностью включения привилегированного режима в расширении, в 90% случаев это связано с тем, что ваш код «наследовал» безопасный режим от внешней обработки или отчета. Использование УстановитьОтключениеБезопасногоРежима(Истина) — это быстрый способ решить проблему при наличии достаточных прав у пользователя.