Ускорение обработки данных в 1С
В этой статье расскажу о том, как можно распараллеливать выполнение длительной обработки данных. Рассмотрим на примере процедуры, в которой получаем массив объектов и обрабатываем по очереди.
&НаСервере
Процедура ДлительнаяОперация()
МассивОбъектов = ПолучитьМассивОбъектов();
Для Каждого Ссылка Из МассивОбъектов Цикл
ОбработатьОбъект(Ссылка);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьДлительнуюОперацию(Команда)
ДлительнаяОперация();
КонецПроцедуры
У меня операция занимает 15 сек.
Создаем процедуру ЗапуститьДлительнуюОперациюНаСервере(), в которой получим массив объектов и разделим его на несколько частей, на каждую часть массива создадим фоновое задание.
&НаКлиенте
Процедура ЗапуститьДлительнуюОперацию(Команда)
ЗапуститьДлительнуюОперациюНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗапуститьДлительнуюОперациюНаСервере()
МассивОбъектов = ПолучитьМассивОбъектов();
МассивЧастейОбъектов = Новый Массив;
КолЭлементов = Цел(МассивОбъектов.Количество() / 3);
ЧастьОбъектов = Новый Массив;
Для Индекс = 0 По МассивОбъектов.ВГраница() Цикл
Если ЧастьОбъектов.Количество() >= КолЭлементов Тогда
МассивЧастейОбъектов.Добавить(ЧастьОбъектов);
ЧастьОбъектов = Новый Массив;
КонецЕсли;
ЧастьОбъектов.Добавить(МассивОбъектов.Получить(Индекс));
КонецЦикла;
Если ЧастьОбъектов.Количество() > 0 Тогда
МассивЧастейОбъектов.Добавить(ЧастьОбъектов);
КонецЕсли;
Для Каждого ЧастьОбъектов Из МассивЧастейОбъектов Цикл
ПараметрыВыполнения = Новый Массив;
ПараметрыВыполнения.Добавить(ЧастьОбъектов);
ФоновыеЗадания.Выполнить("СвойОбщийМодуль.ДлительнаяОперация", ПараметрыВыполнения, Новый УникальныйИдентификатор);
КонецЦикла;
КонецПроцедуры
В серверном общем модуле создаем экспортную процедуру, в которой будем обрабатывать эти части массива по очереди. В итоге будут запущены 3 фоновых задания, которые будут обрабатывать только свою часть объектов.
Процедура ДлительнаяОперация(ЧастьОбъектов) Экспорт
Для Каждого Объект Из ЧастьОбъектов Цикл
ОбработатьОбъект(Объект);
КонецЦикла;
КонецПроцедуры
В результате время на операцию занимает меньше секунды.
Но это не значит, что весь массив за это время обработан. Мы лишь запустили задания, которые начали обрабатывать данные в фоне. Если необходима дальнейшая обработка результатов, то можно отловить результаты выполнения фоновых заданий.
Comments
So empty here ... leave a comment!