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

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

Арт.: 778905

Продано: 50

00 Лого.PNG
01_1 Архитектура-проблемы.png
01_2 Архитектура-решения.png
06_8 Ресурсы.png
7 поставки.PNG
01 Методы и события.png
02_1 ОбработатьОбъект.png
02_2 ОбработатьОбъект Ошибка при обработке.png
02_3 ОбработатьОбъект Передача частных параметров.png
02_4 ОбработатьОбъект Файлы графа Gephi.png
02_5 ОбработатьОбъект Файлы графа произвольная программа.png
02_6 Обработка коллекции Простая.png
02_7 Обработка коллекции Автосборка.png
02_8 Обработка коллекции Автосборка и передача общих параметров.png
02_9 Обработка коллекции Произвольная сборка.png
02_10 Обработка коллекции Произвольная сборка с выводом.png
00 Лого.PNG
01_1 Архитектура-проблемы.png
01_2 Архитектура-решения.png
06_8 Ресурсы.png
7 поставки.PNG
01 Методы и события.png
02_1 ОбработатьОбъект.png
02_2 ОбработатьОбъект Ошибка при обработке.png
02_3 ОбработатьОбъект Передача частных параметров.png
02_4 ОбработатьОбъект Файлы графа Gephi.png
02_5 ОбработатьОбъект Файлы графа произвольная программа.png
02_6 Обработка коллекции Простая.png
02_7 Обработка коллекции Автосборка.png
02_8 Обработка коллекции Автосборка и передача общих параметров.png
02_9 Обработка коллекции Произвольная сборка.png
02_10 Обработка коллекции Произвольная сборка с выводом.png
Лицензии

5000 руб.

Услуга

3300 руб.

Техподдержка и обновления

3000 руб.

2300 руб.

4300 руб.

8200 руб.

 
 Обновления
 
 Обновление "Менеджер потоков" 2.1.0

Изменения в сравнении с версией 2.0.7:
    Алгоритмы:

  • Увеличена скорость обработки зависимых объектов на 15-25%, в ряде случаев до 50%;
  • Полностью переписан весь код;
  • Код проверен с помощью АПК 1.2  (исправлено 350+ замечаний и не соответсвий стандартам 1С, осталось 9 :));
  • Работа с графом "неограниченного" размера;
  • Приоритезирована раздачи заданий потокам;
  • Реализована возможность в событиях (не во всех) дополнять "Параметры для объекта" - см. Руководство.
  • Теперь поток, а не менеджер контролирует количество попыток обработать объект;
  • События потоков теперь выполняются в "Попытка-Исключение" - позволяет избежать лишних перезапусков потоков;
  • Модуль "мпОсновнаяПрограмма" - изменил идентификатор на: "мпОсновнаяПрограммаВызовСервера";
  • Процедуры и функции уменьшены в размерах, для сокращения контекста (средний размер 17 строк; минимум 3 строки, максимум 73 строки);
  • Все алгоритмы разнесен по областям;
  • Шаблон модуля событий разработчика теперь выделен в отдельный модуль: "мпСобытияРазработчикаШаблон";

        Исключено:

  • механизм мониторинга (появится в след. релизах);
  • механизм "безпотокового" выполнения.
  • возможность написать весь код в модуле объекта обработки (противоречит работе в безопасном режиме).

    Транспорт:

  • Обмен данными теперь происходит пакетами;

    События:

  • Изменены:

            Изменен состав параметров всех событий (требуется корректировка событий разработчика). - см. Руководство.
            Имена:

  • ПриПолученииРесурсов             ->    ПриРасчетеРесурсов
  • ПриОбработкеДействияПотока   ->    ПриОбработкеПотоком
  • ПриОбработкеОтвета                 ->    ПриОбработкеРезультата
  • ПриОбработкеМассиваОбработанныхФагментовКоллекции     ->    ПриСборкеФрагментовКоллекции        
  • Добавлены:
    • ПриПроизвольнойОбработкеГрафа - см. Руководство.
    • ПриСохраненииГрафа - см. Руководство.
  • Исключены:
    •  ПриДобавленииВОчередьОбработки - теперь "Менеджер потоков" сам добавляет объект, если есть ресурсы, так же есть параметр "УчитыватьОбъектыБезРесурсов" - см. Руководство;
    •  ПриОбработкеДополненногоФагментаКоллекции - теперь и обработку, и дополнение можно осуществить через метод "Обработать коллекцию";
    •  ПриПолученииМестаХраненияФайловМониторинга - т.к. исключены механизмы мониторинга, данное событие утратило свою силу;

    Параметры "Менеджера потоков":

  • Изменены:
    • Структура хранения параметров (полная структура параметров предоставлена в общем макете "мпПолнаяСтруктураПараметров")
    • Имена:
      • КоличествоЭлементовКолекцииНаПоток ->    КоличествоЭлементовКолекцииНаОбъект
      • РазрезМенеджера                                  ->    ИдентификаторМенеджера
  • Добавлены:
    • Общие.КоличествоОбъектовВПакете;
    • Разработчик.Общие;
    • Разработчик.ПоСобытиям;
    • ОбработатьКоллекцию.СобратьКоллекциюИзФрагментов;
    • ОбработатьКоллекцию.КоличествоЭлементовКоллекцииНаОбъект;
    • ПолучитьГраф_Gephi.Каталог;
    • Граф.ОграничениеРазмера;
    • Граф.УчитыватьОбъектыБезРесурсов;
  • Исключены:
    • ДинамическийРассчетКоличестваПотоков              ->    Данный параметр больше не нужен, см. Руководство (параметр "КоличествоЭлементовКолекцииНаОбъект")
    • КоэффициентКратностиОчередиПотоковКПотокам -> теперь "Менеджер потоков" работает с полным графом;
    • ВестиМониторингМенеджераПотоков, т.к. механизм мониторинга исключен;
    • ВестиМониторингПорядкаОбработкиОбъектов, т.к. механизм мониторинга исключен;
    • ВестиМониторингОчередиНаОбработку, т.к. механизм мониторинга исключен;

    Прочие изменения:

  • добавлены методы и свойства формирования файлов для программ анализа графов;
  • обработки демонстрирующие возможности "Менеджера потоков" реализованы более наглядно и обособленно друг от друга;
  • Восстановление партий УПП (//infostart.ru/public/1119110/) так же поддерживает версию 2.1.0
 
 BagFix
  •  01.06.2020
    • Исправлена проблема с автосборкой "ТаблицЗначений"
 
 Обновление "Менеджер потоков" 2.0.7
 
 Обновление 12.03.2019
 
 Обновление "Менеджер потоков" 2.0.6
 
 Обновление "Менеджер потоков" 2.0.5
 
 Добавлена презентация с ISE 2018
 
 Другие статьи и разработки на данную тему:

Все, что было в первой версии, переработано, улучшено и дополнено. В связи с чем она (первая версия) переходит в разряд статьи с основными объяснениями и картинками.

Сразу договоримся, если в тексте будет указано «v1» - это отсылка к реализации в первой версии, если «v2.х» - к текущей.

 

Очень кратко, о чем речь…

Фреймворк в виде одного общего модуля, позволяющего при получении объектов на обработку запускать их в несколько потоков. Особенности:

  • Нет необходимости рассчитывать «порции» для обработки;
  • Нет необходимости организовывать файловый обмен между потоками;
  • Возможность запускать несколько менеджеров потоков одновременно, при этом потоки одного менеджера, могут запускать новые менеджеры со своими задачами и потоками;
  • Можно выстраивать граф зависимости объектов, что позволяет, например, избегать взаимоблокировок и/или организовать восстановление партий (на нашем предприятии удалось добиться 10х+ ускорения при 10 потоках в рабочее время – 200+ активных пользователей - Результаты работы механизма);
  • Все необходимые "вмешательство" в алгоритмы происходят с помощью событий;
  • Возможность описывать алгоритмы событий, как в модуле менеджера, так и в любом другом модуле БД (предпочтительно), а также во внешней обработке.
  • Автоматический рестарт потока в случае ошибок;
  • Контроль за количеством рестартов по каждому объекту;
  • Возможность получать «ответы» от потоков;
  • Возможность контролировать работу с помощью «Инструментов разработчика» или иных отчетов;
  • Возможность срочного прерывания работы;
  • И многое другое…

так было в «v1»

 
 Основные изменения v2.0 (расширение функционала v1):
 
 Основные изменения v2.1 (расширение функционала прошлых версий):
  • Увеличена скорость обработки зависимых объектов на 15-25%, в ряде случаев до 50% по сравнению с версией "v2.0";
  • Полностью переписан весь код;
  • Код проверен с помощью АПК 1.2  (исправлено 350+ замечаний и не соответствий стандартам 1С, осталось 9 :));
  • Работа с графом "неограниченного" размера;
  • Объекты для обработки теперь передаются пакетами, а не по одному;
  • Приоритизирована раздача заданий потокам;
  • Реализована возможность в событиях (не во всех) дополнять "Параметры для объекта" для передачи в другие события - см. Руководство.
  • Теперь поток, а не менеджер контролирует количество попыток обработать объект;
  • События потоков теперь выполняются в "Попытка-Исключение" - позволяет избежать лишних перезапусков потоков;
  • Добавлены методы для формирования файлов с данными для построения и анализа графов;
    • ПолучитьГраф_Gephi();
    • ПроизвольнаяОбработкаГрафа().

