|   |   | 
| 
 | Помогите распараллелить процедуру программистище, lEvGl, orakool, Михаил_, Mulber, Ногаминебить, AlexKimp, Garykom, RVN, mr_K, MishaSan, Бычье сердце, Злопчинский, Шурик71, maxar, kubik_live, Галахад, Андрюха, youalex, kir-g, Arh01, Djelf, Kigo_Kigo, banco, LevelUP, СделатьВсеХорошо, Lazy Stranger, formista2000, oleg_km, lucky_, Bigbro, Gucci76, ldo6, Timon1405, vyaz, dmt, GreyK, 2mugik, Zamestas, Irbis, Chameleon1980, qsunnx, Мультук, shuhard, piter3, maxab72, trad, Trinitron, Vstur, АгентБезопаснойНацио, Ненавижу 1С, Builder, Хряк, obs191, Волшебник, bmitkin, H A D G E H O G s, craxx, Anton1307, Крэкпэк, Redkiy, sikuda, Михаил Козлов, lubitelxml, yurikmellon2, Rovan, mishaPH, AlvlSpb, crotnn, Gun47, Has, arsik, Масянька, Crusher, Kongo2019, d4rkmesa, Linemoon, 2S, Fedor-1971, privetik, alexela, nick86, Hawk_1c, boev82, Amfiaray, Beduin, Александр111, zenik, Prog_man, p-soft | ☑ | ||
