Имя: Пароль:
1C
 
Контроль завершения ведущей задачи для нескольких вложенных бизнес-процессов
, ,
0 beholder13
 
21.11.16
11:20
Коллеги, здравствуйте.

Суть задачи:
Имеются два бизнес-процесса. Одна из точек маршрута первого процесса имеет вид ВложенныйБизнесПроцесс, при инициализации в ней задачи создаются несколько экземпляров второго процесса (сделано для независимой адресации и чтобы проще было РЛСы накладывать, а также для большей универсальности механизма). Необходимо отследить завершение всех вложенных процессов, и только после этого выполнить ведущую задачу. Проблема в том, что ведущая задача автоматически уходит на выполнение при завершении любого из вложенных процессов. Если проверяю в событиях перед/при выполнении ведущей задачи с установкой флага отказа, то откатывается вся транзакция, в том числе и выполнение задачи вложенного процесса и, как следствие, завершение вложенного процесса.

Вопросы:
1. Правильно ли создавать несколько вложенных процессов для одной задачи? В ДО для каждого экземпляра вложенного процесса создается отдельная задача, но я не знаю, насколько верен такой подход, ведь ФормируемыеБизнесПроцессы - Массив, и я полагал, что платформа должна отследить завершение всех вложенных процессов перед тем, как выполнить ведущую задачу.
2. Действительно ли задача уходит на выполнение при завершении любого процесса и не отслеживается завершение всех процессов? Не исключена возможность того, что у меня она где-то уходит на выполнение принудительно, но однозначного ответа в документации я не нашел.
3. Можно ли где-то впилиться в пределах одной транзакции между завершением вложенного процесса и выполнением ведущей задачи и принудительно, но красиво зафиксировать транзакцию раньше, чем она дойдет до события ПередВыполнением ведущей задачи?

Версия платформы 8.2.19.130.

Заранее спасибо за Ваше участие.
1 Fedor-1971
 
21.11.16
11:26
(0) точки разъединения и слияния посмотри, может будет достаточно.
Самый хитрый способ - вставляем элемент "Ожидание" и делаем петлю "Если все процессы завершены" да - продолжаем, нет - возвращаемся к элементу "Ожидание"
2 beholder13
 
21.11.16
11:30
(1) Интересненько, но как-то костыльно, ведь ведущая задача выполнится к моменту входа в этот новый элемент (если я правильно понял, что речь об еще одной точке маршрута с условием), а у меня помимо исполения задач есть еще и наблюдение, то есть, наблюдатели по ведущему процессу получают сводную информацию по вложенным процессам, если ведущая задача в этой точке не выполнена
3 beholder13
 
21.11.16
11:39
(1) Точки разделения подразумевают предопределенный набор точек маршрута, тогда как у меня речь о динамическом формировании однотипных параметризуемых сущностей с независимым параллельным выполнением (по сути, асинхрон, только в другой плоскости). Сколько будет вложенных процессов - неизвестно и неважно. Как они завершатся, также не важно, нужно только отследить, чтобы они завершились все, так как на следующей точке уже идет сводный анализ результата выполнения предыдущей задаче.
4 Лефмихалыч
 
21.11.16
11:42
надо на карту добавить разделение и слияние, тогда ни чего искать не надо - оно само контролирует.

ну, либо, перед выполнением искать и отказывать
5 Fedor-1971
 
21.11.16
11:43
(2) так на точке разделения создаём кучу БП, на точку слияния они придут сами одновременно (ну или как получится) контроль возложен на основной БП
6 Fedor-1971
 
21.11.16
11:45
5+ Разделение - ничего нет - Слияние, в Разделении создали БП в Слиянии получили результат их работы
7 beholder13
 
21.11.16
11:49
(4) (5) То есть, ПредыдущаяТочка ---> ТочкаРазделения ---> ТочкаВложенныхПроцессов ---> ТочкаСлияния ---> СледующаяТочка?
И тогда платформа начнет контролировать весь массив вложенных процессов? Сейчас попробую, спасибо.
8 beholder13
 
21.11.16
11:52
У точки разделения есть только одна исходящая линия
9 beholder13
 
21.11.16
11:55
(4) >> перед выполнением искать и отказывать
В этом случае откатывается вся транзакция, в том числе и выполнение задачи вложенного процесса, что не должно расцениваться, как ошибка
10 beholder13
 
