0. Техподдержка 02.02.18 09:20

Многопоточность. Универсальный «Менеджер потоков» 2.0

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее.
* Есть желание повысить скорость работы медленных алгоритмов! Но...
* Нет времени думать о реализации многопоточности?
* о запуске и остановке потоков?
* о поддержании потоков в рабочем состоянии?
* о передаче данных в потоки и как получить ответ из потока?
* об организации последовательности?
Тогда ЭТО - то что надо!!!

Перейти к публикации

Лучшие комментарии
31. olegtymko 383 25.10.18 07:25 Сейчас в теме
Доклад на IE огонь!) Спасибо, потестирую у себя систему!
awk; drmaxart; +2 Ответить
Остальные комментарии
Избранное Подписка Сортировка: Древо
1. tormozit 5595 08.02.18 09:30 Сейчас в теме
Опечатка "ОбработатьКоллекуию"
18. Evil Beaver 6300 08.02.18 18:09 Сейчас в теме
(6) Не везде. В примерах кода часто встречается.
19. Техподдержка 08.02.18 19:58
(18)видимо в спойлерах не ищет(( доберусь до компа перепроверю через "источник". В обработке поправлено, видимо пока готовил статью в Ворде не заметил). Спасибо.
2. Xershi 716 08.02.18 09:50 Сейчас в теме
Нужны реальные примеры для чего это нужно. Первую версию не читал.
7. Техподдержка 08.02.18 13:05
(2) Реальные примеры - чтоб у всех работало, придумать толком не смог :)
Идею можно посмотреть Тут
10. Техподдержка 08.02.18 13:12
(2)
чего это нужно
С помощью "ОбработатьОбъект" распараллелил партии в УПП Вот результаты
3. infosoft-v 319 08.02.18 10:04 Сейчас в теме
Здравствуйте. Мощная работа.
Проект есть на GitHub? Можно ссылку?
8. Техподдержка 08.02.18 13:07
(3) Нет нету :( Еще с ним не разобрался :(
4. dandykry 3 08.02.18 10:32 Сейчас в теме
Однозначный плюс за разработку.
5. tsukanov 57 08.02.18 10:54 Сейчас в теме
Эх. Вот сделали бы в платформе возможность ожидать завершения хотя бы одного задания из массива,
и все эти извраты были бы не нужны.
9. Техподдержка 08.02.18 13:10
(5) Ну так запускайте не в массиве, а по одному :) Массив то зачем?
11. tsukanov 57 08.02.18 13:24 Сейчас в теме
(9) А как ожидать завершения? По таймеру проверять?

Суть то в том, чтобы запустить пачку заданий и при завершении хотя бы одного тут же выдать новое задание с новой порцией данных. Так можно максимально утилизировать процессор и управление потоками становится тривиальным
12. Техподдержка 08.02.18 13:25
(11) Можно по таймеру, можно по значению переменной (в текущей реализации она также сохраняется в общих настройках) и мониторить ее на каждой итерации.
13. tsukanov 57 08.02.18 13:26 Сейчас в теме
(12) Вот вот. Извращения. А все из-за дурацкой реализации ожидания в платформе

ps Посмотрите в Go оператор Select - вот там правильно сделано
DarkAn; starik-2005; +2 Ответить
14. Техподдержка 08.02.18 13:34
(13) На сколько я понимаю, в Вашей реализации вы предлагаете задействовать, недавние вирусы (meltdown и spectre), тогда возможно получиться получать ответ сразу как задание выполнено :)
15. tsukanov 57 08.02.18 13:35 Сейчас в теме
(14) Не понял о чем вы. В общем смотрите как сделано в Go
28. tsukanov 57 07.09.18 08:10 Сейчас в теме
(14) Вышла 13 платформа, в которой это стало возможно )
29. Техподдержка 07.09.18 10:49
(28)
ышла 13 платформа, в которой это стало возмож

А можно по подробнее? На что обратить внимание?
30. tsukanov 57 07.09.18 14:01 Сейчас в теме
(29) Там новый метод для ожидания появился. Вот пример использования как я описывал выше: gist.github.com/tsukanov-as/4a75e731d959017d7238e5ce456e6f28