|---|---|---|---|---|
| 0
    
        Mulber 18.04.25✎ 10:05 | 
        Доброго всем дня. Нуждаюсь в помощи по распараллеливанию процедуры по 4 фоновых задания (по поставщикам, 4 разом из СписокПоставщиков).Сейчас в цикле последовательно данные получаю: &НаСервере
 ЗагрузитьЦеныПоставщиковЭкспПроцедура ЗагрузитьЦеныПоставщиковЭксп(Список, ДанныеПоставщика, ПакетнаяОбработка = Ложь) Экспорт
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "N");
	ТЗ.Колонки.Добавить("MPN", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100)), "MPN");
	ТЗ.Колонки.Добавить("MPNAPI", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100)), "MPN API");
	ТЗ.Колонки.Добавить("КоличествоВЗаказе", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Количество в заказе");
	ТЗ.Колонки.Добавить("ПроизводительВЗаказе", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Производитель в заказе"); 
	ТЗ.Колонки.Добавить("Производитель", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Производитель");
	ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Цена");
	ТЗ.Колонки.Добавить("Валюта", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(10)), "Валюта"); 
	ТЗ.Колонки.Добавить("МинКоличествоЗаказа", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Мин количество заказа");
	ТЗ.Колонки.Добавить("КоличествоВУпаковке", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Количество в упаковке");
	ТЗ.Колонки.Добавить("НаличиеНаСкладе", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Наличие на складе");
	ТЗ.Колонки.Добавить("СрокПоставки", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Срок поставки");
	ТЗ.Колонки.Добавить("СуммаЗаказа", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Сумма заказа");
	ТЗ.Колонки.Добавить("ВесПозиции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 3)), "Вес позиции");
	ТЗ.Колонки.Добавить("ОтветСервера", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Ответ сервера");
	ТЗ.Колонки.Добавить("Поставщик", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Поставщик");
	
	Если Список.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
		
	СписокПоставщиков = Новый Массив();
	НомераПоставщиков = Новый Массив();
	
	Для Каждого Поставщик Из Список Цикл
		Масс = ПодключениеИЗагрузкаДанныхПоставщиков.СтрРазделить(Поставщик, "~", Истина);
		НомераПоставщиков.Добавить(Масс[0]);
		СписокПоставщиков.Добавить(Масс[1]);
	КонецЦикла;
	
	Для Каждого Поставщик Из СписокПоставщиков Цикл	
		_MPN = "";
		_MAN = "";
		_QTY = "";	
		_TKN = "";
		_RES1 = "";
		_RES2 = "";
		
		Выгрузка = ПодключениеИЗагрузкаДанныхПоставщиков.ПолучитьНастройкиAPIПоставщика(Поставщик);
		
		Если Выгрузка.Количество() = 0 Тогда
			Возврат;
		КонецЕсли;
			
		Принудительно = Не ПакетнаяОбработка;
		
		МассивПартНомеров = Новый Массив();
		
		МассивПартНомеров = ДанныеПоставщика.ВыгрузитьКолонку("MPN");
			
		Сч = 1;
		
		КоличествоПозиций = МассивПартНомеров.Количество();		
		
		Рез = ВыполнитьЗапрос(0, Выгрузка, _MPN, _MAN, _QTY, _TKN, _RES1, _RES2, Сч, Поставщик, Принудительно, СписокПоставщиков, Список, 
							МассивПартНомеров, КоличествоПозиций, ДанныеПоставщика, НомераПоставщиков, ТЗ, ПакетнаяОбработка);
							
		Если Рез = 0 Тогда
			Возврат;
		ИначеЕсли Рез = 1 Тогда
			Продолжить;
		ИначеЕсли Рез = 2 Тогда
			Прервать;
		КонецЕсли;
		
		Рез = ВыполнитьЗапрос(1, Выгрузка, _MPN, _MAN, _QTY, _TKN, _RES1, _RES2, Сч, Поставщик, Принудительно, СписокПоставщиков, Список, 
							МассивПартНомеров, КоличествоПозиций, ДанныеПоставщика, НомераПоставщиков, ТЗ, ПакетнаяОбработка);
							
		Если Рез = 0 Тогда
			Возврат;
		ИначеЕсли Рез = 1 Тогда
			Продолжить;
		ИначеЕсли Рез = 2 Тогда
			Прервать;
		КонецЕсли;
		
		Рез = ВыполнитьЗапрос(2, Выгрузка, _MPN, _MAN, _QTY, _TKN, _RES1, _RES2, Сч, Поставщик, Принудительно, СписокПоставщиков, Список, 
							МассивПартНомеров, КоличествоПозиций, ДанныеПоставщика, НомераПоставщиков, ТЗ, ПакетнаяОбработка);
							
		Если Рез = 0 Тогда
			Возврат;						
		ИначеЕсли Рез = 1 Тогда
			Продолжить;
		ИначеЕсли Рез = 2 Тогда
			Прервать;
		КонецЕсли;
							
	КонецЦикла;
	
КонецПроцедуры | |||
| 1
    
        программистище 18.04.25✎ 15:43 | 
        Если у поставщиков не равномерное количество данных, посчитай вхождение, сделай таблицу, назначь веса поставщикам, и равномерно разбей на подсписки, и запускай фоновые с этими списками, в чем проблема то?
 по запуску в фоне:В общем виде процесс запуска и обработки результата длительной операции выглядит следующим образом 1) Процедура, которая будет исполняться в фоне, располагается в модуле менеджера объекта или в серверном общем модуле Процедура ВыполнитьДействие(Параметры, АдресРезультата) Экспорт .. ПоместитьВоВременноеХранилище(Результат, АдресРезультата) КонецПроцедуры 2) Запуск операции на сервере и подключение обработчика ожидания &НаКлиенте
Процедура ВыполнитьДействие(
     ДлительнаяОперация = НачатьВыполнениеНаСервере()
     ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект)
     ..
     ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьДействиеЗавершение", ЭтотОбъект)
     ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания)
КонецПроцедуры
&НаСервере
Функция НачатьВыполнениеНаСервере(
     ПараметрыПроцедуры = Новый Структура
     ..
     ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор)
     ..
     Возврат ДлительныеОперации.ВыполнитьВФоне("Обработка.МояОбработка.ВыполнитьДействие"
     ПараметрыПроцедуры, ПараметрыВыполнения)
КонецФункции3) Обработка результата выполнения операции &НаКлиенте Процедура ВыполнитьДействиеЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат = Неопределено Тогда Возврат КонецЕсли Если Результат.Статус ="Ошибка"Тогда СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке) Возврат КонецЕсли ВывестиРезультат(Результат) КонецПроцедуры | |||
| 2
    
        H A D G E H O G s 18.04.25✎ 11:18 | 
        (1) плохая стратегия сразу раскидывать.
 1. Делим список на порции, пофиг какого веса там внутри данные. 2. Выделяем пул фоновых по числу ядер проца -1. 3. Как только фоновое завершается - создаем ему взамен новое фоновое с новой порцией данных. | |||
| 3
    
        Mulber 18.04.25✎ 15:37 | 
        Сделал так, вроде работает:
 ПодробностиПроцедура ЗагрузитьЦеныПоставщиковЭксп_Многопоток(Список, ДанныеПоставщика, ПакетнаяОбработка = Ложь) Экспорт ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "N"); ТЗ.Колонки.Добавить("MPN", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100)), "MPN"); ТЗ.Колонки.Добавить("MPNAPI", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100)), "MPN API"); ТЗ.Колонки.Добавить("КоличествоВЗаказе", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Количество в заказе"); ТЗ.Колонки.Добавить("ПроизводительВЗаказе", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Производитель в заказе"); ТЗ.Колонки.Добавить("Производитель", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Производитель"); ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Цена"); ТЗ.Колонки.Добавить("Валюта", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(10)), "Валюта"); ТЗ.Колонки.Добавить("МинКоличествоЗаказа", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Мин количество заказа"); ТЗ.Колонки.Добавить("КоличествоВУпаковке", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Количество в упаковке"); ТЗ.Колонки.Добавить("НаличиеНаСкладе", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Наличие на складе"); ТЗ.Колонки.Добавить("СрокПоставки", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Срок поставки"); ТЗ.Колонки.Добавить("СуммаЗаказа", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Сумма заказа"); ТЗ.Колонки.Добавить("ВесПозиции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 3)), "Вес позиции"); ТЗ.Колонки.Добавить("ОтветСервера", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Ответ сервера"); ТЗ.Колонки.Добавить("Поставщик", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Поставщик"); Если Список.Количество() = 0 Тогда Возврат; КонецЕсли; СписокПоставщиков = Новый Массив(); НомераПоставщиков = Новый Массив(); Для Каждого Поставщик Из Список Цикл Масс = ПодключениеИЗагрузкаДанныхПоставщиков.СтрРазделить(Поставщик, "~", Истина); НомераПоставщиков.Добавить(Масс[0]); СписокПоставщиков.Добавить(Масс[1]); КонецЦикла; ЧислоПараллельныхПотоков = 5; МассивЗаданий = Новый Массив; Для Каждого Поставщик Из СписокПоставщиков Цикл МассивПараметров = Новый Массив; МассивПараметров.Добавить(Поставщик); МассивПараметров.Добавить(ПакетнаяОбработка); МассивПараметров.Добавить(ДанныеПоставщика); МассивПараметров.Добавить(СписокПоставщиков); МассивПараметров.Добавить(Список); МассивПараметров.Добавить(НомераПоставщиков); МассивПараметров.Добавить(ТЗ); Задание = ФоновыеЗадания.Выполнить("ПодключениеИЗагрузкаДанныхПоставщиков.ЗагрузитьДанныеПоставщика", МассивПараметров); МассивЗаданий.Добавить(Задание); Если МассивЗаданий.Количество() >= ЧислоПараллельныхПотоков Тогда Попытка ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий); Исключение КонецПопытки; МассивЗаданий.Очистить(); КонецЕсли; КонецЦикла; Если МассивЗаданий.Количество() > 0 Тогда Попытка ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий); Исключение КонецПопытки; МассивЗаданий.Очистить(); КонецЕсли; КонецПроцедуры Всем откликнувшимся спасибо! | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |