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