Ждем изменения статуса хотя бы одного и подменяем сразу на новое задание.
20. izidakg 149 08.02.18 22:54 Сейчас в теме
развитие будет или все задуманное реализовано?
22. Техподдержка 09.02.18 09:06
(20) Есть еще несколько идей (осталось только время найти для их воплощения). Они пока не реализованы, т.к. реализуй я их, то текущую версию выложил бы еще не скоро. Так основные задумки все работают - можно смело пользоваться.
21. artemka 09.02.18 07:59 Сейчас в теме
А каким образом происходит восстановление партий в несколько потоков? Например, для того, чтобы восстановить партию, мне нужно знать остатки по номенклатуре на дату, а пока предыдущий поток не завершится этих данных не будет.
23. Техподдержка 09.02.18 09:09
(21) Артем, для ответа на Ваш вопрос, я рекомендую Вам ознакомится первым постом и с текущим. В первом посте вообще все рассказывалось отталкиваясь именно от этой задачи.
Для простоты понимания посмотрите примеры из первого поста
24. gubanoff 46 09.02.18 10:42 Сейчас в теме
(0) на какой версии платформы можно использовать?
25. Техподдержка 09.02.18 10:56
(24) 8.2 и 8.3. v1 тестировалась на 1С:Предприятие 8.3 (8.3.9.1850) обычные формы. Примеры имеют и обычную, и управляемую формы.
26. kauksi 205 06.04.18 09:24 Сейчас в теме
У меня когда то была идея для РАУЗ... передать матрицу через внешнюю компоненту и быстренько посчитать все через CUDA... тока вот руки так и не дошли
27. kote 499 06.07.18 23:21 Сейчас в теме
(26)

.. знаю таких 2 в своей организации - это кроме себя :)

Кто об этом еще задумывался?
31. olegtymko 383 25.10.18 07:25 Сейчас в теме
Доклад на IE огонь!) Спасибо, потестирую у себя систему!
awk; drmaxart; +2 Ответить
33. dimbasbear 17 28.01.19 10:46 Сейчас в теме
Добрый день, очень интересная статья, спасибо за труд.

Скажите:

1. Применимо для восстановление партий + оценка стоимости по средней ?
2. Можно краткий пример как это все запустить для п1, в частности как и у вас для конфигурации УПП.
34. Техподдержка 28.01.19 17:18
Добрый день!

(33)
Добрый день, очень интересная статья, спасибо за труд.

Спасибо за отзыв.


(33)
1. Применимо для восстановление партий + оценка стоимости по средней ?

Применимо для любого учета, кроме разве что - РАУЗ (хотя может и там сработает не проверял).
Все процедуры восстановления - ТИПОВЫЕ с небольшими оговорками о них ниже...

Что у нас есть в типовом учете:
1. У нас есть обработка "Проведение по партиям". В ней процедура "КнопкаВыполнитьНажатие", которая в свою очередь, так или иначе, вызывает "ЗаполнениеДокументов.ВыполнитьВосстановление".

2. В рамках этой процедуры обрабатывается последовательность документов и каждый документ последовательности обрабатывается с помощью "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(..." (по крайне мере основная масса документов списания).

Все, что необходимо сделать - это чтобы эта строка кода выполнялась в событии "ПриОбработкеДействияПотока" со всеми своими параметрами

для этого необходимо следующее:
1. Перед началом цикла "Пока ЕстьДокументы Цикл" получить параметры менеджера потоков, установить параметры и провести его инициализацию
2. В цикле вместо "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров (..." вызвать метод менеджера потоков "ОбработатьОбъект", куда параметрами передать а) СтруктуруПараметровМенеджера, б) ссылку на документ в) Структуру (или любую другой коллекцию) со всеми параметрами из типовой "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров (..."
3. После цикла вызвать метод "ДождатьсяОстановкиМенеджераПотоков" куда передать только СтруктуруПараметровМенеджера.
Все больше в типовой обработке ни чего править не надо.

