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

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

Арт.: 778905

Продано: 54

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 часа в рабочие дни с момента обращения.

 

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

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

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

Рубрики Инструментарий разработчика
Кому Программист
Тип файла Конфигурация (md, cf)
Платформа Платформа 1С v8.3
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Платные (руб)
Код открыт Да
Наименование Файл Версия Размер
Руководство .pdf 2.1.0 1,13Mb 173 Скачать
Многопоточность. Универсальный «Менеджер потоков» 2.1 (Демо): (Только демонстрационные обработки и модули событий разработчика к ним) .zip 2.1.0 1,95Mb 173 Скачать
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 шт, а обработку с примерами забыли обновить. В ней теперь передача мутабельного на сервер происходит. Например, тут:
НоваяКоллекция = мпМенеджерПотоков.ДополнитьКоллекциюОбъектов(СтруктураПараметров, Коллекция);
56. oldy 09.09.20 15:00 Сейчас в теме
Подскажите, как средствами МП организовать индикацию хода выполнения? Вот прямо на форму, из которой выполнен запуск МП в несколько потоков, выводить либо общий по всем потокам процент выполнения, либо обновлять индикатор. Потупил какое-то время в документацию, но не увидел подходящего. Подробно не прошу объяснять, просто идею. Спасибо!
57. Техподдержка 09.09.20 15:53
(56) Добрый день.
На текущий момент данного функционала не предусмотрено. Есть идеи по реализации, но пока руки не доходят :(
Так же один из клиентов МП - данный функционал реализовал (https://infostart.ru/profile/890948/). Думаю он не откажет в помощи.
58. MURzzz 03.12.20 19:11 Сейчас в теме
В руководстве написано, что взаимодействие с платформой 1С:Предприятие для Windows. При использовании Linux, какие необходимо внести изменения в Менеджер потоков?
59. Техподдержка 04.12.20 09:06
(58) Добрый день!
Все ограничение завязано на имитацию метода "sleep" - реализовано через "WScript.Shell"

мпОбщееСервер.Ожидание()
61. MURzzz 04.12.20 11:51 Сейчас в теме
(59) понял, спасибо, попробую заменить на что-то подобное: http://forum.infostart.ru/forum9/topic182004/message2115568/#message2115568
63. Kembreg 14.05.21 15:49 Сейчас в теме
Добрый день.

Версия 2.1.0.1 (скачивали с другого аккаунта, ppeskov)

Есть ли какие то ограничения по месту вызова мпОсновнаяПрограммаВызовСервера.ИнициализироватьМенеджерПотоков(ПараметрыМП); ?

При размещении данного кода в модуле объекта в предопределенной процедуре ОбработкаПроведения инициализации не происходит, падает с ошибкой

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.мпОбщееСервер.Модуль(133)}: "Менеджер потоков" - прервал выполнение
ВызватьИсключение ТекстСообщения;

ясности не прибавляет. Перенесли пока функционал в команду формы, работает без нареканий.

"Исторически так сложилось" что на основании табличной части документа в процессе проведения происходят "волшебные вещи", распараллеливание вашей конфигурацией творит в этом плане чудеса, хотелось бы все-таки попробовать перенести распараллеливание в проведение, не сильно при этом меняя текущую логику
64. Техподдержка 14.05.21 16:21
(63) Добрый день!
Правильно ли я понял, что вы хотите распараллелить проведение документа?
Боюсь не получиться, по крайне мере я не смог найти решение. Первое с чем Вы можете столкнуться при такой реализации – это взаимоблокировки, т.к. фоновые задания (потоки) генерируют другие транзакции.
На прошлой конференции ИС-2019, я общался с Дмитрием Дудиным (https://infostart.ru/profile/198214/) (он обмолвился, что знает, как распараллелить проведение). В кулуарах он мне пытался объяснить, но я его объяснение не осилил ☹, может вам повезет больше 😊.

По поводу ограничений… Ограничений быть не должно ни каких сверх того, что накладывает сама платформа 1С.
По поводу сообщения об ошибке. Что написано в журнале регистрации?
По поводу «волшебные вещи» и «чудеса» - о чем речь?
65. Kembreg 14.05.21 16:46 Сейчас в теме
(64)
В Журнале регистрации:

Фоновое задание. Запуск
Фоновое задание. Ошибка выполнения
{ОбщийМодуль.мпОбщееСервер.Модуль(133)}: Общий модуль "" не найден.
Сеанс. Завершение
Ошибка выполнения
{ОбщийМодуль.мпОбщееСервер.Модуль(133)}: "Менеджер потоков" - прервал выполнение

Нет, мы не планируем распараллеливать проведение документа. Данный документ у нас по сути выполняет функции Бизнес процесса, выполняет определенные действия над объектами, ссылки которых содержатся в табличной части в определенной последовательности, а флаг "проведён" устанавливается после успешного выполнения всех действий. И хотя данный функционал находится в обработке проведения, движений он не формирует, лишь свидетельствует об успешности. Для того чтобы избежать взаимоблокировок в процессе обработки объектов и используем вашу обработку, с табличной частью 3000 строк и более она дает отличные результаты ускорение в 3-4 раза, но пока не получается "последняя миля", место вызова
Прикрепленные файлы:
66. Техподдержка 17.05.21 09:47
(65) Да, вроде у меня ситуация тоже повторяется, при проведении. Как разберусь - сообщу...
67. Техподдержка 17.05.21 11:49
(65) В общем разобрался с причиной.

Причина в следующем: В момент проведения активна транзакция (самого документа), в механизме обмена данными между «Основной программой» / «Менеджером потоков» и «Потоками» участвует «ХранилищеОбщихНастроек», для согласованности обмена между ФЗ, чтение из хранилища идет в транзакции. Тут и происходит проблема, при проведении происходит инициализация параметров и их передача в ФЗ менеджера потоков, но он их прочитать из хранилища не может, т.к. на стороне «Основной программы» - обработки проведения транзакция не завершена.

Решение (кратко - см. скрины): инициализацию и запуск менеджера потоков необходимо выполнить в отдельном ФЗ.

Надеюсь такое решение не вписывается в "не сильно при этом меняя текущую логику"
Прикрепленные файлы:
68. Kembreg 17.05.21 12:53 Сейчас в теме
(67) Отличный вариант, благодарю
69. Техподдержка 17.05.21 14:12
(68) Данную особенность отразил в статье
70. Kembreg 20.05.21 14:58 Сейчас в теме
(67) Пробую реализовать данный вариант - столкнулся с тем, что при данном варианте теряется часть "Обратной связи". Например перестают отрабатывать Сообщения пользователю в фоновом задании. В соответствующем окошке тишина. При вызове Функции ПриОбработкеПотоком(пПараметрыСобытия) если перед возвратом указываем

 Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = СтрШаблон("Создан возврат %1",Документы.ВозвратТоваровОтКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(XmlСтрокаНаВозврат)));
			Сообщение.Сообщить();
			
			Возврат Документы.ВозвратТоваровОтКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(XmlСтрокаНаВозврат));


