При разработке сложных механизмов интеграции или обработки больших массивов данных в 1С:Предприятие 8.3 программисты часто прибегают к использованию Библиотеки стандартных подсистем (БСП). Одним из наиболее мощных инструментов для ускорения работы является метод ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков. Однако при работе с внешними обработками (файлами .epf) разработчики сталкиваются с серьезным препятствием: система безопасности платформы блокирует выполнение кода, выдавая предупреждения или ошибку «Установлен безопасный режим. Выполнение операции запрещено».
В данной статье мы подробно разберем, почему возникают эти ошибки, как механизмы БСП взаимодействуют с системой защиты платформы и какие шаги необходимо предпринять, чтобы ваш многопоточный код успешно работал в фоновом режиме.
Метод ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков предназначен для параллельного выполнения кода в нескольких фоновых заданиях. Проанализируем типичный сценарий запуска, который часто приводит к ошибке:
Функция ЗапуститьДлительныеОперации(ТриТабл)
ВыполняемыйМетод = "ВнешняяОбработка.ДобавлениеПодразд_БП_КОРП_2.МодульОбъекта.ДлительнаяОперация_01";
ПараметрыМетода = Новый Соответствие;
Для НомерПотока = 1 По 3 Цикл
КодПотока = "Поток" + НомерПотока;
ПараметрыПотока = Новый Структура;
ПараметрыПотока.Вставить("ПредставленияРегистраторов", ТриТабл[НомерПотока - 1]);
ПараметрыПотокаМассив = Новый Массив;
ПараметрыПотокаМассив.Добавить(ПараметрыПотока);
ПараметрыМетода.Вставить(КодПотока, ПараметрыПотокаМассив);
КонецЦикла;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры();
ПараметрыВыполнения.ВнешнийОтчетОбработка = Новый ДвоичныеДанные("\\srv1_test\shara\Обработка.epf");
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
Возврат ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков(ВыполняемыйМетод, ПараметрыВыполнения, ПараметрыМетода);
КонецФункции
Основная проблема здесь заключается в использовании параметра ВнешнийОтчетОбработка в сочетании с ДвоичныеДанные. Когда БСП получает внешнюю обработку в виде двоичных данных, она по умолчанию запускает её в строгом безопасном режиме. Это сделано для того, чтобы исключить возможность нанесения вреда системе вредоносным кодом из внешнего файла.
Первое, с чем сталкивается пользователь — интерактивное окно «Предупреждение безопасности». Платформа 1С отслеживает открытие внешних файлов и требует подтверждения от пользователя. Проанализируем ситуацию: если обработка запускается регламентным заданием (по расписанию), то фоновое задание не может вывести на экран диалоговое окно. В результате операция просто аварийно завершается.
Решение:
Даже если защита от опасных действий отключена, мы можем столкнуться с ошибкой при вызове конструктора Новый ДвоичныеДанные или при попытке записи файла. Выясним причину: когда БСП инициализирует потоки для внешней обработки, она устанавливает для них свойство БезопасныйРежим = Истина.
В безопасном режиме запрещены:
Если внутри вашей процедуры ДлительнаяОперация_01 происходит обращение к сетевому ресурсу или создание временных файлов, система выдаст исключение.
Рассмотрим наиболее правильный с точки зрения архитектуры БСП способ решения проблемы. Вместо того чтобы передавать двоичные данные файла напрямую, лучше зарегистрировать обработку в системе.
Разберем по шагам:
Проанализируем, как изменится код подготовки параметров:
// Получаем ссылку на нашу обработку из справочника
СсылкаНаОбработку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("МояМногопоточнаяОбработка");
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры();
// Передаем ссылку, а не двоичные данные файла
ПараметрыВыполнения.ВнешнийОтчетОбработка = СсылкаНаОбработку;
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
В этом случае БСП будет использовать настройки безопасности, заданные для конкретной дополнительной обработки, что позволит избежать принудительного включения безопасного режима в потоках.
Если специфика задачи требует выполнения операций, запрещенных в обычном режиме, нам необходимо убедиться, что код внутри потока имеет достаточные полномочия. Посмотрим на пример оформления экспортной процедуры в модуле объекта внешней обработки:
Процедура ДлительнаяОперация_01(Параметры, АдресРезультата) Экспорт
// Пытаемся установить привилегированный режим для обхода ограничений прав
УстановитьПривилегированныйРежим(Истина);
Если ПривилегированныйРежим() Тогда
// Здесь выполняем чтение файлов или запись в регистры
ДанныеФайла = Новый ДвоичныеДанные(Параметры.ПутьКФайлу);
// ... логика обработки ...
Иначе
ЗаписьЖурналаРегистрации("Ошибка.Потоки", УровеньЖурналаРегистрации.Ошибка,,,
"Не удалось установить привилегированный режим в потоке!");
КонецЕсли;
КонецПроцедуры
Важное замечание: УстановитьПривилегированныйРежим(Истина) сработает только в том случае, если сам поток НЕ запущен в безопасном режиме платформы. Именно поэтому так важно правильно настроить запуск фонового задания через профили безопасности или справочник дополнительных обработок.
Подведем итог нашим действиям. Чтобы успешно запустить многопоточную операцию во внешней обработке и избежать ошибок доступа, необходимо проверить три уровня настроек:
1. Уровень пользователя: Снять галочку «Защита от опасных действий» в конфигураторе для учетной записи, под которой работает сервер 1С или запускается регламентное задание.
2. Уровень БСП: Избегать передачи ДвоичныеДанные напрямую в ПараметрыВыполнения.ВнешнийОтчетОбработка. Использовать регистрацию обработки в справочнике «Дополнительные отчеты и обработки» с отключенным безопасным режимом.
3. Уровень кода: Проверить, что процедура в модуле объекта является экспортной, а все передаваемые параметры (в структуре ПараметрыМетода) являются сериализуемыми (нельзя передавать мутабельные объекты, такие как открытые формы или объекты базы данных).
Соблюдение этих рекомендаций обеспечит стабильную работу фоновых процессов и позволит в полной мере использовать вычислительные мощности сервера для параллельной обработки данных.