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

&НаСервере

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


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


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

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

"ВЫБРАТЬ

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

|ИЗ

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

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


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

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


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


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

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


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

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


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


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

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

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


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

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

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

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

КонецЕсли;


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

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

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

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

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


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

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


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

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


КонецЦикла;


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

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

Попытка

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

Исключение

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

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

КонецЕсли;


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


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


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

 

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


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


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

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

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

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

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

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

КонецЦикла;

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