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

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

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

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

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

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

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

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

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

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

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

Как включить привилегированный режим в модуле внешней обработки

Откройте внешнюю обработку в конфигураторе (Файл → Открыть, затем перейдите в модуль объекта обработки или модуль формы). В нужной процедуре вызовите функцию установки режима до обращения к защищённым данным:

Процедура ВыполнитьЗагрузку() Экспорт

УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ РегистрСведений.СлужебныеНастройки";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

// обработка данных

КонецЦикла;

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

КонецПроцедуры

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

Если обработка работает на клиенте (в модуле формы без контекста сервера), привилегированный режим там установить нельзя — функция доступна только на сервере. В этом случае вызывайте серверную процедуру с директивой &НаСервере или &НаСервереБезКонтекста и включайте режим уже внутри неё.

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

Безопасный режим и почему вызов может не сработать

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

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

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

Если БезопасныйРежим() Тогда

Сообщить("Обработка запущена в безопасном режиме, привилегированный режим недоступен");

Иначе

УстановитьПривилегированныйРежим(Истина);

КонецЕсли;

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

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

Более точечный вариант — роль «Интерактивное открытие внешних отчетов и обработок» и запуск обработки через Файл → Открытие в режиме предприятия. При таком способе запуска безопасный режим не применяется, и УстановитьПривилегированныйРежим работает штатно. Однако у пользователя должно быть право на интерактивное открытие внешних файлов.

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

Сравнение вариантов

УстановитьПривилегированныйРежим в модуле обработки

Подходит при запуске через Файл → Открытие или при отключённом безопасном режиме. Не работает в безопасном режиме БСП.

Отключение безопасного режима в настройках БСП

Быстрое решение, но снимает защиту со всех подключённых обработок сразу. Рискованно в рабочей базе.

Перенос логики в общий модуль конфигурации

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

Альтернатива: вызов серверного метода конфигурации

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

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

Как проверить, что привилегированный режим работает

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

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

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

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

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

Функция ПривилегированныйРежим() после установки
Норма

Возвращает Истина

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

Возвращает Ложь — вызов не выполнен или запрещён безопасным режимом

Функция БезопасныйРежим()
Норма

Возвращает Ложь — ограничений нет

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

Возвращает Истина — привилегированный режим недоступен

Запуск под пользователем без прав на объект
Норма

Операция выполняется без ошибок

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

Ошибка «Нарушение прав доступа»

Типичные ошибки и ограничения

Первая распространённая ошибка — попытка установить привилегированный режим в клиентской процедуре формы. Функция доступна только на сервере, поэтому код нужно переносить в серверные процедуры или модуль объекта обработки.

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

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

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

FAQ

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

Нет. Функция УстановитьПривилегированныйРежим доступна только в серверном контексте. В модуле формы создайте процедуру с директивой &НаСервере или &НаСервереБезКонтекста и вызывайте функцию внутри неё.

Почему возникает ошибка при вызове УстановитьПривилегированныйРежим в обработке из «Дополнительных отчетов и обработок»?

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

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

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

Даёт ли привилегированный режим доступ к файловой системе и внешним компонентам?

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

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

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

Что лучше для постоянно используемой обработки: привилегированный режим в коде или общий модуль конфигурации?

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

Итог

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

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