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 штуками.