Как исправить ошибку «Установлен безопасный режим» при выполнении процедуры в несколько потоков во внешней обработке

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

При разработке сложных механизмов интеграции или обработки больших массивов данных в 1С:Предприятие 8.3 программисты часто прибегают к использованию Библиотеки стандартных подсистем (БСП). Одним из наиболее мощных инструментов для ускорения работы является метод ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков. Однако при работе с внешними обработками (файлами .epf) разработчики сталкиваются с серьезным препятствием: система безопасности платформы блокирует выполнение кода, выдавая предупреждения или ошибку «Установлен безопасный режим. Выполнение операции запрещено».

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

Анализ механизма работы многопоточности в БСП

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


Функция ЗапуститьДлительныеОперации(ТриТабл)
    ВыполняемыйМетод = "ВнешняяОбработка.ДобавлениеПодразд_БП_КОРП_2.МодульОбъекта.ДлительнаяОперация_01";
    ПараметрыМетода = Новый Соответствие;
    
    Для НомерПотока = 1 По 3 Цикл
        КодПотока = "Поток" + НомерПотока;
        ПараметрыПотока = Новый Структура;
        ПараметрыПотока.Вставить("ПредставленияРегистраторов", ТриТабл[НомерПотока - 1]);
        ПараметрыПотокаМассив = Новый Массив;
        ПараметрыПотокаМассив.Добавить(ПараметрыПотока);
        ПараметрыМетода.Вставить(КодПотока, ПараметрыПотокаМассив);
    КонецЦикла;

    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры();
    ПараметрыВыполнения.ВнешнийОтчетОбработка = Новый ДвоичныеДанные("\\srv1_test\shara\Обработка.epf");
    ПараметрыВыполнения.ЗапуститьВФоне = Истина;
    
    Возврат ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков(ВыполняемыйМетод, ПараметрыВыполнения, ПараметрыМетода);
КонецФункции

Основная проблема здесь заключается в использовании параметра ВнешнийОтчетОбработка в сочетании с ДвоичныеДанные. Когда БСП получает внешнюю обработку в виде двоичных данных, она по умолчанию запускает её в строгом безопасном режиме. Это сделано для того, чтобы исключить возможность нанесения вреда системе вредоносным кодом из внешнего файла.

Причина 1: Защита от опасных действий

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

Решение:

  1. Откроем конфигуратор и перейдем в список пользователей (Администрирование — Пользователи).
  2. Найдем пользователя, под которым выполняется регламентное задание (или текущего пользователя, если запуск интерактивный).
  3. В свойствах пользователя на закладке «Основные» найдем флаг «Защита от опасных действий».
  4. Снимем этот флаг. Это позволит платформе не запрашивать подтверждение при выполнении потенциально опасных операций, таких как загрузка внешних обработок или работа с файловой системой.

Причина 2: Безопасный режим и ограничение прав

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

В безопасном режиме запрещены:

Если внутри вашей процедуры ДлительнаяОперация_01 происходит обращение к сетевому ресурсу или создание временных файлов, система выдаст исключение.

Эффективное решение через справочник «Дополнительные отчеты и обработки»

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

Разберем по шагам:

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

Проанализируем, как изменится код подготовки параметров:


// Получаем ссылку на нашу обработку из справочника
СсылкаНаОбработку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("МояМногопоточнаяОбработка");

ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры();
// Передаем ссылку, а не двоичные данные файла
ПараметрыВыполнения.ВнешнийОтчетОбработка = СсылкаНаОбработку;
ПараметрыВыполнения.ЗапуститьВФоне = Истина;

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

Использование привилегированного режима внутри потока

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


Процедура ДлительнаяОперация_01(Параметры, АдресРезультата) Экспорт
    
    // Пытаемся установить привилегированный режим для обхода ограничений прав
    УстановитьПривилегированныйРежим(Истина);
    
    Если ПривилегированныйРежим() Тогда
        // Здесь выполняем чтение файлов или запись в регистры
        ДанныеФайла = Новый ДвоичныеДанные(Параметры.ПутьКФайлу);
        // ... логика обработки ...
    Иначе
        ЗаписьЖурналаРегистрации("Ошибка.Потоки", УровеньЖурналаРегистрации.Ошибка,,, 
            "Не удалось установить привилегированный режим в потоке!");
    КонецЕсли;

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

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

Резюме по устранению ошибок

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

1. Уровень пользователя: Снять галочку «Защита от опасных действий» в конфигураторе для учетной записи, под которой работает сервер 1С или запускается регламентное задание. 2. Уровень БСП: Избегать передачи ДвоичныеДанные напрямую в ПараметрыВыполнения.ВнешнийОтчетОбработка. Использовать регистрацию обработки в справочнике «Дополнительные отчеты и обработки» с отключенным безопасным режимом. 3. Уровень кода: Проверить, что процедура в модуле объекта является экспортной, а все передаваемые параметры (в структуре ПараметрыМетода) являются сериализуемыми (нельзя передавать мутабельные объекты, такие как открытые формы или объекты базы данных).

Соблюдение этих рекомендаций обеспечит стабильную работу фоновых процессов и позволит в полной мере использовать вычислительные мощности сервера для параллельной обработки данных.

← На главную