Вход | Регистрация


Многопоточная обработка с применением БСП

Многопоточная обработка с применением БСП
Я
   Franchiser
 
28.10.18 - 09:26
Как выполнить многопоточная обработку с использованием процедур БСП из внешней обработки, не добавляя свою процедуру из обработки для длительного выполнения в общий модуль. Нашел примеры как выполнять прогресс с БСП из внешней обработки, а примеров по многопоточности нет.
 
 
   Dmitry1c
 
1 - 28.10.18 - 09:39
А твоя задача вообще распараллеливаемая?
   Franchiser
 
2 - 28.10.18 - 09:40
Пример:

&НаСервере

Процедура ОбновитьЦену()


ВремяНачала = ТекущаяДата();


Запрос = Новый Запрос;

Запрос.Текст = 

"ВЫБРАТЬ 

| Товары.Ссылка 

|ИЗ 

| Справочник.Товары КАК Товары"; 

ТаблицаТоваров = Запрос.Выполнить().Выгрузить();


// определяем максимальное количество потоков 


ЧислоПотоков = 8;


ЧислоСтрокВТаблице = ТаблицаТоваров.Количество();


// объем порции данных для обработки каждым потоком 


РазмерПорции = Цел(ЧислоСтрокаВТаблице/ЧислоПотоков);


// массив, где будут храниться фоновые задания 


МассивЗаданий = НовыйМассив;


Для НомерПотока = 1 По ЧислоПотоков Цикл


// определяем индекс для начала обработки данных данным потоком 


// разные потоки обрабатывают разные части таблицы 


ИндексНачала = (НомерПотока - 1)*РазмерПорции;


Если (НомерПотока = ЧислоПотоков) Тогда

// если это последний поток, то он обрабатывает все оставшиеся данные 


// т.к. число потоков может не быть кратно количеству строк в таблице 


РазмерПорции = ЧислоСтрокВТаблице -(ЧислоПотоков*РазмерПорции)+РазмерПорции;

КонецЕсли;


// определяем массив параметров для процедуры 


НаборПараметров = Новый Массив;

НаборПараметров.Добавить(ТаблицаТоваров);

НаборПараметров.Добавить(ИндексНачала);

НаборПараметров.Добавить(РазмерПорции);


// запуск фонового задания 


Задание = ФоновыеЗадания.Выполнить("ОбщийМодуль1.ОбновитьЦенуТовара", НаборПараметров);


// добавляем задание в массив, чтобы потом отследить выполнение 


МассивЗаданий.Добавить(Задание);


КонецЦикла;


// проверим результат выполнения фоновых заданий 


Если МассивЗаданий.Количество() > 0 Тогда

Попытка

ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);

Исключение

// действия в случае ошибки 


КонецПопытки;

КонецЕсли;


Длительность = ТекущаяДата()-ВремяНачала;


Сообщить("Длительность: " + Длительность + "сек.");


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

 

Процедура ОбновитьЦенуТовара (ТаблицаТоваров,ИндексНачала,РазмерПорции) Экспорт


Наценка = 1.10;// наценка 10% 



// обновляем цену только для определенной части таблицы 


Для Сч = 1 По РазмерПорцииЦикл

Индекс = ?(Сч=1,ИндексНачала,Индекс+1);

ТоварОбъект = ТаблицаТоваров[Индекс].Ссылка.ПолучитьОбъект();

ТоварОбъект.Цена = ТоварОбъект.Цена * Наценка;

ТоварОбъект.Записать();

КонецЦикла;

КонецПроцедуры
   Franchiser
 
3 - 28.10.18 - 09:43
Как можно заменить
"ОбщийМодуль1.ОбновитьЦенуТовара" на процедуру из БСП, чтобы выполнить ОбновитьЦенуТовара из модуля формы или модуля объекта текущей внешней обработки. Внешняя обработка м.б. как временной в справочник внешних обработок, так и выбрана через файл-открыть.
   Franchiser
 
4 - 28.10.18 - 09:44
(1) да
   Franchiser
 
5 - 28.10.18 - 10:17
Вроде бы нашел:
ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует