К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как проверить привилегированный режим в 1С

Как в 1С проверить, включён ли привилегированный режим: функция ПривилегированныйРежим(), установка и отключение, типовые ошибки и проверка результата.

Привилегированный режим в 1С — это состояние выполнения кода, при котором платформа не проверяет права доступа к объектам базы данных и не применяет ограничения доступа на уровне записей (RLS). Разработчик включает его осознанно, когда бизнес-логика требует обратиться к данным, недоступным текущему пользователю напрямую: например, записать служебный регистр или прочитать константу при проведении документа.

Проблема в том, что режим может быть включён неявно — самой платформой или чужим кодом выше по стеку вызовов. Тогда модуль, который по замыслу должен работать с контролем прав, фактически выполняется без него. Это типичный источник дыр в безопасности и трудноуловимых ошибок, поэтому умение проверить текущее состояние привилегированного режима — базовый навык при отладке и аудите кода.

Ниже разобраны способы проверки из кода и из конфигуратора, сценарии неявного включения режима, типовые ошибки и контрольные точки, по которым можно убедиться, что код работает в ожидаемом режиме.

Что такое привилегированный режим и когда он включается

В обычном режиме платформа перед каждым обращением к данным проверяет права текущего пользователя: чтение, добавление, изменение, удаление — по ролям, назначенным в конфигурации. В привилегированном режиме эта проверка отключается полностью: код может читать и изменять любые объекты независимо от прав пользователя, под которым выполняется сеанс.

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

Проверка режима из кода: функция ПривилегированныйРежим()

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

bsl
Если ПривилегированныйРежим() Тогда
    // Код выполняется без проверки прав доступа
Иначе
    // Действует контроль прав текущего пользователя
КонецЕсли;

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

bsl
Сообщить("Привилегированный режим: " + ПривилегированныйРежим());
// Альтернатива — запись в журнал регистрации:
ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Информация, , ,
    "Привилегированный режим: " + ПривилегированныйРежим());

Установка и отключение режима

Ручное управление режимом выполняется методом УстановитьПривилегированныйРежим(). Параметр Истина включает режим, Ложь — отключает. Метод можно вызывать многократно; каждый вызов с параметром Истина увеличивает внутренний счётчик, а вызов с Ложь уменьшает его. Режим фактически отключается, когда счётчик возвращается к нулю.

Безопасный шаблон работы с режимом
  1. 1
    Включите режим непосредственно перед обращением к защищённым данным: УстановитьПривилегированныйРежим(Истина)
  2. 2
    Выполните минимально необходимый участок кода — запрос или запись объекта
  3. 3
    Сразу отключите режим: УстановитьПривилегированныйРежим(Ложь)
  4. 4
    При отладке проверьте состояние функцией ПривилегированныйРежим() после отключения
  5. 5
    Убедитесь, что отключение выполняется и при исключении — оберните участок в Попытка/Исключение

Ключевое правило: область действия привилегированного режима должна быть минимальной. Если включить режим в начале длинной процедуры и отключить в конце, весь промежуточный код — включая вызовы других функций — выполнится без контроля прав. Это расширяет поверхность для ошибок и злоупотреблений.

Где режим включается неявно

Частая причина вопроса «почему проверка прав не срабатывает» — неявное включение привилегированного режима настройками конфигурации. Знать эти места нужно, чтобы правильно интерпретировать результат функции ПривилегированныйРежим().

  • Общие модули — флажок «Привилегированный» в палитре свойств модуля. Весь код такого модуля выполняется без проверки прав.
  • Модули менеджеров и модуль объекта — выполняются на сервере в привилегированном контексте при определённых операциях, в частности часть обработчиков проведения.
  • Регламентные и фоновые задания — код внутри них выполняется в привилегированном режиме, поскольку нет интерактивного пользователя.
  • Подписки на события — обработчики могут выполняться в привилегированном режиме в зависимости от контекста вызова.
  • Внешние компоненты и COM-соединения — код, вызванный через внешнее соединение, часто работает без пользовательского контекста.

Проверить настройку модуля просто: откройте конфигуратор, найдите общий модуль в дереве конфигурации, вызовите палитру свойств (правый клик → «Свойства») и посмотрите флажок «Привилегированный». Если он установлен, любая функция этого модуля возвращает данные без учёта прав — и это нужно учитывать при проектировании её интерфейса.

Отладка: как увидеть режим в момент выполнения

В конфигураторе состояние привилегированного режима видно при отладке через табло или окно «Вычислить выражение» (Shift+F9). Достаточно остановиться на точке останова внутри интересующего кода и вычислить выражение ПривилегированныйРежим() — результат покажет актуальное состояние в данной точке стека вызовов.

