0. DarkAn 813 02.02.18 09:20 Сейчас в теме

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

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

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

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

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

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

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

Ждем изменения статуса хотя бы одного и подменяем сразу на новое задание.
20. izidakg 150 08.02.18 22:54 Сейчас в теме
развитие будет или все задуманное реализовано?
22. DarkAn 813 09.02.18 09:06 Сейчас в теме
(20) Есть еще несколько идей (осталось только время найти для их воплощения). Они пока не реализованы, т.к. реализуй я их, то текущую версию выложил бы еще не скоро. Так основные задумки все работают - можно смело пользоваться.
21. artemka 09.02.18 07:59 Сейчас в теме
А каким образом происходит восстановление партий в несколько потоков? Например, для того, чтобы восстановить партию, мне нужно знать остатки по номенклатуре на дату, а пока предыдущий поток не завершится этих данных не будет.
23. DarkAn 813 09.02.18 09:09 Сейчас в теме
(21) Артем, для ответа на Ваш вопрос, я рекомендую Вам ознакомится первым постом и с текущим. В первом посте вообще все рассказывалось отталкиваясь именно от этой задачи.
Для простоты понимания посмотрите примеры из первого поста
24. gubanoff 47 09.02.18 10:42 Сейчас в теме
(0) на какой версии платформы можно использовать?
25. DarkAn 813 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 501 06.07.18 23:21 Сейчас в теме
(26)

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

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

Скажите:

1. Применимо для восстановление партий + оценка стоимости по средней ?
2. Можно краткий пример как это все запустить для п1, в частности как и у вас для конфигурации УПП.
34. DarkAn 813 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. DarkAn 813 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. DarkAn 813 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. DarkAn 813 30.01.19 11:13 Сейчас в теме
Событие "ПриПолученииРесурсов" предназначено только для метода "ОбработатьОбъект" - когда по объектам необходимо строить граф.
Рекомендую посмотреть презентацию с IE2018 (ссылка есть в публикации) или тут.
Необходимый минимум для метода "ОбработатьКоллекциюОбъектов" показан тут.

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

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

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


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

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

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


А как нужно было сделать правильно?
42. DarkAn 813 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. DarkAn 813 28.03.19 09:28 Сейчас в теме
(45)
соответственно не может завершиться менеджер потоков, что я могу упускать

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

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

Но текущего функционала уже достаточно для многих задач
51. Ulus 267 26.06.19 04:24 Сейчас в теме
(50) выложите за стартмани пример, где вы в УПП партионку восстанавливаете через многопоточность.
Определенному кругу лиц полезно будет.
52. DarkAn 813 26.06.19 10:08 Сейчас в теме
(51) Выложить данный функционал хочу уже давно, вот только времени все "в кучу" собрать пока не получается :(
Очень надеюсь, что до ИС все же получиться провернуть данный вариант.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Руководитель проекта, аналитик, консультант
Санкт-Петербург
По совместительству

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Москва
Полный день

Консультант-аналитик 1С
Москва
Полный день