Дальше идет работа с событиями, что использовалось у Нас:
1. "ПередЗапускомМенеджераПотоков" Создали массив(пустую) для учета документов восстановление по которым не получилось;
2. "ПриПолученииРесурсов" Это основное событие распараллеливания - тут по каждому документу необходимо собирать его ресурсы. Как? Смотрите примеры из презентации или статьи
3. "ПриДобавленииВОчередьОбработки" - тут все просто, если ресурсы есть - возвращаем "Истина", если их нет - "Ложь". Кода возвращается "Истина", объект помещается в граф и по нему рассчитываются связи в зависимости от ресурсов (следующее событие "ПриОбработкеДействияПотока"), а если "Ложь", то объект - пропускается (следующее событие "ПриОбработкеПропуска")
4. "ПриОбработкеДействияПотока" собственно вызываем нашу строчку кода "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(..." со всеми параметрами. Результатом данного метода могут быть произвольные данные (ловятся в событии "ПриОбработкеОтвета")

5. Надо зафиксировать факт НЕ обработки объекта - это можно сделать в 2х событиях: "ПриОбработкеОшибки" - если поток падал в момент обработки объекта (по умолчанию до 5 раз пытается обработать объект) и в событии "ПриОбработкеОтвета" можно, например, при обработке события "ПриОбработкеДействияПотока" возвращать значение переменной "Отказ" если оно "Истина", в этом случае мы заносим объект в структуру определенную в п1.

6. "ПослеЗавершенияМенеджераПотоков" собственно - это последнее событие в нем мы производим установку границы последовательности. Если массив из п1 - пуст, то на самый последний документ последовательности в периоде, а если в массиве есть хоть один документ, то границу устанавливаем на самый ранний.


Для примера:
Количество строк кода во всех событиях: ~400
Самое большое событие: "ПриПолученииРесурсов" ~ 150 строк
Самое маленькое событие: "ПриДобавленииВОчередьОбработки" - 1 строка (Возврат пПараметрыСобытия.СтруктураДанных.МассивРесурсов.Количество() > 0;)

P.S. Один из не маловажных моментов :)
Код написанный в цикле процедуры "ВыполнитьВосстановление" - выполняется в транзакции, так вот: перед выполнением метода "ОбработатьОбъект" рекомендуется ее зафиксировать, а сразу за ним Начать новую. Кроме того в событии "ПриОбработкеДействияПотока" строку "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(..." - наоборот заключить в транзакцию
P.P.S. У нас помимо "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(..." в событии "ПриОбработкеДействияПотока" вызывается еще и "УправлениеПроизводствомДвиженияПоРегистрам.ПровестиДокументПоПроизводственнымРегистрам(..."

Но так у Нас, у Вас возможно будет по другому :)
35. velsevur 29.01.19 09:10 Сейчас в теме
(34)
2. "ПриПолученииРесурсов" Это основное событие распараллеливания - тут по каждому документу необходимо собирать его ресурсы. Как? Смотрите примеры из презентации или статьи


Доброго дня.
А можно привести пример кода для формирования ресурса и как потом им пользоваться. Я в этом месте застрял.
36. Техподдержка 29.01.19 10:38
(35)
А можно привести пример кода для формирования ресурса и как потом им пользоваться.


Ресурсами ни как пользоваться не надо ими пользуется "менеджер потоков" главное правильно их сформировать (тут пример в примерах, на картинках, см. строку "Массивы" надо сформировать массив массивов)

Вот примерный код:
СтруктураДанных = пПараметрыСобытия.СтруктураДанных;
ОбрабатываемыйОбъект = СтруктураДанных.ОбрабатываемыйОбъект;
ПараметрыДляОбъекта  = СтруктураДанных.ПараметрыДляОбъекта;

МассивРесурсов = Новый Массив;
ТаблицаСписания = УправлениеЗапасамиПартионныйУчет.ПолучитьТаблицуСтрокДокументов(ОбрабатываемыйОбъект, 
				ПараметрыДляОбъекта.Упр, 
				ПараметрыДляОбъекта.Бух, 
				ПараметрыДляОбъекта.Нал);	
	
Для каждого СтрокаСписания из ТаблицаСписания Цикл
	МассивРесурса  = Новый Массив;
	МассивРесурса.Добавить(СтрокаСписания.Номенклатура);
	МассивРесурса.Добавить(СтрокаСписания.Склад);
		
	МассивРесурсов.Добавить(МассивРесурса);
КонецЦикла;

