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

Публикация № 1153519

Разработка - Практика программирования

Документооборот Бизнес-события бизнес-процесс ВместеСПредыдущим Уведомление Исполнение

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

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

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

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

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

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

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

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

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

 

 

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

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

 

 

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

//infostart.ru/public/618153/

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

Специальные предложения

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