ВАЖНО!!!
Изменен состав и имена событий, а так же переименованы некоторые экспортные методы, в связи с чем, Ваши «события  разработчика» реализованные на прошлых версиях «менеджера потоков» потребуют изменений, но незначительные. 
Для примера, корректировка событий разработчика для «Восстановления партий» заняла примерно 10-15 мин с учетом анализа (80%) и написанием кода(20%).

Разработка проводилось на 1С:Предприятие 8.3 (8.3.9.1850) 32x; Режим совместимости 8.2.15

Теперь обо всем по порядку в деталях и с картинками...

 
 
 Архитектура
 
 Способы обработки
 
 События разработчика
 
 Примеры
 
 Особенности при работе в транзакции (Обработка проведения)

Техническая поддержка и обновления

Бесплатный период техподдержки составляет  1месяц со дня покупки

Также после приобретения вы получаете 12 месяцев бесплатных обновлений.

По окончании бесплатного периода вы можете приобрести услугу технической поддержки с доступом к обновлениям на платной основе.

Проверить наличие обновлений можно в личном кабинете. Если обновления недоступны - загрузить новую версию можно после покупки обновлений/технической поддержки.

Задать вопрос по программе можно по кнопке "Техподдержка" на странице описания.

При создании тикета необходимо предоставить:

  1. Номер заказа
  2. Описание вопроса. Если это ошибки - напишите порядок ваших действий с программой, которые к ней привели (приложите видео/скриншоты/отчеты об ошибке)
  3. Точную конфигурацию 1С, и версию платформы, на которой используете купленное решение (наименование и версию 1С можно взять из раздела "О программе"), версию купленной программы.

К созданной заявке подключается специалист. Дальнейшее обсуждение проблемы будет проходить в тикете техподдержки. Стандартный срок реакции - 24 часа в рабочие дни с момента обращения.

 

Техподдержка
 

Статистика:
Просмотры 100324
Загрузки 240
Рейтинг 299
Создание 07.02.18 16:13
Обновление 06.07.21 12:11
№ Публикации 778905
Характеристики:
Теги