Возврат МассивРесурсов;
Показать
37. dimbasbear 17 29.01.19 16:11 Сейчас в теме
Дальше идет работа с событиями, что использовалось у Нас:
1. "ПередЗапускомМенеджераПотоков" Создали массив(пустую) для учета документов восстановление по которым не получилось;
2. "ПриПолученииРесурсов" Это основное событие распараллеливания - тут по каждому документу необходимо собирать его ресурсы. Как? Смотрите примеры из презентации или статьи
3. "ПриДобавленииВОчередьОбработки" - тут все просто, если ресурсы есть - возвращаем "Истина", если их нет - "Ложь". Кода возвращается "Истина", объект помещается в граф и по нему рассчитываются связи в зависимости от ресурсов (следующее событие "ПриОбработкеДействияПотока"), а если "Ложь", то объект - пропускается (следующее событие "ПриОбработкеПропуска")
4. "ПриОбработкеДействияПотока" собственно вызываем нашу строчку кода "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(..." со всеми параметрами. Результатом данного метода могут быть произвольные данные (ловятся в событии "ПриОбработкеОтвета")

5. Надо зафиксировать факт НЕ обработки объекта - это можно сделать в 2х событиях: "ПриОбработкеОшибки" - если поток падал в момент обработки объекта (по умолчанию до 5 раз пытается обработать объект) и в событии "ПриОбработкеОтвета" можно, например, при обработке события "ПриОбработкеДействияПотока" возвращать значение переменной "Отказ" если оно "Истина", в этом случае мы заносим объект в структуру определенную в п1.

6. "ПослеЗавершенияМенеджераПотоков" собственно - это последнее событие в нем мы производим установку границы последовательности. Если массив из п1 - пуст, то на самый последний документ последовательности в периоде, а если в массиве есть хоть один документ, то границу устанавливаем на самый ранний.


Дошел до событий, дабы не городить костыли - можно пример кода по каждому из событий для восст. по партиям?
38. Техподдержка 29.01.19 17:14
(37)
Дошел до событий, дабы не городить костыли - можно пример кода по каждому из событий для восст. по партиям?


В рамках данной статьи это не предусмотрено.
Постараюсь собраться с силами и выложить новую со всеми кодами для восстановления партий на нашем примере :)

Вам могу, пока, посоветовать "городить костыли" заодно опробуете все сами.

Рекомендации:
0) Поднимите копию базы и сделайте там первое полное восстановление за месяц (это будет эталон для сравнения)
1) разработку рекомендую начать в отдельной базе с 1 потока;
2) восстановление делайте в рамках 1 дня;
3) для сверки пользуйтесь "Ведомость по партиям товаров на складах"
4) как добьетесь результата на 1 потоке увеличивайте их количество до 2-3, если и на них все будет гладко, то ставьте, то количество которое потянет ваш сервер :) (У нас восстановление делается на 10 потоках - этого для нас достаточно. Но была задача по непосредственному удалению документов из БД, там писали обработку и удаляли на 45 потоках. Все зависит от специфики, задачи, железа и т.д.)

Для восстановление выше приведенного кода(с расчетом ресурсов) не достаточно - все зависит от специфики Вашего предприятия. В нашем дополнительно еще собираются ресурсы по производственной части.

Так что, дерзайте!

P.S. Я надеюсь у Вас управляемый режим блокировок?
39. velsevur 30.01.19 10:59 Сейчас в теме
Подскажите, что нужно сделать, что-бы сработал механизм формирования ресурсов.
Запускаю потоки через "мпМенеджерПотоков.ОбработатьКоллекциюОбъектов".

2. "ПриПолученииРесурсов" Это основное событие распараллеливания - тут по каждому документу необходимо собирать его ресурсы. Как? Смотрите примеры из презентации или статьи
не срабатывает.
40. Техподдержка 30.01.19 11:13
Событие "ПриПолученииРесурсов" предназначено только для метода "ОбработатьОбъект" - когда по объектам необходимо строить граф.
Рекомендую посмотреть презентацию с IE2018 (ссылка есть в публикации) или тут.
Необходимый минимум для метода "ОбработатьКоллекциюОбъектов" показан тут.

Пока прикладываю схему доступности событий от методов
Прикрепленные файлы:
41. velsevur 01.02.19 12:09 Сейчас в теме
(40) Спасибо.

