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

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

Привилегированный режим в 1С: что это и как правильно использовать

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

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

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

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

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

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

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

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

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

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

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

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

Как включить и выключить режим вручную

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

bsl
УстановитьПривилегированныйРежим(Истина);
// Код, требующий полного доступа к данным
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют");
Результат = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);

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

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

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

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

Служебные данные, скрытые от пользователей

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

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

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

Обмены и фоновые задания

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

Отчёты с особыми требованиями

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

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

Риски безопасности и типичные ошибки

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

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

Отдельная ошибка — путать привилегированный режим с правами администратора. Это разные вещи: права определяются ролями пользователя и действуют постоянно, а привилегированный режим — временное состояние выполнения кода, не зависящее от того, кто запустил сеанс.

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

Как проверить, что режим настроен правильно

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

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

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

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

Операция завершается успешно, данные записываются корректно

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

Ошибка «Нарушение прав доступа» — привилегированный контекст не покрывает обращение к данным

Поведение экспортных методов привилегированного модуля
Норма

Методы принимают только конкретные типизированные параметры и возвращают ограниченный набор данных

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

Метод принимает произвольный текст запроса или имя таблицы

Состояние режима после вызова
Норма

После завершения операции ПривилегированныйРежим() возвращает Ложь

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

Режим остаётся включённым из-за исключения или пропущенного отключения

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

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

Итог

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

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

Частые вопросы

Чем привилегированный режим отличается от полных прав?

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

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

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

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

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

Что произойдёт, если забыть выключить привилегированный режим?

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

Нужно ли включать режим вручную при проведении документа?

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

Как найти в конфигурации все места использования привилегированного режима?

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