"Фоновые задания" потоки "менеджер потоков" фоновых заданий" распараллелить  "восстановление партий"  многопоточность 

Рубрики Инструментарий разработчика
Кому Программист
Тип файла Конфигурация (md, cf)
Платформа Платформа 1С v8.3
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Платные (руб)
Код открыт Да
Наименование Файл Версия Размер
Руководство .pdf 2.1.0 1,13Mb 153 Скачать
Многопоточность. Универсальный «Менеджер потоков» 2.1 (Демо): (Только демонстрационные обработки и модули событий разработчика к ним) .zip 2.1.0 1,95Mb 155 Скачать
1. tormozit 08.02.18 09:30 Сейчас в теме
Опечатка "ОбработатьКоллекуию"
DrAku1a; Xershi; +2 Ответить
18. Evil Beaver 08.02.18 18:09 Сейчас в теме
(6) Не везде. В примерах кода часто встречается.
19. Техподдержка 08.02.18 19:58
(18)видимо в спойлерах не ищет(( доберусь до компа перепроверю через "источник". В обработке поправлено, видимо пока готовил статью в Ворде не заметил). Спасибо.
2. Xershi 08.02.18 09:50 Сейчас в теме
Нужны реальные примеры для чего это нужно. Первую версию не читал.
7. Техподдержка 08.02.18 13:05
(2) Реальные примеры - чтоб у всех работало, придумать толком не смог :)
Идею можно посмотреть Тут
10. Техподдержка 08.02.18 13:12
(2)
чего это нужно
С помощью "ОбработатьОбъект" распараллелил партии в УПП Вот результаты
3. infosoft-v 08.02.18 10:04 Сейчас в теме
Здравствуйте. Мощная работа.
Проект есть на GitHub? Можно ссылку?
8. Техподдержка 08.02.18 13:07
(3) Нет нету :( Еще с ним не разобрался :(
4. dandykry 08.02.18 10:32 Сейчас в теме
Однозначный плюс за разработку.
5. tsukanov 08.02.18 10:54 Сейчас в теме
Эх. Вот сделали бы в платформе возможность ожидать завершения хотя бы одного задания из массива,
и все эти извраты были бы не нужны.
9. Техподдержка 08.02.18 13:10
(5) Ну так запускайте не в массиве, а по одному :) Массив то зачем?
11. tsukanov 08.02.18 13:24 Сейчас в теме
(9) А как ожидать завершения? По таймеру проверять?

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

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

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

Ждем изменения статуса хотя бы одного и подменяем сразу на новое задание.
20. izidakg 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 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 06.04.18 09:24 Сейчас в теме
У меня когда то была идея для РАУЗ... передать матрицу через внешнюю компоненту и быстренько посчитать все через CUDA... тока вот руки так и не дошли
27. kote 06.07.18 23:21 Сейчас в теме
(26)

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

Кто об этом еще задумывался?
31. olegtymko 25.10.18 07:25 Сейчас в теме
Доклад на IE огонь!) Спасибо, потестирую у себя систему!
awk; drmaxart; +2 Ответить
55. Cyberhawk 18.07.20 15:28 Сейчас в теме
(31) Чем-нибудь тестирование закончилось? Прижилось или нет?
33. dimbasbear 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. У нас помимо "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров(..." в событии "ПриОбработкеДействияПотока" вызывается еще и "УправлениеПроизводствомДвиженияПоРегистрам.ПровестиДокументПоПроизводственнымРегистрам(..."

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


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


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

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

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