Подскажите что я делаю не так:
1. Получаю параметры "ПолучитьСтруктуруПараметровИнициализацииМенеджераПотоков"
2. Инициализирую МП "ИнициализироватьМенеджерПотоков"
3. В цикле обхожу выборку документов методом "ОбработатьОбъект"
4. После цикла ожидаю завершения МП "ДождатьсяОстановкиМенеджераПотоков"

Получаю ошибку:
Поле объекта не обнаружено (АлгоритмыРаботыСКоллекцией)
КодСоздания   = пСтруктураПараметров.ПараметрыИнициализации.ПараметрыОбработкиКоллекции.АлгоритмыРаботыСКоллекцией.КодСоздания;


В структуре "ПараметрыОбработкиКоллекции" действительно нет "АлгоритмыРаботыСКоллекцией".

Перед циклом дописал:
КодСоздания   = "КоллекцияПриемник = Новый СписокЗначений;";
		КодДобавления = "ЗаполнитьЗначенияСвойств(КоллекцияПриемник.Добавить(), КоллекцияИсточник[ИндексКоллекции]);";

		Структура = Новый Структура;
		Структура.Вставить("КодСоздания"  , КодСоздания);
		Структура.Вставить("КодДобавления", КодДобавления);
		
		СтруктураПараметромМП.ПараметрыИнициализации.ПараметрыОбработкиКоллекции.Вставить("АлгоритмыРаботыСКоллекцией", Структура);


А как нужно было сделать правильно?
42. Техподдержка 01.02.19 13:06
(41) пункты с 1 по 4 - правильные
Но вот код вызывающий у Вас ошибку срабатывать не должен. Он относится к методам работы с коллекциями.
И встречается в 2х местах:
Функция ПолучитьДанныеИзМенеджераПотоков 
...
ИначеЕсли РезультатОбработки = "ДополненныйФрагментКоллекции" Тогда
...

и
Функция ОбработатьКоллекцию

которая в свою очередь вызывается из метода "ОбработатьКоллекциюОбъектов" и "ДополнитьКоллекциюОбъектов"


Версия менеджера у Вас 2.0.5? (не могу определить дату скачивания - не вижу Вас среди скачавших)

Можете мне прислать замер производительности по работе ФЗ "менеджера потоков"? (например через вотсап - номер в профиле)
и Код используемой обработки или саму обработку.
43. velsevur 01.02.19 14:07 Сейчас в теме
(42) Не вижу номера в профиле, возможно нужно быть в друзьях. Версия 2.0.5. Скачивался МП с другого аккаунта "Cruciann".

		Сообщить("Обработка в потоках.");
		ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
		
		СтруктураПараметров = векМенеджерПотоков.ПолучитьСтруктуруПараметровИнициализацииМенеджераПотоков("ОбработатьКоллекциюДокументовОчередипереобеспечения","");
		векМодульМенеджераПотоков.ПолучитьПараметрыМП("ЗаказПоставщику",СтруктураПараметров);
		СтруктураПараметромМП = векМенеджерПотоков.ИнициализироватьМенеджерПотоков(СтруктураПараметров);
		
#Область Костыли
		КодСоздания   = "КоллекцияПриемник = Новый СписокЗначений;";
		КодДобавления = "ЗаполнитьЗначенияСвойств(КоллекцияПриемник.Добавить(), КоллекцияИсточник[ИндексКоллекции]);";

		Структура = Новый Структура;
		Структура.Вставить("КодСоздания"  , КодСоздания);
		Структура.Вставить("КодДобавления", КодДобавления);
		
		СтруктураПараметромМП.ПараметрыИнициализации.ПараметрыОбработкиКоллекции.Вставить("АлгоритмыРаботыСКоллекцией", Структура);
#КонецОбласти

		Для Каждого ДокументСсылка Из Коллекция Цикл 
			СтруктурапараметровОбъекта = Новый Структура;
			СтруктурапараметровОбъекта.Вставить("Период",ДокументСсылка.Период);
			
			векМенеджерПотоков.ОбработатьОбъект(СтруктураПараметромМП,ДокументСсылка.Документ,СтруктурапараметровОбъекта);
		КонецЦикла;
		векМенеджерПотоков.ДождатьсяОстановкиМенеджераПотоков(СтруктураПараметромМП);
		
		ВремяКонцаВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();
		ВремяВыполненияВМиллисекундах = ВремяКонцаВыполнения - ВремяНачала;
		Сообщить("Окончание потоковой обработки: "+ВремяВыполненияВМиллисекундах / 1000);
