1С: Фоновые задания внутри фоновых заданий
Задача: распаралелить медленную вставку записей в БД 1С, при чтении файла Excel
Как ни странно, но такая возможность есть и работает начиная с версии платформы 8.3.8. Т.е. можно запустить фоновое задание внутри фонового задания….ну например по вставке в БД большого количества записей, которая выполняется весьма медленно. Полноценно этот процесс распаралелить можно например как-то так:
Функция СделатьЗаписьвБДПДЗФоново(парам) экспорт
...
// делаем медленную запись в БД
...
конецфункции
// Просматриваем массив с идентификаторами фоновых заданий и удаляем те которые завершились
Функция ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий) экспорт
для каждого ФЗМ из МассивФоновыхЗаданий цикл
ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФЗМ);
если ФЗ.Состояние<>СостояниеФоновогоЗадания.Активно тогда
МассивФоновыхЗаданий.Удалить(МассивФоновыхЗаданий.Найти(ФЗМ));
конецесли;
конеццикла;
возврат МассивФоновыхЗаданий;
конецфункции
// выполняем загрузку построчно файла Excel, запуская запись данных в БД
// отдельным потоком. Количество потоков ограничивам 10 штуками
Функция ВыполнитьЗагрузку(парам) экспорт
МассивФоновыхЗаданий=Новый Массив();
МаксимумЗаданий=10;
...
Для нСтрокаТФ = 2 ПО КолВоСтрокФайла Цикл
....
МассивПараметров = Новый Массив;
Параметры=Новый Структура("aa,bb,cc",
1,
2,
3,
);
МассивПараметров.Добавить(Параметры);
ФЗ = ФоновыеЗадания.Выполнить("ДлительныеОперации.СделатьЗаписьвБДПДЗФоново",МассивПараметров);
МассивФоновыхЗаданий.Добавить(ФЗ.УникальныйИдентификатор);
МассивФоновыхЗаданий=ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий);
// ждём пока завершаться запущеные потоки, если их больше 10
пока МассивФоновыхЗаданий.Количество()>МаксимумЗаданий цикл
МассивФоновыхЗаданий=ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий);
конеццикла;
....
конеццикла;
конецфункции
В ниже приведённом каркасе кода, фоново выполняется функция ВыполнитьЗагрузку(), которая читает большой файл Excel, затем каждый цикл вставки записи в БД запускает в свою очередь фоново, ограничивая в данном случае количество фоновых заданий 10 штуками.