Возврат МассивРесурсов;
Показать
37. dimbasbear 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
60. MURzzz 04.12.20 11:49 Сейчас в теме
(40) Подскажите, пожалуйста, я правильно понимаю, что ОбработатьОбъект() только для ссылочных объектов? То есть если например необходимо в многопотоке обрабатывать очередь из регистра сведений, то придется использовать либо метод "ДополнитьКоллекцию", либо "ОбработатьКоллекцию"? Хотелось задействовать расчет ресурсов для построения графов, чтобы при работе фоновых заданий добавлять в коллекцию новые события, появляющиеся в очереди (новые записи регистра сведений). Почитал, посмотрел, но вот с этими вопросами не доразобрался.
62. Техподдержка 04.12.20 14:09
(60)
Хотелось задействовать расчет ресурсов для построения графов, чтобы при работе фоновых заданий добавлять в коллекцию новые события, появляющиеся в очереди (новые записи регистра сведений)

Добрый день!
Если не сложно можете расписать задачу, чуть подробнее (желательно в личку, чтоб тут не засорять), возможно удастся предложить решение
87. alkar 12.11.22 11:23 Сейчас в теме
(62) Добрый день! Возможно получить вариант решения аналогичной по сути проблемы? Пытаюсь передать в ОбработатьОбъект() не записанный ДокументОбъект, хочется также задействовать расчет ресурсов.
88. Техподдержка 14.11.22 12:48
(87) [IS-QUOTE] Добрый день! Просьба описать ваш случай более детально. Возможно у Вас есть особенности. Кроме того прошлое решение было почти 2 года назад - результатов сходу уже не вспомнить.
89. alkar 14.11.22 13:02 Сейчас в теме
(88) Из таблицы значений построчно создаем документ Корректировка долга, заполняем его данными и проводим, вот собственно и всё. В день +- 5000 документов. Сейчас на проведение каждого уходит 4-5 сек. Возможны взаимоблокировки, т.к. Контрагент и Договор могут повторяться. Конфигурация Бухгалтерия предприятия, редакция 3.0 (3.0.120.14) 1С:Предприятие 8.3 (8.3.20.1710) -MS SQL
90. Техподдержка 14.11.22 14:59
(89) Ну тогда все так же достаточно просто.

1. В ОбработатьОбъект() можно передавать как "объект" все что угодно, главное чтоб объект передавался 1 раз. В исключительной ситуации можно передать УникальныйИдентивикатор, а все параметры для создания объекта передать 3им параметром (ПараметрыДляОбъекта) в виде структуры.

2. В событии "ПриРасчетеРесурсов" для каждого объекта собираете ресурсы, мне кажется достаточно только договоров (контрагент не обязательно), но при этом надо понимать, что, возможно, договоров в одном документе может быть несколько, а значит в массиве ресурсов будет несколько ресурсов к одному объекту.

3. В событии "ПриОбработкеПотоком" Создаем/проводим документы.

4. При необходимости в событии "ПриОбработкеОшибки" описываем алгоритм при не возможности создать документ, например вывод сообщения со ссылкой на документ и остановка МП от дальнейшей работы

5. При необходимости в событии "ПриОбработкеПропуска" Выводим информацию если по объекту не удалось рассчитать ресурсы.

6. При необходимости в событии "ПриОбработкеРезультата" обрабатываем успешную обработку объекта.
92. alkar 14.11.22 16:11 Сейчас в теме
(90) Спасибо, большое, буду пробовать!!
93. Техподдержка 14.11.22 17:16
(92) Буду признателен за обратную связь
91. Техподдержка 14.11.22 15:01
(89) Обратите внимание на пункт из основной статьи "Особенности при работе в транзакции"
45. rbdaurov 16.03.19 13:39 Сейчас в теме
Добрый день, получаю бесконечный цикл, соответственно не может завершиться менеджер потоков, что я могу упускать?
Функция ДождатьсяОстановкиМенеджераПотоков(пСтруктураПараметров) Экспорт
...
Пока ПолучитьЗначениеХранилищаОбщихНастроек(РазрезМенеджеров, "ИдФЗМенеджераПотоков") <> Неопределено Цикл
		Слипп(0.1);
КонецЦикла;
...
46. Техподдержка 28.03.19 09:28
(45)
соответственно не может завершиться менеджер потоков, что я могу упускать

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

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

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