Почему не работает привилегированный режим при вызове кода конфигурации из внешней обработки 1С

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

При разработке внешних обработок разработчики часто сталкиваются с ситуацией: пользователь без полных прав запускает внешнюю обработку, которая вызывает процедуру или функцию из общего модуля конфигурации. Внутри этого модуля расположен вызов УстановитьПривилегированныйРежим(Истина) для выполнения действий с объектами, к которым у пользователя нет прямого доступа. Однако операция завершается ошибкой прав доступа, а привилегированный режим фактически не включается. Проанализируем, почему это происходит и как решить данную проблему.

Причины игнорирования привилегированного режима платформой

Выясним причину такого поведения платформы 1С:Предприятие. Когда пользователь без роли Администрирование интерактивно открывает внешнюю обработку через пункт меню «Файл — Открыть», платформа автоматически исполняет её код в безопасном режиме.

Главная особенность безопасного режима заключается в том, что он наследуется по всему стеку вызовов. Рассмотрим подробнее, как это происходит:

  1. Код внешней обработки начинает исполняться в контексте безопасного режима.
  2. При вызове любой процедуры или функции из состава конфигурации контекст исполнения остается безопасным.
  3. Любые попытки выполнить метод УстановитьПривилегированныйРежим(Истина) внутри конфигурации в рамках этого вызова принудительно игнорируются платформой.

В результате операции записи документов, чтения защищенных данных или выполнения административных действий завершаются ошибками доступа. Попытка вызвать УстановитьБезопасныйРежим(Ложь) непосредственно из самого кода внешней обработки не даст результата — обработка не может снять ограничения сама с себя.

Способы решения и обхода ограничений

Рассмотри варианты решения проблемы в зависимости от архитектурных ограничений информационной базы и доступных прав.

1. Выключение безопасного режима при программном открытии

Если внешняя обработка подключается программно из кода конфигурации под пользователем с соответствующими правами или из привилегированного модуля, необходимо передать значение Ложь в параметр БезопасныйРежим при вызове методов ВнешниеОбработки.Создать() или ВнешниеОбработки.Подключить().

Разберем пример программного создания объекта внешней обработки без ограничений безопасного режима:


ИмяФайла = "C:\Обработки\МояОбработка.epf";
// Передаем Ложь в качестве второго параметра "БезопасныйРежим"
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
ОбработкаОбъект.ВыполнитьДействие();

2. Регистрация в подсистеме «Дополнительные отчеты и обработки» (БСП)

В конфигурациях, использующих Библиотеку Стандартных Подсистем, внешние обработки регистрируются в справочнике ДополнительныеОтчетыИОбработки. Разберем порядок действий для отключения безопасного режима:

  1. Зарегистрируйте внешнюю обработку в системе под пользователем с правами администратора.
  2. В форме элемента справочника ДополнительныеОтчетыИОбработки отключите флажок «Безопасный режим».
  3. В модуле объекта внешней обработки в функции СведенияОВнешнейОбработке() явно запросите разрешение на использование привилегированного режима с помощью вызова РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима().

3. Использование расширений конфигурации

Если требуется предоставить пользователям доступ к доработанному функционалу без использования внешних файлов обработок, рекомендуется перенести алгоритмы в расширение конфигурации (файл .cfe).

Посмотрим на особенности этого подхода:

  1. Подключите расширение через интерфейс 1С:Предприятия в разделе Администрирование — Расширения.
  2. Снимите для данного расширения флаг «Безопасный режим» (а также флаг «Защита от опасных действий»).
  3. После перезапуска сеанса код расширения и вызываемые им общие модули конфигурации смогут использовать УстановитьПривилегированныйРежим(Истина).

4. Выполнение кода через фоновое задание

Проанализируем еще один способ — передачу выполнения операций на сторону сервера с помощью фонового задания.

Фоновое задание, запущенное методом ФоновыеЗадания.Выполнить() из общего модуля конфигурации, исполняется в отдельном сеансе на сервере. Ограничения безопасного режима интерактивно открытой внешней обработки на такое фоновое задание не распространяются. В этом случае внешняя обработка лишь передает параметры в процедуру конфигурации, где привилегированный режим успешно включается.

← На главную