Случается ситуация, когда нужно в бизнес-процессе сделать параллельный порядок исполнения(кто первый встал, того и тапки), но при этом дополнительно уведомлять смежных исполнителей путем рассылки вопросов(можете заменить на свой вариант).
Писалось на конфе: Документооборот 8 КОРП, редакция 2.1 (2.1.14.4), платформа 8.3.13.1690
При закрытии основной задачи все порождённые вопросы закрываются автоматически.
Автору процесса вопросы не приходят.
//УведомлениеПараллельныхИсполнителей
//Подписка: Задача выполнена
Задача = Событие.Источник;
БПроцесс = Задача.БизнесПроцесс;
ТекШаг = 0;
врИсполнителиСтрокой= "";
Если ЗначениеЗаполнено(Задача) И ТипЗнч(БПроцесс) = Тип("БизнесПроцессСсылка.Исполнение") Тогда
//При выполнении задачи закрыть все вопросы
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ЗадачаИсполнителя.Ссылка КАК Ссылка
|ИЗ
| БизнесПроцесс.РешениеВопросовВыполненияЗадач КАК РешениеВопросовВыполненияЗадач
| ЛЕВОЕ СОЕДИНЕНИЕ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
| ПО (ЗадачаИсполнителя.БизнесПроцесс = РешениеВопросовВыполненияЗадач.Ссылка)
|ГДЕ
| РешениеВопросовВыполненияЗадач.ПредметРассмотрения = &ПредметРассмотрения
| И РешениеВопросовВыполненияЗадач.Наименование ПОДОБНО ""Рассмотрение вопроса: Выполнена смежная задача:%""
| И ЗадачаИсполнителя.Выполнена = ЛОЖЬ");
Запрос.УстановитьПараметр("ПредметРассмотрения", Задача);
НайтиВопросы = Запрос.Выполнить().Выбрать();
Пока НайтиВопросы.Следующий() Цикл
ТекЗадача = НайтиВопросы.Ссылка.ПолучитьОбъект();
ТекЗадача.РезультатВыполнения = "#АВТО: Выполнение задачи: "+СокрЛП(Задача);
ТекЗадача.ВыполнитьЗадачу();
КонецЦикла;
// Расчитать шаги выполнения
ИсполнителиДляУведомления = БПроцесс.Исполнители.Выгрузить();
ИсполнителиДляУведомления.Колонки.Добавить("Шаг");
РаботаСБизнесПроцессамиКлиентСервер.ЗаполнитьШаг(ИсполнителиДляУведомления);
// Определить текущий шаг по задаче
НайтиТекШаг = ИсполнителиДляУведомления.Найти(Задача,"ЗадачаИсполнителя");
Если НайтиТекШаг <> Неопределено Тогда
ТекШаг = НайтиТекШаг.Шаг;
КонецЕсли;
//Удалить строки лишних шагов, у кого задача выполнена и текущего исполнителя
//Если в шаге больше одной строки то это параллельное исполнение
Сч = 0;
Пока Сч < ИсполнителиДляУведомления.Количество() Цикл
Если ИсполнителиДляУведомления[Сч].Шаг <> ТекШаг Тогда
ИсполнителиДляУведомления.Удалить(Сч);
ИначеЕсли ИсполнителиДляУведомления[Сч].Исполнитель = Задача.Исполнитель
ИЛИ ИсполнителиДляУведомления[Сч].Исполнитель = БПроцесс.Автор Тогда
ИсполнителиДляУведомления.Удалить(Сч);
ИначеЕсли НЕ ЗначениеЗаполнено(ИсполнителиДляУведомления[Сч].ЗадачаИсполнителя) Тогда
ИсполнителиДляУведомления.Удалить(Сч);
ИначеЕсли ИсполнителиДляУведомления[Сч].ЗадачаИсполнителя.Выполнена Тогда
ИсполнителиДляУведомления.Удалить(Сч);
Иначе
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;
//Создаем вопросы(уведомления)
Для каждого ТекИсполн из ИсполнителиДляУведомления Цикл
//Соберём список оставшихся исполнителей
трИсполнителиСтрокой = "";
Для каждого врТекИсполн из ИсполнителиДляУведомления Цикл
Если НЕ врТекИсполн.Исполнитель = ТекИсполн.Исполнитель Тогда
трИсполнителиСтрокой = трИсполнителиСтрокой+Символы.ПС+врТекИсполн.Исполнитель;
КонецЕсли;
КонецЦикла;
НовыйВопрос = БизнесПроцессы.РешениеВопросовВыполненияЗадач.СоздатьБизнесПроцесс();
НовыйВопрос.ВидВопроса = Перечисления.ВидыВопросовВыполненияЗадач.Иное;
НовыйВопрос.Описание = "Выполнена смежная задача: "+СокрЛП(Задача)+
?(СтрДлина(трИсполнителиСтрокой)>0, Символы.ПС+"Исполнители кроме Вас: "+трИсполнителиСтрокой, "");
НовыйВопрос.ПредметРассмотрения = ТекИсполн.ЗадачаИсполнителя;
НовыйВопрос.ГлавнаяЗадача = ТекИсполн.ЗадачаИсполнителя;
НовыйВопрос.Дата = ТекущаяДатаСеанса();
НовыйВопрос.СрокИсполнения = ТекущаяДатаСеанса();
НовыйВопрос.Автор = БПроцесс.Автор; //От кого
НовыйВопрос.ИнициаторПроцесса= ТекИсполн.Исполнитель;//Кому
НовыйВопрос.Записать();
НовыйВопрос.Старт();
//Создать связь с основным процессом
ЗаписьДБПроцессы = РегистрыСведений.ДочерниеБизнесПроцессы.СоздатьМенеджерЗаписи();
ЗаписьДБПроцессы.РодительскийПроцесс= БПроцесс;
ЗаписьДБПроцессы.СвязующаяЗадача = ТекИсполн.ЗадачаИсполнителя;
ЗаписьДБПроцессы.ДочернийПроцесс = НовыйВопрос.Ссылка;
ЗаписьДБПроцессы.Записать();
врИсполнителиСтрокой = врИсполнителиСтрокой +Символы.ПС+ ТекИсполн.Исполнитель;
КонецЦикла;
КонецЕсли;
//Записываем результат в ЖР
Если СтрДлина(врИсполнителиСтрокой)>0 Тогда
ЗаписьЖурналаРегистрации("ТМ.Уведомление параллельных исполнителей",
УровеньЖурналаРегистрации.Информация,Задача.Метаданные(),Задача.Ссылка,
"Автор процесса: " +СокрЛП(БПроцесс.Автор)+Символы.ПС+
"Выполнил(а) задачу: " +СокрЛП(Задача.Исполнитель)+Символы.ПС+
"Задача: " +СокрЛП(Задача)+Символы.ПС+
"Отправлен(ы) вопрос(ы): " +врИсполнителиСтрокой);
КонецЕсли;
//АвтоЗакрытиеОзнакомленияСОтветомНаВопросВыполненаСмежнаяЗадача
//Подписка: Создание задачи
Задача = Событие.Источник;
Если ВРег(Лев(Задача.Наименование, 59)) = "ОЗНАКОМИТЬСЯ С ОТВЕТОМ НА ВОПРОС: ВЫПОЛНЕНА СМЕЖНАЯ ЗАДАЧА:" Тогда
ТекущаяЗадача = Задача.ПолучитьОбъект();
ТекущаяЗадача.ВыполнитьЗадачу();
КонецЕсли;
Статья про настройку обработчиков Бизнес-событий:
UPD 2019/11/14 Добавил связь с основным процессом