Дополнительно полезно смотреть стек вызовов: если текущая процедура вызвана из привилегированного общего модуля, режим будет включён независимо от того, что происходит внутри самой процедуры. Точка входа определяет начальное состояние, и это объясняет, почему один и тот же код ведёт себя по-разному при вызове из формы и из регламентного задания.

Контрольные точки

Как проверить результат

Значение ПривилегированныйРежим() в точке входа
Норма

Соответствует ожиданию: Ложь для пользовательских операций, Истина для служебных

Тревожный признак

Истина там, где должен действовать контроль прав

Состояние после УстановитьПривилегированныйРежим(Ложь)
Норма

Функция возвращает Ложь (счётчик обнулён)

Тревожный признак

Остаётся Истина — режим включён ещё где-то выше по стеку

Поведение при исключении
Норма

Режим отключён после блока Попытка/Исключение

Тревожный признак

После ошибки режим остался включённым и «протекает» в вызывающий код

Типичные ошибки при работе с режимом

Типичные ошибки
01
Включение режима в начале большой процедуры и отключение в конце — весь промежуточный код работает без контроля прав, включая непредусмотренные вызовы.
02
Отсутствие отключения при исключении: ошибка внутри привилегированного блока прерывает код до вызова с Ложь, и режим остаётся включённым до конца вызова сервера.
03
Предположение, что режим сбрасывается автоматически при выходе из процедуры: он действует до конца вызова сервера, а не до конца процедуры, поэтому «протекает» в вызывающий код.
04
Проверка прав вручную через РольДоступна внутри привилегированного модуля без учёта того, что само обращение к данным уже не контролируется.
05
Использование привилегированного общего модуля как универсального хелпера: любая его экспортная функция становится каналом обхода прав.

Отдельно стоит упомянуть тестирование. Если разработчик тестирует функциональность под полными правами, ошибки контроля доступа не проявляются — привилегированный режим или его отсутствие незаметны. Проверять поведение нужно под пользователем с реальным, ограниченным набором ролей, иначе дефект обнаружится только у конечных пользователей.

Привилегированный и безопасный режим: не путать

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

Сравнение механизмов

Привилегированный режим

Отключает проверку прав доступа к данным. Проверка: ПривилегированныйРежим(). Управляется разработчиком в коде.

Безопасный режим

Ограничивает опасные операции кода (файлы, COM, внешние компоненты). Проверка: БезопасныйРежим(). Назначается платформой или администратором.

Монопольный режим

Блокирует работу других пользователей с базой. К правам доступа отношения не имеет. Проверка: МонопольныйРежим().

FAQ

Почему ПривилегированныйРежим() возвращает Истина, хотя я его не включал?

Скорее всего, код выполняется в контексте, где режим включён автоматически: привилегированный общий модуль, регламентное задание, обработчик подписки или вызов из другого кода, где режим уже установлен. Посмотрите стек вызовов в отладчике и проверьте свойства задействованных общих модулей.

Отключается ли привилегированный режим автоматически?

Да, но не при выходе из процедуры, а при завершении вызова сервера, в котором он был установлен. Внутри одного вызова режим сохраняется между процедурами и модулями, поэтому «забытый» режим влияет на весь последующий код этого вызова.

Можно ли проверить режим на клиенте?

Функция ПривилегированныйРежим() доступна на толстом клиенте и во внешнем соединении, но в тонком и веб-клиенте недоступна — там нет прямого доступа к данным, и понятие режима относится к серверному коду. Проверяйте состояние в серверных процедурах.

Что делать, если режим не отключается после УстановитьПривилегированныйРежим(Ложь)?

Метод работает со счётчиком: каждый вызов с Истина требует парного вызова с Ложь. Если режим включался несколько раз (в вашем коде или выше по стеку), одного отключения недостаточно. Найдите все точки включения и убедитесь, что каждая имеет парное отключение, в том числе в ветке Исключение.

Опасно ли использовать привилегированный режим в запросах?

Само по себе — нет, это штатный приём для служебных данных. Риск в том, что результат запроса без RLS может попасть пользователю, которому эти данные недоступны. Перед возвратом данных из привилегированного кода убедитесь, что выборка содержит только то, что разрешено видеть вызывающему контексту.

Как проверить, не обходит ли внешняя обработка права доступа?

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

Итог

Что важно запомнить

Состояние привилегированного режима проверяется функцией ПривилегированныйРежим(), управляется парными вызовами УстановитьПривилегированныйРежим с минимальной областью действия и может включаться неявно настройками модулей и контекстом выполнения. При отладке всегда смотрите стек вызовов и тестируйте под пользователем с ограниченными правами.