1С: Фоновые задания внутри фоновых заданий
Задача: распаралелить медленную вставку записей в БД 1С, при чтении файла Excel
Как ни странно, но такая возможность есть и работает начиная с версии платформы 8.3.8. Т.е. можно запустить фоновое задание внутри фонового задания….ну например по вставке в БД большого количества записей, которая выполняется весьма медленно. Полноценно этот процесс распаралелить можно например как-то так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Функция СделатьЗаписьвБДПДЗФоново(парам) экспорт ... // делаем медленную запись в БД ... конецфункции // Просматриваем массив с идентификаторами фоновых заданий и удаляем те которые завершились Функция ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий) экспорт для каждого ФЗМ из МассивФоновыхЗаданий цикл ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФЗМ); если ФЗ.Состояние<>СостояниеФоновогоЗадания.Активно тогда МассивФоновыхЗаданий.Удалить(МассивФоновыхЗаданий.Найти(ФЗМ)); конецесли; конеццикла; возврат МассивФоновыхЗаданий; конецфункции // выполняем загрузку построчно файла Excel, запуская запись данных в БД // отдельным потоком. Количество потоков ограничивам 10 штуками Функция ВыполнитьЗагрузку(парам) экспорт МассивФоновыхЗаданий=Новый Массив(); МаксимумЗаданий=10; ... Для нСтрокаТФ = 2 ПО КолВоСтрокФайла Цикл .... МассивПараметров = Новый Массив; Параметры=Новый Структура("aa,bb,cc", 1, 2, 3, ); МассивПараметров.Добавить(Параметры); ФЗ = ФоновыеЗадания.Выполнить("ДлительныеОперации.СделатьЗаписьвБДПДЗФоново",МассивПараметров); МассивФоновыхЗаданий.Добавить(ФЗ.УникальныйИдентификатор); МассивФоновыхЗаданий=ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий); // ждём пока завершаться запущеные потоки, если их больше 10 пока МассивФоновыхЗаданий.Количество()>МаксимумЗаданий цикл МассивФоновыхЗаданий=ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий); конеццикла; .... конеццикла; конецфункции |
В ниже приведённом каркасе кода, фоново выполняется функция ВыполнитьЗагрузку(), которая читает большой файл Excel, затем каждый цикл вставки записи в БД запускает в свою очередь фоново, ограничивая в данном случае количество фоновых заданий 10 штуками.