При выполнении типовых операций (например, в обработке «Обмен с банком» или при выгрузке данных) в клиент-серверном режиме работы 1С:Предприятия может возникать исключительная ситуация: «Установлен безопасный режим. Выполнение операции запрещено». Ошибка чаще всего проявляется на серверных строках кода, связанных с обращением к файловой системе, например: ПотокВыгрузки.Записать(ИмяВременногоФайла, Кодир); или Текст.Записать(...).
Разберем детально, почему возникает данное ограничение платформы и какими способами можно локализовать и устранить эту проблему.
Попытка просто «снять» ограничение в месте падения с помощью вызова функции отключения приведет к новой ошибке:
// Попытка снять безопасный режим перед записью файла:
УстановитьБезопасныйРежим(Ложь);
ПотокВыгрузки.Записать(ИмяВременногоФайла, Кодир);
// Результат: Ошибка "В данной процедуре/функции не был установлен безопасный режим"
Платформа 1С устроена так, что метод УстановитьБезопасныйРежим(Ложь) может быть вызван только на том же уровне стека вызовов, где режим был инициализирован программно через УстановитьБезопасныйРежим(Истина). Если контекст безопасного режима наложен родительским процессом, расширением или профилем безопасности кластера, снять его точечно внутри вложенной процедуры невозможно. Кроме того, УстановитьПривилегированныйРежим(Истина) отключает только RLS и проверку ролей, но не отменяет запреты безопасного режима на работу с диском.
Наиболее распространенная причина наложения безопасного режима на типовые механизмы — работа расширений (патчей или кастомных доработок). Если код типовой обработки вызывается через перехватчик расширения (аннотации &Вместо, &Перед, &После), и для расширения включен безопасный режим, весь вложенный контекст исполнения становится ограниченным.
Если база работает в клиент-серверном варианте (SQL), безопасный режим может накладываться настройками самой информационной базы в кластере серверов.
При определенных сценариях интерактивного запуска внешних компонент или файлов платформа задействует механизм защиты от опасных действий для конкретной учетной записи.
Когда выгрузка выполняется через механизм длительных операций БСП, безопасный режим может передаваться в фоновое задание в качестве параметра запуска.
ДлительныеОперации и вызов функции ЗапуститьВыполнениеВФоне).ПараметрыВыполнения: убедимся, что свойство БезопасныйРежим имеет значение Ложь или не инициализировано принудительно в Истина.Если в коде путь для сохранения формируется вручную, стандартные механизмы безопасности могут заблокировать операцию. Для гарантированной записи на сервере рекомендуется генерировать пути с использованием предопределенных системных функций:
// Формирование корректного пути к временному файлу на сервере:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ПотокВыгрузки = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.ANSI);
ПотокВыгрузки.ЗаписатьСтроку(ТекстДанных);
ПотокВыгрузки.Закрыть();
Также, если доработка конфигурации выполняется разработчиком, выгрузку файлов можно вынести в отдельный общий модуль с установленными признаками «Сервер», «Привилегированный» и отключенным безопасным вызовом.