То строка появляется только при "обычном" вызове из формы, если мы выносим многопоточность в отдельное фоновое задание из транзакции проведения, то в окне сообщений тишина.

Я правильно понимаю, что пока единственный вариант контроля за результатом в режиме запуска в транзакции проведения, это всё-таки использование коллекций с автосборкой и возвратом результатов работы в удобной форме, и мириться со взаимоблокировками ресурсов, не используя обработку объекта и функцию ПриРасчетеРесурсов? Или всё таки есть способ увидеть результаты по всем ФЗ после обработки всех потоков обработки объектов?
71. Техподдержка 20.05.21 17:23
(70) Думаю что можно, но надо проверить. Необходимо реализовать по аналогии с текущим механизмом.
Ваши сообщения выводятся, но только в фоновом задании в котором происходит инициализация МП.

В приведенном выше примере показано помещение во временное хранилище "КоллекцияПриемник", туда можно поместить структура с 2 значениями, "КоллекцияПриемник" и "СообщениеПользователю"

СообщениеПользователю получить как описано в функции мпПотокиСервер.ПолучитьСообщениеДляПользователя()

И уже в своей программе после ожидания ФЗ получить структуру и вывести сообщение.

Надеюсь смог донести мысль. Если возникнут проблемы - постараюсь на днях накидать пример :)
73. RPGrigorev 23.11.21 15:45 Сейчас в теме
(71)Покупал сегодня утром обработку с профиля "Астрея", можно добавить проверку на ОС? И изменить алгоритм?
Прикрепленные файлы:
74. RPGrigorev 23.11.21 15:46 Сейчас в теме
Как можно обойти это сейчас?
76. Техподдержка 23.11.21 16:28
(74) Можете написать свой метод задержки или закомментировать все тело процедуры.
77. RPGrigorev 23.11.21 17:53 Сейчас в теме
78. RPGrigorev 23.11.21 18:10 Сейчас в теме
(76)Клиент-сервер
Прикрепленные файлы:
79. RPGrigorev 23.11.21 18:28 Сейчас в теме
80. Техподдержка 23.11.21 19:15
(79) Что за база в которой выходит сообщение? Это база из поставки 1Cv8.cf, или это Ваша база куда Вы загрузили "Поставку"?

Работоспособность демо примеров просьба проверять на пустой базе из поставки 1Cv8.cf. При загрузки поставки в свою базу, часть объектов по умолчанию не переносятся (именно демо модули)
Прикрепленные файлы:
81. RPGrigorev 23.11.21 21:15 Сейчас в теме
(80) УПП 1.3, перенес все объекты из 1Cv8.cf, что самое интересное, демо примеры (обработки) отрабатывают, с точно таким же кодом инициализации...не отрабатывает вызов в модуле "ЗаполнениеДокументов", буду копать
82. RPGrigorev 23.11.21 22:36 Сейчас в теме
Первый день, пока не особо разобрался, что делаю не так, вызывается метод "ИнициализироватьМенеджерПотоков" и фоновые задания "бесконечно" (около часа наблюдал) бегают по процедурам и модулям, т.е. до точки останова дело даже не доходит, не выходит из процедуры этого метода...
Прикрепленные файлы:
83. RPGrigorev 04.03.22 01:12 Сейчас в теме
(82)Внедрил успешно подсистему, проблемный, долгий расчет себестоимости в УПП ускорен ~10 раз, очень ценный продукт, большое спасибо за труд, автор очень отзывчивый, всегда был рад помочь, за что отдельное спасибо, однозначно забрал данный продукт в свой арсенал, пригодится на крупных проектах, уже есть варианты, где буду дальше применять
84. Техподдержка 05.03.22 10:29
(83) Большое спасибо за отзыв!
85. UPKA 10.10.22 16:26 Сейчас в теме
Подскажите пример, как можно перепровести документы в потоке, с помощью данного решения? Спасибо
94. alkar 14.11.22 17:16 Сейчас в теме
95. ndacoder 10.12.22 21:59 Сейчас в теме
можно получить предыдущую версию 2.0.7 с механизмом мониторинга, так разработка скоро как 2 года не обновляется
96. Техподдержка 12.12.22 10:06
(95) Добрый день!
Думаю не стоит заморачиваться с 2.0.7 - мониторинг там был до жути простой и не функциональный.
Сейчас идет разработка новой версии. Мониторинг там будет включен. В принципе он уже был реализован в версии 2.1.1, но увиденные проблемы с помощью мониторинга привели к разработке новой версии МП. Разработка идет как обычно, когда время находиться, но теперь более интенсивно чем ранее. Так же будет расширена функциональность, которой оказалось очень не хватало в МП в методе "ОбработатьОбъект".
В общем ждите новостей :)
98. ndacoder 02.08.23 08:29 Сейчас в теме
(96) Обновлений и новостей нет ?
99. Техподдержка 02.08.23 08:49
(98) Добрый день! Полной готовности пока нет. Основные механизмы реализованы, ведется рефакторинг кода, исправляются неточности и оптимизация скорости. Основная проблема с реализацией отсутствие свободного времени.
100. vs84 05.08.24 20:08 Сейчас в теме
(96) Здравствуйте. Есть осязаемые планы по выпуску этого релиза?

Оставьте свое сообщение

См. также

Infostart Toolkit — Инструменты разработчика 1С 8.3

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

OneDebugger - инструмент для отладки кода в 1С без использования конфигуратора

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычис...

9360 руб.

Infostart PrintWizard (конструктор печатных форм)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки...

22200 руб.

Infostart DataFormWizard: Управление данными и формами 1С 8.3

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на л...

15000 руб.

PowerTools: Инструменты администратора 1С 8.3

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

SALE! 20%

Конструктор АРМ

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

[ЕХТ] Фреймворк для Расширений 1С

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в ...

3000 руб.

SWEET - Swagger для 1С. Инструмент для генерации OpenApi спецификаций

Инструмент для генерации OpenApi (Swagger) спецификаций на основании файлов конфигураций 1С. Представляет собой консольное и десктопное приложение на языке Rust с полноценным редактором кода, содержащим автозамену и подсвечивание ошибок д...

18000 9000 руб.

SALE! 50%