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

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

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

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

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

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

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

Как работает привилегированный режим изнутри

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

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

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

Способы установки привилегированного режима

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

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

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

bsl
Процедура ЗаписатьСлужебныеДанные() Экспорт
	УстановитьПривилегированныйРежим(Истина);
	// Здесь операции с данными без проверки прав
	УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Где режим действует, а где нет

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

Режим не передаётся между серверными вызовами. Клиент вызвал серверную процедуру — режим включён внутри неё; вызов завершился — режим сброшен. Следующий серверный вызов начинается с выключенного режима (если он не в привилегированном общем модуле). Также режим не действует в фоновых заданиях, запущенных до его включения, — фоновое задание получает свой контекст.

КонтекстПривилегированный режим
Клиентские процедуры формыНедоступен, метод не вызывается
Серверные процедуры общих модулейВключается явно или признаком модуля
Обработка проведения, обработчики записиПривилегированны по умолчанию
Фоновые заданияОтдельный контекст, нужно включать внутри
Внешние соединения (COM, HTTP)Включается внутри обработчика

Типовые сценарии применения

Проведение документов и запись регистров

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

Обмен данными и интеграции

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

Отчёты и выборки для пользователей с ограниченными правами

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

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

Безопасность и типичные риски

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

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

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

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

Как проверить, что режим работает

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

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

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

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

Поведение под пользователем с ограниченными правами
Норма

Операция внутри привилегированного блока выполняется, вне его — ошибка доступа

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

Операция выполняется везде — возможно, права избыточны или режим не отключён

Значение ПривилегированныйРежим() после вызова
Норма

Возвращает Ложь после завершения серверного вызова

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

Возвращает Истина там, где режим должен быть выключен

Состав возвращаемых данных
Норма

Наружу выходят только разрешённые пользователю данные

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

Функция возвращает записи, недоступные пользователю по ролям

Отладка и диагностика проблем

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

Труднее всего диагностируются ситуации, когда ошибка прав доступа возникает «из ниоткуда»: разработчик уверен, что код привилегированный, а платформа выдаёт нарушение прав. Чаще всего причина в том, что обращение к данным происходит в другом серверном вызове (например, при повторном обращении к серверу из формы) или в фоновом задании с собственным контекстом. Помогает трассировка стека вызовов в момент ошибки.

Удобный приём — оборачивать привилегированную логику в функции с говорящими именами вида ПолучитьОстатокПривилегированно(). Так по имени сразу видно, что функция обходит права, и при ревизии кода такие места легко находятся поиском.
ПЗ
Практическое замечание

FAQ: частые вопросы о привилегированном режиме

Можно ли включить привилегированный режим на клиенте?

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

Сбрасывается ли режим после завершения серверного вызова?

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

Чем привилегированный общий модуль отличается от вызова УстановитьПривилегированныйРежим()?

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

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

Да, отключает. В привилегированном режиме запросы возвращают все строки независимо от настроек ограничения доступа на уровне записей. Если фильтрация по RLS нужна, её условия придётся дублировать в тексте запроса вручную.

Работает ли режим в фоновых заданиях?

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

Как найти в конфигурации все места с обходом прав?

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

Итог

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

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