В одном из проектов, потребовалось распараллелить процесс загрузки данных из внешних баз. Это потребовалось для ускорения и оптимизации работы конфигурации. Для этих целей, воспользовались таких механизмом 1С 8, как Фоновые задания.
В нашем случае, передача значений в фоновую задачу происходила через параметры. Метод ЗагрузитьИзВИБ имеет два параметра это ВходнойПараметр и АдресВХранилище. ВходнойПараметр это структура, в которую сгружаются все данные, необходимые для проведения загрузки. АдресВХранилище это адрес во временном хранилище, по которому будет передан результат загрузки. Сам код метода фонового задания выглядит так:
1 2 3 4 5 6 7 8 9 10 11 |
Процедура ЗагрузитьИзВИБ(ВходнойПараметр,АдресВХранилище) Экспорт //Из структуры перегоняем данные в переменные ТаблицаДляЗаполнения = ВходнойПараметр.ТаблицаДляЗаполнения; ДанныеОбъекта = ВходнойПараметр.ДанныеОбъекта; //Тут идет собственно загрузка данных ВыполнитьЗагрузку(ТаблицаДляЗаполнения,ДанныеОбъекта); //Возвращаем данные из фоновой задачи в хранилище ПоместитьВоВременноеХранилище(ТаблицаДляЗаполнения, АдресВХранилище); КонецПроцедуры |
Зачем нам в фоновую задачу передавать адрес во временном хранилище. Наша фоновая задача должна куда-то положить результат, причем так, чтобы мы знали где его потом взять.
Для того чтобы запустить фоновые задачи, выполняется следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
МассивАдресовВХранилище = Новый Массив; МассивЗапущенныхЗаданий = Новый Массив; Сч = 1; Пока Сч <= КоличествоПотоков Цикл Ключ = Новый УникальныйИдентификатор; ВходнойПараметр = Новый Структура; ВходнойПараметр.Вставить("ТаблицаДляЗаполнения",ТаблицаДляЗаполнения); ВходнойПараметр.Вставить("ДанныеОбъекта",ДанныеОбъекта); //Подготовим адрес в хранилище АдресВХранилище = ПоместитьВоВременноеХранилище(Неопределено); МассивПараметров = Новый Массив; МассивПараметров.Добавить(ВходнойПараметр); МассивПараметров.Добавить(АдресВХранилище); МассивАдресовВХранилище.Добавить(АдресВХранилище); МассивЗапущенныхЗаданий.Добавить(ФоновыеЗадания.Выполнить("ОбщийМодульСервер.ЗагрузитьИзВИБ",МассивПараметров, Ключ, "Загрузка")); Сч = Сч + 1; КонецЦикла; |
Перед запуском фоновой задачи через ФоновыеЗадания.Выполнить() мы формируем массив параметров. Значения из массива параметров переходят в метод фонового задания в качестве параметров. В МассивЗапущенныхЗаданий хранятся все фоновые задачи, которые мы запустили. Теперь надо подождать их ожидания.
1 |
ФоновыеЗадания.ОжидатьЗавершения(МассивЗапущенныхЗаданий); |
После того как все задачи были завершены, можем приступить к получению из них данных. Для этого мы проходим по всем адресам в хранилище, которые хранятся в массиве МассивАдресовВХранилище. После получения результата фонового задания перегоняем его в общую таблицу.
1 2 3 4 5 6 7 8 |
Для Каждого ТекАдресВХранилище Из МассивАдресовВХранилище Цикл ТекТаблица = ПолучитьИзВременногоХранилища(ТекАдресВХранилище); Для Каждого ТекСтрокаДанные Из ТекТаблица Цикл НоваяСтрока = НашаОбщаяТаблица.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока,ТекСтрокаДанные); КонецЦикла; КонецЦикла; |