Разработка и Конфигурация · 11 мин
Как проверить привилегированный режим в 1С
Как в 1С проверить, включён ли привилегированный режим: функция ПривилегированныйРежим(), установка и отключение, типовые ошибки и проверка результата.
Привилегированный режим в 1С — это состояние выполнения кода, при котором платформа не проверяет права доступа к объектам базы данных и не применяет ограничения доступа на уровне записей (RLS). Разработчик включает его осознанно, когда бизнес-логика требует обратиться к данным, недоступным текущему пользователю напрямую: например, записать служебный регистр или прочитать константу при проведении документа.
Проблема в том, что режим может быть включён неявно — самой платформой или чужим кодом выше по стеку вызовов. Тогда модуль, который по замыслу должен работать с контролем прав, фактически выполняется без него. Это типичный источник дыр в безопасности и трудноуловимых ошибок, поэтому умение проверить текущее состояние привилегированного режима — базовый навык при отладке и аудите кода.
Ниже разобраны способы проверки из кода и из конфигуратора, сценарии неявного включения режима, типовые ошибки и контрольные точки, по которым можно убедиться, что код работает в ожидаемом режиме.
Что такое привилегированный режим и когда он включается
В обычном режиме платформа перед каждым обращением к данным проверяет права текущего пользователя: чтение, добавление, изменение, удаление — по ролям, назначенным в конфигурации. В привилегированном режиме эта проверка отключается полностью: код может читать и изменять любые объекты независимо от прав пользователя, под которым выполняется сеанс.
Режим включается в нескольких случаях: явным вызовом УстановитьПривилегированныйРежим(Истина), автоматически в модулях с флажком «Привилегированный режим» (общие модули, модули менеджеров объектов), в обработчиках подписок на события при определённых настройках, в регламентных заданиях и при выполнении кода на сервере в моменты, когда пользовательский контекст отсутствует. Важно понимать: режим «липкий» — после включения он остаётся активным, пока его не отключат или пока не завершится текущий вызов сервера.
Проверка режима из кода: функция ПривилегированныйРежим()
Основной инструмент проверки — встроенная функция ПривилегированныйРежим(). Она не принимает параметров и возвращает булево значение: Истина, если текущий код выполняется в привилегированном режиме, и Ложь в противном случае. Функция доступна на сервере, в толстом клиенте и во внешнем соединении.
Если ПривилегированныйРежим() Тогда
// Код выполняется без проверки прав доступа
Иначе
// Действует контроль прав текущего пользователя
КонецЕсли;Практический приём — вывести состояние режима в журнал регистрации или в сообщение при отладке, чтобы видеть, в каком контексте реально выполняется проблемный участок. Это особенно полезно, когда обработчик вызывается из разных мест конфигурации и поведение отличается.
Сообщить("Привилегированный режим: " + ПривилегированныйРежим());
// Альтернатива — запись в журнал регистрации:
ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Информация, , ,
"Привилегированный режим: " + ПривилегированныйРежим());Установка и отключение режима
Ручное управление режимом выполняется методом УстановитьПривилегированныйРежим(). Параметр Истина включает режим, Ложь — отключает. Метод можно вызывать многократно; каждый вызов с параметром Истина увеличивает внутренний счётчик, а вызов с Ложь уменьшает его. Режим фактически отключается, когда счётчик возвращается к нулю.
- 1Включите режим непосредственно перед обращением к защищённым данным: УстановитьПривилегированныйРежим(Истина)
- 2Выполните минимально необходимый участок кода — запрос или запись объекта
- 3Сразу отключите режим: УстановитьПривилегированныйРежим(Ложь)
- 4При отладке проверьте состояние функцией ПривилегированныйРежим() после отключения
- 5Убедитесь, что отключение выполняется и при исключении — оберните участок в Попытка/Исключение
Ключевое правило: область действия привилегированного режима должна быть минимальной. Если включить режим в начале длинной процедуры и отключить в конце, весь промежуточный код — включая вызовы других функций — выполнится без контроля прав. Это расширяет поверхность для ошибок и злоупотреблений.
Где режим включается неявно
Частая причина вопроса «почему проверка прав не срабатывает» — неявное включение привилегированного режима настройками конфигурации. Знать эти места нужно, чтобы правильно интерпретировать результат функции ПривилегированныйРежим().
- Общие модули — флажок «Привилегированный» в палитре свойств модуля. Весь код такого модуля выполняется без проверки прав.
- Модули менеджеров и модуль объекта — выполняются на сервере в привилегированном контексте при определённых операциях, в частности часть обработчиков проведения.
- Регламентные и фоновые задания — код внутри них выполняется в привилегированном режиме, поскольку нет интерактивного пользователя.
- Подписки на события — обработчики могут выполняться в привилегированном режиме в зависимости от контекста вызова.
- Внешние компоненты и COM-соединения — код, вызванный через внешнее соединение, часто работает без пользовательского контекста.
Проверить настройку модуля просто: откройте конфигуратор, найдите общий модуль в дереве конфигурации, вызовите палитру свойств (правый клик → «Свойства») и посмотрите флажок «Привилегированный». Если он установлен, любая функция этого модуля возвращает данные без учёта прав — и это нужно учитывать при проектировании её интерфейса.
Отладка: как увидеть режим в момент выполнения
В конфигураторе состояние привилегированного режима видно при отладке через табло или окно «Вычислить выражение» (Shift+F9). Достаточно остановиться на точке останова внутри интересующего кода и вычислить выражение ПривилегированныйРежим() — результат покажет актуальное состояние в данной точке стека вызовов.
Дополнительно полезно смотреть стек вызовов: если текущая процедура вызвана из привилегированного общего модуля, режим будет включён независимо от того, что происходит внутри самой процедуры. Точка входа определяет начальное состояние, и это объясняет, почему один и тот же код ведёт себя по-разному при вызове из формы и из регламентного задания.
Как проверить результат
Соответствует ожиданию: Ложь для пользовательских операций, Истина для служебных
Истина там, где должен действовать контроль прав
Функция возвращает Ложь (счётчик обнулён)
Остаётся Истина — режим включён ещё где-то выше по стеку
Режим отключён после блока Попытка/Исключение
После ошибки режим остался включённым и «протекает» в вызывающий код
Типичные ошибки при работе с режимом
Отдельно стоит упомянуть тестирование. Если разработчик тестирует функциональность под полными правами, ошибки контроля доступа не проявляются — привилегированный режим или его отсутствие незаметны. Проверять поведение нужно под пользователем с реальным, ограниченным набором ролей, иначе дефект обнаружится только у конечных пользователей.
Привилегированный и безопасный режим: не путать
Это разные механизмы, которые часто смешивают. Привилегированный режим отключает проверку прав доступа к данным. Безопасный режим ограничивает возможности самого кода: запрещает доступ к файловой системе, COM-объектам, внешним компонентам и т.п. Он применяется при выполнении внешних обработок и кода из расширений. Проверить безопасный режим можно функцией БезопасныйРежим() — она возвращает Истина или строку с именем профиля безопасности.
Сравнение механизмов
Отключает проверку прав доступа к данным. Проверка: ПривилегированныйРежим(). Управляется разработчиком в коде.
Ограничивает опасные операции кода (файлы, COM, внешние компоненты). Проверка: БезопасныйРежим(). Назначается платформой или администратором.
Блокирует работу других пользователей с базой. К правам доступа отношения не имеет. Проверка: МонопольныйРежим().
FAQ
Почему ПривилегированныйРежим() возвращает Истина, хотя я его не включал?
Скорее всего, код выполняется в контексте, где режим включён автоматически: привилегированный общий модуль, регламентное задание, обработчик подписки или вызов из другого кода, где режим уже установлен. Посмотрите стек вызовов в отладчике и проверьте свойства задействованных общих модулей.
Отключается ли привилегированный режим автоматически?
Да, но не при выходе из процедуры, а при завершении вызова сервера, в котором он был установлен. Внутри одного вызова режим сохраняется между процедурами и модулями, поэтому «забытый» режим влияет на весь последующий код этого вызова.
Можно ли проверить режим на клиенте?
Функция ПривилегированныйРежим() доступна на толстом клиенте и во внешнем соединении, но в тонком и веб-клиенте недоступна — там нет прямого доступа к данным, и понятие режима относится к серверному коду. Проверяйте состояние в серверных процедурах.
Что делать, если режим не отключается после УстановитьПривилегированныйРежим(Ложь)?
Метод работает со счётчиком: каждый вызов с Истина требует парного вызова с Ложь. Если режим включался несколько раз (в вашем коде или выше по стеку), одного отключения недостаточно. Найдите все точки включения и убедитесь, что каждая имеет парное отключение, в том числе в ветке Исключение.
Опасно ли использовать привилегированный режим в запросах?
Само по себе — нет, это штатный приём для служебных данных. Риск в том, что результат запроса без RLS может попасть пользователю, которому эти данные недоступны. Перед возвратом данных из привилегированного кода убедитесь, что выборка содержит только то, что разрешено видеть вызывающему контексту.
Как проверить, не обходит ли внешняя обработка права доступа?
Внешние обработки по умолчанию выполняются в безопасном режиме и без привилегированного доступа, если не изменены настройки. Проверить можно, вставив в код обработки вывод ПривилегированныйРежим() и БезопасныйРежим(), а также просмотрев её код на вызовы УстановитьПривилегированныйРежим.
Что важно запомнить
Состояние привилегированного режима проверяется функцией ПривилегированныйРежим(), управляется парными вызовами УстановитьПривилегированныйРежим с минимальной областью действия и может включаться неявно настройками модулей и контекстом выполнения. При отладке всегда смотрите стек вызовов и тестируйте под пользователем с ограниченными правами.