При разработке и сопровождении решений на платформе 1С:Предприятие 8.3 разработчики нередко сталкиваются с ситуацией: в свойствах расширения конфигурации снят признак Безопасный режим, однако при выполнении серверного кода функция БезопасныйРежим() неожиданно возвращает Истина. В результате попытка выполнить метод УстановитьПривилегированныйРежим(Истина) завершается ошибкой или игнорируется платформой, что блокирует чтение данных в обход ограничений RLS и доступ к защищенным объектам.
Разберем детально, почему возникает такое поведение, как платформа управляет контекстом исполнения расширений и какими способами можно восстановить корректную работу серверных процедур.
Проанализируем базовый механизм платформы. Безопасный режим предназначен для изоляции недоверенного программного кода (внешних обработок, отчетов, сторонних расширений). Когда поток выполнения находится в безопасном режиме, платформа жестко блокирует любые попытки программного повышения прав:
// Если БезопасныйРежим() = Истина, данная строка не сработает
УстановитьПривилегированныйРежим(Истина);
Даже если в расширении вызывается метод общего модуля основной конфигурации, факт вызова из небезопасного контекста транслируется дальше по стеку. Если расширение подключено с ограничением прав, весь вложенный вызов выполняется с теми же ограничениями.
Рассмотрим ключевые факторы, из-за которых платформа считает расширение работающим в безопасном режиме, несмотря на визуально снятый флаг:
Управление расширениями конфигурации или стандартные функции администрирования БСП). Если флаг безопасного режима переключался интерактивно в режиме Предприятия, платформа может сохранить это состояние в таблицах информационной базы. При этом в Конфигураторе флаг может отображаться выключенным, создавая иллюзию отсутствия ограничений.БезопасныйРежим() внутри метода расширения вернет Истина независимо от собственных настроек расширения.rphost). При обновлении расширения без перезапуска рабочих процессов серверные процессы могут удерживать в памяти старую версию метаданных и конфигурации расширения, в которой флаг безопасного режима еще был активен.Разберем последовательность действий, которая позволяет гарантированно снять блокировку привилегированного режима.
Убедимся, что состояние расширения одинаково зафиксировано во всех интерфейсах. Для этого откроем базу в режиме 1С:Предприятие, перейдем в форму управления расширениями, снимем флаг безопасного режима там, применим изменения, затем откроем Конфигуратор и переподключим расширение. Рекомендуется управлять расширениями преимущественно через Конфигуратор, чтобы избежать расхождения метаданных.
Если настройки были изменены, но поведение не исправилось, необходимо перезапустить рабочие процессы rphost или службу ragent на сервере 1С. Это исключит использование устаревших дескрипторов безопасности из оперативной памяти сервера.
В расширениях конфигурации нельзя объявить собственный общий модуль как Привилегированный. Если расширение перехватывает метод с помощью аннотаций &Вместо, &Перед или &После, перехватывающий метод выполняется без привилегий. Для обхода этого ограничения реализуем логику следующим образом:
// В общем модуле основной конфигурации (с флагом "Привилегированный"):
Процедура ВыполнитьДействиеПодПолнымиПравами(ПараметрыДействия) Экспорт
// Здесь код выполняется с полными правами без проверок RLS
УстановитьПривилегированныйРежим(Истина);
// Выполнение логики...
КонецПроцедуры
// В модуле расширения:
Процедура МойМетодРасширения()
// Вызываем готовый метод основного модуля вместо ручной установки привилегий
ОсновнойМодульКонфигурации.ВыполнитьДействиеПодПолнымиПравами(Параметры);
КонецПроцедуры
Проверим карточку пользователя информационной базы, под которым выполняется серверный вызов. При необходимости отключим для него флаг Защита от опасных действий либо настроим параметр DisableUnsafeActionProtection в конфигурационном файле сервера conf.cfg.
Таким образом, для стабильной работы привилегированного кода в расширениях важно контролировать стек вызовов, избегать редактирования флагов безопасности из несинхронизированных интерфейсов и выносить критичные к правам операции в привилегированные модули основной конфигурации.