21.11.16
11:57
(4) (5) Получается так, что на карте маршрута нужно задать несколько выходов из точки разделения, тогда как у меня только одна. Вы предлагаете наплодить гвоздями несколько болваночных точек? В таком случае, я мысленно аплодирую такому решению.
11 Fedor-1971
 
21.11.16
12:00
(10) Пробуй без ТочкаВложенныхПроцессов
Прямо в разветвлении генерируй столько БП скольку нужно и стартуй их, в слияние основной БП приедет, когда завершатся все созданные БП
12 Fedor-1971
 
21.11.16
12:03
11+ только признак укажи что это подчинённый БП, сейчас не помню, поле что-то типа "ведущий БП" у подчинённого
13 beholder13
 
21.11.16
12:11
(11) (12) Ненене, что-то далеко Вас занесло, коллега) Это явный костыль)
14 Fedor-1971
 
21.11.16
12:14
(13) Это штатный механизм, костыль был в (1) - ручное ожидание всех БП
15 beholder13
 
21.11.16
12:14
+13 Причем не будет работать, потому что точка разделения тупо стартует все следующие точки маршрута (по крайней мере, в этой версии платформы), никак на них не влияя, и уж тем более абсурдным выглядит утверждение "создай процессы в точке разделения". Тут или я не лыжник, или лыжи не смазаны.

И подчинение указывается в точке маршрута, от вида которой Вы здесь же и предлагаете отказаться, что тоже выглядит сомнительно.
16 beholder13
 
21.11.16
12:15
(14) Динамика, понимаете? Я не могу заранее в карте маршрута указать, сколько именно у меня будет вложенных процессов, их может быть один, два, десять, триста в зависимости от аналитики ведущего процесса.
17 beholder13
 
21.11.16
12:23
+16 И платформа штатно подразумевает создание нескольких вложенных процессов для одной точки маршрута, так где же здесь костыль, если речь идет о поиске возможности отследить этот самый штатный момент завершения вложенных БП, если уж платформа сама не соизволит свою штатную фичу штатно отработать? Или же лучше нагородить левых бессмысленных ветвлений с точками создания вложенных процессов, которые, на самом деле, не вложенные процессы. и дать платформе думать, что это простой набор параллельных задач? В таком случае есть решение куда проще - на той же точке маршрута генерируем несколько ведущих задач, и они автоматом сгенерируют под себя по одному процессу, и не толкнется ведущий процесс дальше, пока не завершатся все ведущие задачи, при неодходимости просто условие поставить, которое будет отслеживать завершение всех ведущих задач.
Но не к этому стремимся же, речь идет о прямом наследовании один-ко-многим, если платформа подразумевает возможность генерирования нескольких вложенных процессов для одной задачи, то должна быть возможность и отследить выполнение так же в рамках одной задачи.
18 Fedor-1971
 
21.11.16
12:28
(17) тут надо пробовать, логика примерно такая: создаём подчинённые БП на точке разветвления и ожидаем их на точке слияния. Основной задачи, вроде, может и не быть - её роль выполняет вложенный БП.
19 beholder13
 
21.11.16
12:32
(18) Что Вы вкладываете в понятие "создаём подчинённые БП на точке разветвления"? Можете меня просветить, я немного не понимаю этого утверждения, потому что уверен, что на точках разделения нет событий, и они не имеют отношения к вложенным процессам.

>> Основной задачи, вроде, может и не быть - её роль выполняет вложенный БП
Что, простите?
20 Fedor-1971
 
21.11.16
12:46
(19) Давно с БП не возился, подзабыл.
21 beholder13
 
21.11.16
12:49
(20) В любом случае, спасибо за предложенные варианты =)
22 beholder13
 
21.11.16
14:42
Ап
23 beholder13
 
21.11.16
17:15
Ответы на два основных вопроса:

1. Для одной задачи должен быть строго один вложенный процесс.
2. В методе ПриСозданииВложенныхБизнесПроцессов используется массив для оптимизации создания - событие вызывается один раз для всего пула задач, созданных на данной точке, и массив ФормируемыеБизнесПроцессы генерируется в соответствии с массивом ФормируемыеЗадачи.

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