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