1С:Документооборот. Уведомление параллельных исполнителей. Дополнительный обработчик Бизнес-события

Вашему вниманию предлагается пользовательский обработчик бизнес-события по созданию уведомлений параллельных исполнителей. Для бизнес-процесса «Исполнение».

Случается ситуация, когда нужно в бизнес-процессе сделать параллельный порядок исполнения(кто первый встал, того и тапки), но при этом дополнительно уведомлять смежных исполнителей путем рассылки вопросов(можете заменить на свой вариант).

Писалось на конфе: Документооборот 8 КОРП, редакция 2.1 (2.1.14.4), платформа 8.3.13.1690

При закрытии основной задачи все порождённые вопросы закрываются автоматически.

Автору процесса вопросы не приходят.

 

Текст обработчика:

//УведомлениеПараллельныхИсполнителей
//Подписка: Задача выполнена

Задача   = Событие.Источник;
БПроцесс  = Задача.БизнесПроцесс;
ТекШаг   = 0;
врИсполнителиСтрокой= "";

Если ЗначениеЗаполнено(Задача) И ТипЗнч(БПроцесс) = Тип("БизнесПроцессСсылка.Исполнение") Тогда
//При выполнении задачи закрыть все вопросы
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ЗадачаИсполнителя.Ссылка КАК Ссылка
|ИЗ
| БизнесПроцесс.РешениеВопросовВыполненияЗадач КАК РешениеВопросовВыполненияЗадач
|  ЛЕВОЕ СОЕДИНЕНИЕ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
|  ПО (ЗадачаИсполнителя.БизнесПроцесс = РешениеВопросовВыполненияЗадач.Ссылка)
|ГДЕ
| РешениеВопросовВыполненияЗадач.ПредметРассмотрения = &ПредметРассмотрения
| И РешениеВопросовВыполненияЗадач.Наименование ПОДОБНО ""Рассмотрение вопроса: Выполнена смежная задача:%""
| И ЗадачаИсполнителя.Выполнена = ЛОЖЬ");
Запрос.УстановитьПараметр("ПредметРассмотрения", Задача);
НайтиВопросы = Запрос.Выполнить().Выбрать();
Пока НайтиВопросы.Следующий() Цикл
ТекЗадача = НайтиВопросы.Ссылка.ПолучитьОбъект();
ТекЗадача.РезультатВыполнения = "#АВТО: Выполнение задачи: "+СокрЛП(Задача);
ТекЗадача.ВыполнитьЗадачу();
КонецЦикла;

// Расчитать шаги выполнения
ИсполнителиДляУведомления = БПроцесс.Исполнители.Выгрузить();
ИсполнителиДляУведомления.Колонки.Добавить("Шаг");
РаботаСБизнесПроцессамиКлиентСервер.ЗаполнитьШаг(ИсполнителиДляУведомления);

// Определить текущий шаг по задаче
НайтиТекШаг = ИсполнителиДляУведомления.Найти(Задача,"ЗадачаИсполнителя");
Если НайтиТекШаг <> Неопределено Тогда
ТекШаг = НайтиТекШаг.Шаг;
КонецЕсли;

//Удалить строки лишних шагов, у кого задача выполнена и текущего исполнителя
//Если в шаге больше одной строки то это параллельное исполнение
Сч = 0;
Пока Сч < ИсполнителиДляУведомления.Количество() Цикл
Если ИсполнителиДляУведомления[Сч].Шаг <> ТекШаг Тогда
ИсполнителиДляУведомления.Удалить(Сч);
ИначеЕсли ИсполнителиДляУведомления[Сч].Исполнитель = Задача.Исполнитель
ИЛИ   ИсполнителиДляУведомления[Сч].Исполнитель = БПроцесс.Автор Тогда
ИсполнителиДляУведомления.Удалить(Сч);
ИначеЕсли НЕ ЗначениеЗаполнено(ИсполнителиДляУведомления[Сч].ЗадачаИсполнителя) Тогда
ИсполнителиДляУведомления.Удалить(Сч);
ИначеЕсли ИсполнителиДляУведомления[Сч].ЗадачаИсполнителя.Выполнена Тогда
ИсполнителиДляУведомления.Удалить(Сч);
Иначе
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;