Показать



Процедура ПолучитьПараметрыМП(ОбъектОбработки,СтруктураПараметров) Экспорт 
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	векНастройкиМногопоточности.МодульОбработкиСобытийРазработчика КАК МодульОбработкиСобытийРазработчика,
	|	векНастройкиМногопоточности.МинимальноеКоличествоКоллекции КАК МинимальноеКоличествоКоллекции,
	|	векНастройкиМногопоточности.КоличествоПотоков КАК КоличествоПотоков,
	|	векНастройкиМногопоточности.КоличествоЭлементовКолекцииНаПоток КАК КоличествоЭлементовКолекцииНаПоток,
	|	векНастройкиМногопоточности.КоэффициентКратностиОчередиПотоковКПотокам КАК КоэффициентКратностиОчередиПотоковКПотокам,
	|	векНастройкиМногопоточности.ПределКоличествоПопытокОбработатьОбъект КАК ПределКоличествоПопытокОбработатьОбъект
	|ИЗ
	|	РегистрСведений.векНастройкиМногопоточности КАК векНастройкиМногопоточности
	|ГДЕ
	|	векНастройкиМногопоточности.Активно
	|	И векНастройкиМногопоточности.ОбъектОбработки = &ОбъектОбработки";
	
	Запрос.УстановитьПараметр("ОбъектОбработки", ОбъектОбработки);
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	СтруктураПараметров.ПараметрыОбщие.Вставить("Активно",Ложь);
	
	Если Выборка.Следующий() Тогда
		
		Если ЗначениеЗаполнено(Выборка.МодульОбработкиСобытийРазработчика) Тогда 
			СтруктураПараметров.ПараметрыИнициализации.МодульОбработкиСобытийРазработчика = Выборка.МодульОбработкиСобытийРазработчика;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Выборка.КоличествоПотоков) Тогда 
			Если ТипЗнч(Выборка.КоличествоПотоков) = Тип("Число") Тогда 
				СтруктураПараметров.ПараметрыИнициализации.КоличествоПотоков = Выборка.КоличествоПотоков;
			КонецЕсли;
			
			Если ТипЗнч(Выборка.КоличествоПотоков) = Тип("Булево") Тогда 
				СтруктураПараметров.ПараметрыИнициализации.ПараметрыОбработкиКоллекции.ДинамическийРассчетКоличестваПотоков = Выборка.КоличествоПотоков;
			КонецЕсли;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Выборка.КоличествоЭлементовКолекцииНаПоток) Тогда 
			СтруктураПараметров.ПараметрыИнициализации.ПараметрыОбработкиКоллекции.КоличествоЭлементовКолекцииНаПоток = Выборка.КоличествоЭлементовКолекцииНаПоток;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Выборка.КоэффициентКратностиОчередиПотоковКПотокам) Тогда 
			СтруктураПараметров.ПараметрыИнициализации.КоэффициентКратностиОчередиПотоковКПотокам = Выборка.КоэффициентКратностиОчередиПотоковКПотокам;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Выборка.ПределКоличествоПопытокОбработатьОбъект) Тогда 
			СтруктураПараметров.ПараметрыИнициализации.ПределКоличествоПопытокОбработатьОбъект = Выборка.ПределКоличествоПопытокОбработатьОбъект;
		КонецЕсли;
		
		СтруктураПараметров.ПараметрыОбщие.Активно = Истина;
		СтруктураПараметров.ПараметрыОбщие.Вставить("МинимальноеКоличествоКоллекции",Макс(Выборка.МинимальноеКоличествоКоллекции,1));
		
	КонецЕсли;
	
КонецПроцедуры
Показать


Если ИмяСобытия = "ПриПолученииРесурсов" Тогда				//Поток
			
			ОтветСобытия = ПриПолученииРесурсов(пПараметрыСобытия);
			//Сообщение = Новый СообщениеПользователю;
			//Сообщение.Текст = "Ресурс получен";
			//Сообщение.Сообщить();
		
		ИначеЕсли ИмяСобытия = "ПриОбработкеДействияПотока" Тогда		//Поток
			СтруктураДанных = пПараметрыСобытия.СтруктураДанных;
			ПараметрыДляОбъекта = СтруктураДанных.ПараметрыДляОбъекта;
			
			РегистрыСведений.векОчередьДляПереобеспечения.ОбработатьДокумент(ПараметрыДляОбъекта.Период, СтруктураДанных.ОбрабатываемыйОбъект);
Показать


Функция ПриПолученииРесурсов(пПараметрыСобытия)
	
	СтруктураДанных = пПараметрыСобытия.СтруктураДанных;
	ОбрабатываемыйОбъект = СтруктураДанных.ОбрабатываемыйОбъект;
	
	ТабличнаяЧастьДокумента = ПолучитьТабличнуюЧастьДокумента(ОбрабатываемыйОбъект);
	
	МассивРесурсов = Новый Массив;
	МассивРесурса  = Новый Массив;
	МассивРесурса.Добавить(векПолучитьЗначениеРеквизита(ОбрабатываемыйОбъект,"Склад"));
	
	Для каждого СтрокаТЧД из ТабличнаяЧастьДокумента Цикл
		МассивРесурса.Добавить(СтрокаТЧД.Номенклатура);
	КонецЦикла;
	
	МассивРесурсов.Добавить(МассивРесурса);
	
	Возврат МассивРесурсов;
	
КонецФункции
Показать
Прикрепленные файлы:
44. velsevur 01.02.19 16:15 Сейчас в теме
(43)
Благодаря помощи автора темы проблема была решена путем правки модуля МП,

Строки с 1514-1516 необходимо обернуть в условие

Если РезультатОбработки = "ДополненныйФрагментКоллекции" Тогда


Спасибо DarkAn
45. user776057 16.03.19 13:39 Сейчас в теме
Добрый день, получаю бесконечный цикл, соответственно не может завершиться менеджер потоков, что я могу упускать?
Функция ДождатьсяОстановкиМенеджераПотоков(пСтруктураПараметров) Экспорт
...
Пока ПолучитьЗначениеХранилищаОбщихНастроек(РазрезМенеджеров, "ИдФЗМенеджераПотоков") <> Неопределено Цикл
		Слипп(0.1);
КонецЦикла;
...
46. Техподдержка 28.03.19 09:28
(45)
соответственно не может завершиться менеджер потоков, что я могу упускать

Добрый день! Прошу прощения за задержку - был в отпуске.
Предоставленных данных не достаточно для однозначного ответа.

Дабы не загромождать форум - жду Вашего ответа в "личке"
47. izidakg 149 17.05.19 16:14 Сейчас в теме
что в архиве за 10 см, кроме файлов выложенных отдельно?
48. Техподдержка 20.05.19 09:46
(47) Конфигурация с общим модулем, где собственно и содержаться все методы для работы с менеджером потоков.
49. izidakg 149 20.05.19 11:20 Сейчас в теме
(48) развитие предполагается или только работа по оптимизации?
50. Техподдержка 20.05.19 12:15
(49) Идеи для развития еще есть.
Пока больше проблем со временем их реализации.

Но текущего функционала уже достаточно для многих задач
51. Ulus 270 26.06.19 04:24 Сейчас в теме
(50) выложите за стартмани пример, где вы в УПП партионку восстанавливаете через многопоточность.
Определенному кругу лиц полезно будет.
52. Техподдержка 26.06.19 10:08
(51) Выложить данный функционал хочу уже давно, вот только времени все "в кучу" собрать пока не получается :(
Очень надеюсь, что до ИС все же получиться провернуть данный вариант.
53. bashorgin 27.09.19 04:17 Сейчас в теме
Вы в версии 2.0.7 разделили модуль на 4 шт, а обработку с примерами забыли обновить. В ней теперь передача мутабельного на сервер происходит. Например, тут:
НоваяКоллекция = мпМенеджерПотоков.ДополнитьКоллекциюОбъектов(СтруктураПараметров, Коллекция);
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Нижний Новгород
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Технический лидер, архитектор 1С, руководитель проектов
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день

Специалист внедрения и сопровождения 1С
Омск
зарплата от 25 000 руб. до 50 000 руб.
Полный день