Top.Mail.Ru

Ускорение обработки данных в 1С

В этой статье расскажу о том, как можно распараллеливать выполнение длительной обработки данных. Рассмотрим на примере процедуры, в которой получаем массив объектов и обрабатываем по очереди.

&НаСервере
Процедура ДлительнаяОперация()  
	
	МассивОбъектов = ПолучитьМассивОбъектов();
	
	Для Каждого Ссылка Из МассивОбъектов Цикл
		
		ОбработатьОбъект(Ссылка);
		
	КонецЦикла;

КонецПроцедуры


&НаКлиенте
Процедура ЗапуститьДлительнуюОперацию(Команда)
	
	ДлительнаяОперация();
	
КонецПроцедуры

У меня операция занимает 15 сек.

Создаем процедуру ЗапуститьДлительнуюОперациюНаСервере(), в которой получим массив объектов и разделим его на несколько частей, на каждую часть массива создадим фоновое задание.

&НаКлиенте
Процедура ЗапуститьДлительнуюОперацию(Команда)
	
	ЗапуститьДлительнуюОперациюНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ЗапуститьДлительнуюОперациюНаСервере()
	
	МассивОбъектов = ПолучитьМассивОбъектов();
	
	МассивЧастейОбъектов = Новый Массив;

	КолЭлементов = Цел(МассивОбъектов.Количество() / 3);
	
	ЧастьОбъектов = Новый Массив;
	
	Для Индекс = 0 По МассивОбъектов.ВГраница() Цикл
		
		Если ЧастьОбъектов.Количество() >= КолЭлементов Тогда
			МассивЧастейОбъектов.Добавить(ЧастьОбъектов);
			ЧастьОбъектов = Новый Массив;
		КонецЕсли;
		
		ЧастьОбъектов.Добавить(МассивОбъектов.Получить(Индекс));
		
	КонецЦикла;
	
	Если ЧастьОбъектов.Количество() > 0 Тогда
		МассивЧастейОбъектов.Добавить(ЧастьОбъектов);
	КонецЕсли;
	
	Для Каждого ЧастьОбъектов Из МассивЧастейОбъектов Цикл  
		ПараметрыВыполнения = Новый Массив;
		ПараметрыВыполнения.Добавить(ЧастьОбъектов);
		
		ФоновыеЗадания.Выполнить("СвойОбщийМодуль.ДлительнаяОперация", ПараметрыВыполнения, Новый УникальныйИдентификатор);
	КонецЦикла;
	
КонецПроцедуры

В серверном общем модуле создаем экспортную процедуру, в которой будем обрабатывать эти части массива по очереди. В итоге будут запущены 3 фоновых задания, которые будут обрабатывать только свою часть объектов.

Процедура ДлительнаяОперация(ЧастьОбъектов) Экспорт 
	
	Для Каждого Объект Из ЧастьОбъектов Цикл 
		ОбработатьОбъект(Объект);
	КонецЦикла;
	
КонецПроцедуры

В результате время на операцию занимает меньше секунды.

Но это не значит, что весь массив за это время обработан. Мы лишь запустили задания, которые начали обрабатывать данные в фоне. Если необходима дальнейшая обработка результатов, то можно отловить результаты выполнения фоновых заданий.

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar