Разработка и Конфигурация · 11 мин
Как включить привилегированный режим во внешней обработке 1С
Как включить привилегированный режим во внешней обработке 1С: функция УстановитьПривилегированныйРежим(), безопасный режим, ошибки прав доступа и проверка результата.
Привилегированный режим во внешней обработке 1С включается вызовом встроенной функции УстановитьПривилегированныйРежим(Истина) в модуле обработки. После этого выполняемый код игнорирует ограничения прав доступа пользователя к объектам базы данных: документам, справочникам, регистрам. Это стандартный механизм платформы, который работает и в обычных, и в управляемых формах.
Главная сложность не в самом вызове, а в том, что внешние обработки часто запускаются в безопасном режиме — например, при подключении через механизм «Дополнительные отчеты и обработки» (БСП). В безопасном режиме установка привилегированного режима запрещена, и попытка вызвать функцию приведёт к ошибке. Поэтому важно понимать, откуда запускается обработка и какие ограничения действуют.
Ниже разобраны способы включения привилегированного режима, ограничения безопасного режима, типичные ошибки и способы проверить, что режим действительно активен.
Что такое привилегированный режим и когда он нужен
Привилегированный режим — это режим исполнения кода, при котором платформа не проверяет права доступа текущего пользователя к объектам информационной базы. Обычно, если у пользователя нет права «Чтение» на справочник, попытка обратиться к нему из кода завершится ошибкой «Нарушение прав доступа». В привилегированном режиме такая проверка отключается.
Типовые сценарии, где режим необходим во внешней обработке: массовая загрузка данных из файла под пользователем с ограниченными правами, обновление служебных регистров сведений, корректировка движений документов, заполнение скрытых от пользователя справочников. Без привилегированного режима такие операции пришлось бы выполнять под учётной записью администратора.
Важно понимать: привилегированный режим не даёт прав, которых нет у самой базы, — он лишь отключает проверку ролей. Записать объект, которого не существует, или обойти контроль ссылочной целостности этот режим не позволит.
Как включить привилегированный режим в модуле внешней обработки
Откройте внешнюю обработку в конфигураторе (Файл → Открыть, затем перейдите в модуль объекта обработки или модуль формы). В нужной процедуре вызовите функцию установки режима до обращения к защищённым данным:
Процедура ВыполнитьЗагрузку() Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ РегистрСведений.СлужебныеНастройки";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обработка данных
КонецЦикла;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Режим действует в пределах текущего вызова на сервере. Хорошая практика — отключать его сразу после завершения критичного участка кода, передав Ложь. Это снижает риск того, что последующий код случайно выполнит операции, на которые у пользователя нет прав.
Если обработка работает на клиенте (в модуле формы без контекста сервера), привилегированный режим там установить нельзя — функция доступна только на сервере. В этом случае вызывайте серверную процедуру с директивой &НаСервере или &НаСервереБезКонтекста и включайте режим уже внутри неё.
- 1Откройте внешнюю обработку в конфигураторе и перейдите в модуль объекта или серверную процедуру формы
- 2Вставьте УстановитьПривилегированныйРежим(Истина) перед обращением к защищённым данным
- 3Выполните нужные операции с данными
- 4Отключите режим вызовом УстановитьПривилегированныйРежим(Ложь)
- 5Сохраните обработку и протестируйте под пользователем с ограниченными правами
Безопасный режим и почему вызов может не сработать
Самая частая причина, по которой привилегированный режим «не включается», — безопасный режим исполнения внешней обработки. При подключении обработки через справочник «Дополнительные отчеты и обработки» в конфигурациях на базе Библиотеки стандартных подсистем код по умолчанию выполняется в безопасном режиме.
В безопасном режиме платформа запрещает целый ряд операций, включая установку привилегированного режима, операции с файловой системой, COM-объекты и внешние компоненты. При попытке вызвать УстановитьПривилегированныйРежим(Истина) возникнет ошибка, и выполнение обработки прервётся.
Проверить, активен ли безопасный режим, можно функцией БезопасныйРежим() — она возвращает Истина, если код выполняется с ограничениями. Это удобно для диагностики прямо внутри обработки:
Если БезопасныйРежим() Тогда
Сообщить("Обработка запущена в безопасном режиме, привилегированный режим недоступен");
Иначе
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;
Как отключить безопасный режим для внешней обработки
Если обработка подключается через «Дополнительные отчеты и обработки», безопасный режим управляется настройками подсистемы. В разделе администрирования (обычно «Администрирование → Печатные формы, отчеты и обработки») есть флаг, отвечающий за использование безопасного режима. Снятие этого флага разрешает выполнение обработок без ограничений, но действует глобально — на все подключённые обработки.
Более точечный вариант — роль «Интерактивное открытие внешних отчетов и обработок» и запуск обработки через Файл → Открытие в режиме предприятия. При таком способе запуска безопасный режим не применяется, и УстановитьПривилегированныйРежим работает штатно. Однако у пользователя должно быть право на интерактивное открытие внешних файлов.
Для файловых баз и тестовых контуров допустимо временно отключать безопасный режим глобально. В рабочих базах лучше применять точечные решения: запуск через открытие файла или перенос логики в конфигурацию.
Сравнение вариантов
Подходит при запуске через Файл → Открытие или при отключённом безопасном режиме. Не работает в безопасном режиме БСП.
Быстрое решение, но снимает защиту со всех подключённых обработок сразу. Рискованно в рабочей базе.
Самый надёжный вариант для постоянного использования, но требует изменения конфигурации и обновления базы.
Альтернатива: вызов серверного метода конфигурации
Если изменять настройки безопасного режима нельзя, а привилегированный доступ нужен, рабочая стратегия — вынести критичную операцию в общий модуль конфигурации с установленным флагом «Привилегированный». Такой модуль всегда выполняется в привилегированном режиме, и внешняя обработка может вызывать его методы даже из безопасного режима (если вызов экспортных методов общих модулей разрешён настройками профиля безопасности).
Этот подход требует доработки конфигурации, зато даёт контролируемую точку входа: вся логика с повышенными правами сосредоточена в одном месте, её проще проверить и сопровождать. Для разовых операций достаточно привилегированного режима в самой обработке, для регулярных — стоит рассмотреть перенос в конфигурацию.
Как проверить, что привилегированный режим работает
Платформа предоставляет функцию ПривилегированныйРежим(), которая возвращает Истина, если режим в данный момент активен. Вставьте проверку сразу после установки режима и перед выполнением ключевых операций — это избавит от долгой отладки при ошибках доступа.
Практический тест: запустите обработку под пользователем, у которого заведомо нет прав на объект, к которому обращается код. Если операция выполняется без сообщения «Нарушение прав доступа» — режим работает. Если ошибка появляется — либо режим не установлен, либо обработка исполняется в безопасном режиме и вызов был проигнорирован с ошибкой.
Также учитывайте контекст исполнения: привилегированный режим, установленный в одной серверной процедуре, не «переходит» автоматически в другую, если между ними происходит возврат на клиент. После каждого нового серверного вызова режим нужно устанавливать заново.
Как проверить результат
Возвращает Истина
Возвращает Ложь — вызов не выполнен или запрещён безопасным режимом
Возвращает Ложь — ограничений нет
Возвращает Истина — привилегированный режим недоступен
Операция выполняется без ошибок
Ошибка «Нарушение прав доступа»
Типичные ошибки и ограничения
Первая распространённая ошибка — попытка установить привилегированный режим в клиентской процедуре формы. Функция доступна только на сервере, поэтому код нужно переносить в серверные процедуры или модуль объекта обработки.
Вторая ошибка — забытый вызов отключения режима. Хотя режим автоматически сбрасывается по завершении серверного вызова, оставление его включённым внутри длинной процедуры повышает риск непреднамеренных изменений данных без контроля прав.
Третья ошибка — ожидание, что привилегированный режим обходит безопасный режим. Это не так: безопасный режим — более сильное ограничение, и внутри него установка привилегированного режима запрещена на уровне платформы. Сначала решите вопрос с безопасным режимом, потом включайте привилегированный.
FAQ
Можно ли включить привилегированный режим на клиенте в управляемой форме?
Нет. Функция УстановитьПривилегированныйРежим доступна только в серверном контексте. В модуле формы создайте процедуру с директивой &НаСервере или &НаСервереБезКонтекста и вызывайте функцию внутри неё.
Почему возникает ошибка при вызове УстановитьПривилегированныйРежим в обработке из «Дополнительных отчетов и обработок»?
Обработка выполняется в безопасном режиме, который запрещает установку привилегированного режима. Либо отключите безопасный режим в настройках подсистемы, либо запускайте обработку через Файл → Открытие, либо перенесите операцию в привилегированный общий модуль конфигурации.
Нужно ли отключать привилегированный режим после использования?
Платформа автоматически сбрасывает режим по окончании серверного вызова, но явное отключение через УстановитьПривилегированныйРежим(Ложь) сразу после критичного участка — хорошая практика. Она защищает остальной код процедуры от непреднамеренного выполнения без проверки прав.
Даёт ли привилегированный режим доступ к файловой системе и внешним компонентам?
Нет. Привилегированный режим отключает только проверку прав доступа к данным информационной базы. Ограничения безопасного режима на файловые операции, COM-объекты и внешние компоненты он не снимает — это разные механизмы.
Как проверить, что код действительно выполняется в привилегированном режиме?
Вызовите функцию ПривилегированныйРежим() — она вернёт Истина при активном режиме. Дополнительно проверьте функцией БезопасныйРежим(), что обработка не исполняется с ограничениями: в безопасном режиме привилегированный включить нельзя.
Что лучше для постоянно используемой обработки: привилегированный режим в коде или общий модуль конфигурации?
Для постоянной эксплуатации надёжнее общий модуль с флагом «Привилегированный»: логика с повышенными правами находится в одном контролируемом месте и не зависит от настроек безопасного режима подключения обработки. Разовые задачи проще решить установкой режима прямо в обработке.
Что важно запомнить
Привилегированный режим включается функцией УстановитьПривилегированныйРежим(Истина) только в серверном коде и отключает проверку прав доступа к данным. В безопасном режиме, который применяется при подключении обработок через БСП, этот вызов запрещён — сначала устраните ограничение или перенесите логику в привилегированный общий модуль. Проверяйте результат функциями ПривилегированныйРежим() и БезопасныйРежим() и отключайте режим сразу после критичного участка кода.