//Создаем вопросы(уведомления)
Для каждого ТекИсполн из ИсполнителиДляУведомления Цикл
//Соберём список оставшихся исполнителей
трИсполнителиСтрокой = "";
Для каждого врТекИсполн из ИсполнителиДляУведомления Цикл
Если НЕ врТекИсполн.Исполнитель = ТекИсполн.Исполнитель Тогда
трИсполнителиСтрокой = трИсполнителиСтрокой+Символы.ПС+врТекИсполн.Исполнитель;
КонецЕсли;
КонецЦикла;
НовыйВопрос = БизнесПроцессы.РешениеВопросовВыполненияЗадач.СоздатьБизнесПроцесс();
НовыйВопрос.ВидВопроса  = Перечисления.ВидыВопросовВыполненияЗадач.Иное;
НовыйВопрос.Описание  = "Выполнена смежная задача: "+СокрЛП(Задача)+
?(СтрДлина(трИсполнителиСтрокой)>0, Символы.ПС+"Исполнители кроме Вас: "+трИсполнителиСтрокой, "");
НовыйВопрос.ПредметРассмотрения = ТекИсполн.ЗадачаИсполнителя;
НовыйВопрос.ГлавнаяЗадача = ТекИсполн.ЗадачаИсполнителя;
НовыйВопрос.Дата   = ТекущаяДатаСеанса();
НовыйВопрос.СрокИсполнения = ТекущаяДатаСеанса();
НовыйВопрос.Автор   = БПроцесс.Автор;  //От кого
НовыйВопрос.ИнициаторПроцесса= ТекИсполн.Исполнитель;//Кому
НовыйВопрос.Записать();
НовыйВопрос.Старт();
//Создать связь с основным процессом
ЗаписьДБПроцессы = РегистрыСведений.ДочерниеБизнесПроцессы.СоздатьМенеджерЗаписи();
ЗаписьДБПроцессы.РодительскийПроцесс= БПроцесс;
ЗаписьДБПроцессы.СвязующаяЗадача = ТекИсполн.ЗадачаИсполнителя;
ЗаписьДБПроцессы.ДочернийПроцесс = НовыйВопрос.Ссылка;
ЗаписьДБПроцессы.Записать();
врИсполнителиСтрокой = врИсполнителиСтрокой +Символы.ПС+ ТекИсполн.Исполнитель;
КонецЦикла;
КонецЕсли;

//Записываем результат в ЖР
Если СтрДлина(врИсполнителиСтрокой)>0 Тогда
ЗаписьЖурналаРегистрации("ТМ.Уведомление параллельных исполнителей",
УровеньЖурналаРегистрации.Информация,Задача.Метаданные(),Задача.Ссылка,
"Автор процесса: "   +СокрЛП(БПроцесс.Автор)+Символы.ПС+
"Выполнил(а) задачу: "  +СокрЛП(Задача.Исполнитель)+Символы.ПС+
"Задача: "     +СокрЛП(Задача)+Символы.ПС+
"Отправлен(ы) вопрос(ы): " +врИсполнителиСтрокой);
КонецЕсли;

 

 

 

И ещё один обработчик, для автоматического закрытия ознакомлений:

//АвтоЗакрытиеОзнакомленияСОтветомНаВопросВыполненаСмежнаяЗадача
//Подписка: Создание задачи

Задача = Событие.Источник;
Если ВРег(Лев(Задача.Наименование, 59)) = "ОЗНАКОМИТЬСЯ С ОТВЕТОМ НА ВОПРОС: ВЫПОЛНЕНА СМЕЖНАЯ ЗАДАЧА:" Тогда
ТекущаяЗадача = Задача.ПолучитьОбъект();
ТекущаяЗадача.ВыполнитьЗадачу();
КонецЕсли;

 

 

Статья про настройку обработчиков Бизнес-событий:

//infostart.ru/public/618153/

UPD 2024/11/14 Добавил связь с основным процессом

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *