Почему внешняя обработка работает через «Файл - Открыть», но выдает ошибку «Установлен безопасный режим» из дополнительных обработок?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Ошибка при вызове метода контекста (Записать): Установлен безопасный режим. Выполнение операции запрещено

Рассмотрим подробно, почему это происходит и какими способами можно решить данную проблему.

Выясним причину ошибки

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

ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяФайла, БезопасныйРежим);

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

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

  1. Запрещается прямая запись и создание файлов на диске сервера (включая работу метода ПолучитьИмяВременногоФайла() и последующий метод .Записать()).
  2. Блокируется выполнение внешних COM-объектов и системных команд.
  3. Игнорируется вызов программной смены режима УстановитьПривилегированныйРежим(Истина).

Способ 1. Отключение безопасного режима в сведениях о внешней обработке

Разберем основной вариант решения на уровне кода обработки. Если обработка поставляется как дополнительная для БСП, в ее модуле объекта присутствует функция СведенияОВнешнейОбработке(). Чтобы разрешить обработке запись файлов и выполнение других операций, необходимо явно отключить безопасный режим при регистрации.

Посмотрим на пример заполнения параметров регистрации:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Наименование = "Обработка загрузки правил";
    ПараметрыРегистрации.Версия = "1.0";
    
    // Явно отключаем безопасный режим
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    Возврат ПараметрыРегистрации;

КонецФункции

Важно: После изменения кода функции модуля обработки необходимо обновить файл обработки в справочнике Дополнительные отчеты и обработки в режиме «1С:Предприятие».

Способ 2. Изменение настроек в режиме «1С:Предприятие»

Если нет возможности оперативно изменить исходный код обработки, администратор базы данных может отключить безопасный режим непосредственно через пользовательский интерфейс:

  1. Перейдем в раздел Администрирование > Печатные формы, отчеты и обработки.
  2. Откроем справочник Дополнительные отчеты и обработки.
  3. Найдем и откроем карточку нужной внешней обработки.
  4. В карточке обработки снимем флаг Безопасный режим (для выполнения этого действия требуются полные права).
  5. Сохраним изменения по кнопке Записать и закрыть.

Способ 3. Оптимизация кода без записи файлов на диск

Бывают ситуации, когда безопасный режим нельзя отключать (например, при работе базы в сервисе 1С:Fresh или при строгих корпоративных политиках безопасности). Если задача обработки заключается в чтении XML-правил из макета типа ТекстовыйДокумент, мы можем извлечь данные напрямую из оперативной памяти без сохранения во временный файл.

Рассмотрим, как заменить сохранение файла на прямое чтение строки:


// Получаем макет текстового документа
МакетПравил = НашаОбработка.ПолучитьМакет("ПравилаОбмена");
ТекстПравил = МакетПравил.ПолучитьТекст();

// Инициализируем объект ЧтениеXML непосредственно из строки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстПравил);

// Далее передаем объект ЧтениеXML в механизмы обработки правил

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

← На главную