Отмена выполнения задачи исполнителя и вложенных бизнес-процессов

15.01.20

Функциональные - Управление бизнес-процессами (BPMS)

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Отмена выполнения задачи исполнителя и вложенных бизнес-процессов:
.epf 10,17Kb ver:1.2
37
37 Скачать (1 SM) Купить за 1 850 руб.

Скажу сразу, ранее практически не попадалось задач по бизнес-процессам. А тут пришлось с нуля в также не знакомой мне области создавать подсистему "Претензионно-исковая деятельность". 

Проект сдан, теперь началась работа пользователей и появилась потребность администрирования их работы. Всё, что находилось в 1С блогосфере - было по созданию бизнес-процессов и ничего не нашлось толкового по отмене задачи ошибочной и тем более по отмене ошибочного перехода в вложенный БП (бизнес-процесс далее).

Конечно, прилагаемая обработка не взлетит у Вас! У меня свои названия БП и Задача исполнителя так же не стандартно названа. Но для понимания принципа, как образец к действию сгодится для начинающих (а опытные могут дать свои замечания и критику).

Шапка наполнена реквизитами под учет моих карт и моих БП. У меня 11 БП, которые могут стартовать в одном из двух  БП, дальше вызовом вложенных сливаются в один маршрут и по цепочке маршрута могут циклически вызываться из одного в другой и снова возвращаться в середину. 

Судебное ведение дела уходит то в Апелляцию, может в Кассацию. Из них вызывается Сопровождение в суде, мировое соглашение или на Исполнительное производство. Очень запутанные схемы и пользователи естественно будут ошибаться и не то выбирать при выполнении очередной задачи.

По схемам у меня раздвоение более чем на две ветки не случается и поэтому в шапку забил поля под две ветки. Сначала потерял время над попыткой автоматизации заполнения задачами шапки при выборе документа Претензия, это у меня ведущий документ - из которого централизованно ведется весь ход и управление маршрутом\задачами. Но автоматизации не вышло, это нужно было предусмотреть на стадии проектирования. А я когда проектировал предусмотрел это мне казалось, но только для линейных схем. В задаче у меня был предусмотрен реквизит - Следующая задача и он заполнялся при создании следующей задачи. Но после разделения на две ветки, одна задача созданная из двух уже теряется в этой цепочке.

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

Так же при переходе в вложенный БП, если это первый шаг нового БП и он ожидает выполнения, то поле с выполненной задачей 1 будет заполнено последней выполненной задачей из БП вызвавшего это вложенный БП. Поле Предыдущий БП заполнится исходным БП. Отменить в этот момент можно текущий БП, при этом автоматом отметятся к удалению задача которая ожидает выполнения в вложенном БП, отменится выполнение предыдущей задачи из вызвавшего БП, удалится ведущая задача, которую автоматически создал БП при создании вложенного и в моем случае ещё свои мелкие необходимости, как например перезапись реквизита Текущий БП у документа Претензия.

Так же замечу, у меня при удалении задачи исполнителя дополнительно производятся нужные в моём частном случае действия, как например установка дополнительных свойств у объекта, для отмены проверки установки пометки удаления на задачу. Это у меня программно запрещено пользователю! Иначе там сразу начался ужас в данных. Но это все сопутствующая лирика.

Так же в правой части шапки добавил возможность руками выбрать из списка точек, нужную точку маршрута и автоматом подтягивается к ней предыдущая точка. Это понадобилось для случая, когда раздвоение маршрута одной веткой упёрлось в точку слияния и этот шаг у нас становится выполненным, но что бы его отменить - придется его отдельно выбрать руками. Автоматом его не определить так просто. Там же, справа, расположена командная кнопка "Отмена выбранной задачи" и под кнопкой пояснение боле менее подробное. Логика работы кнопки зависит от состояния задачи в поле Ручной выбор задачи. Если она выполнена, то предыдущая тоже выполнена и первое нажатие кнопки отменит выполнение выбранной задачи. Карта при этом обновит состояние, она вообще обновляется при основных действиях и есть кнопка обновления карты и заодно кнопка для левого поля шапки обновить задачи. Так вот, вернемся к нашей кнопке в правом поле. Второе нажатие уже удалит отмененную с выполнения первым нажатием задачу и отменит выполнение у предыдущей. Третий раз нажимать не надо, проверок на все случаи не вставлял)))

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

Процедура удаления не выполненного шага и отмены выполнения предыдущего или удаления входа в вложенный БП:

 


 

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

&НаСервере
Процедура ШагНазадНаСервере_()
	
	НачатьТранзакцию();
	Попытка
		Если ОтменитьБП Тогда
			ОтменаВложенногоБПНаСервере();
		Иначе
			ШагНазадНаСервере();
		КонецЕсли;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ТекстСообщенияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		ВызватьИсключение ТекстСообщенияОбОшибке ; // Запись в ЖР и т.п.
	КонецПопытки;
	
	ПретензияПриИзмененииНаСервере();
	Если ЗначениеЗаполнено(ТекущийБП) Тогда
		ПолучитьКартуНаСервере();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ШагНазад(Команда)
	ШагНазадНаСервере_();
КонецПроцедуры

 

 

Разрабатываемая мной подсистема ПИР, для которой написал обработку, интегрирована в Управление холдингом 1.3

Версия платформы 1С:Предприятие 8.3 (8.3.13.1644)

Бизнес-процессы Задача исполнителя

См. также

Управление бизнес-процессами (BPMS) Бесплатно (free)

В этой статье вы узнаете, что такое нотации, зачем они нужны, и какие виды моделирования бизнес-процессов существуют в природе. Сравним положительные и отрицательные стороны каждого из них. Более подробно погрузимся в, пожалуй, один из самых универсальных и удобных инструментов – BPMN 2.0. Разберем основные элементы и попрактикуемся на реальном примере. Я предоставлю вам базовые знания, которые позволят вам сразу после завершения знакомства с данной статьёй, спроектировать свою первую BPMN-диаграмму на любую актуальную для вас профессиональную тему.

30.08.2024    3806    1Concept    19    

23

Управление производством (МES) Управление бизнес-процессами (BPMS) Платформа 1С v8.3 Платные (руб)

Программный продукт является самостоятельным решением, разработанным на современной технологической платформе "1С:Предприятие 8.3" и позволяет автоматизировать основные бизнес-процессы производственных лабораторий, служб управления качеством и ОТК на предприятиях с дискретными и процессными типами производств, а также независимых и аккредитованных лабораторий.

357000 руб.

16.07.2024    586    0    0    

0

Управление бизнес-процессами (BPMS) Платформа 1С v8.3 Бесплатно (free)

В статье приводится пример настройки бизнес-процесса в типовой конфигурации с использованием универсальной подсистемы КонструкторБизнесПроцессов.

30.11.2023    4649    1bpm    0    

16

Работа с интерфейсом Управление бизнес-процессами (BPMS) Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Обработка для создания ментальных карт / работы с графической схемой 1С / визуализации бизнес-процессов. Гибкое управление: направление новых элементов / цвет элементов / типы линий / типы рамок / картинки / фигуры. Дополнительные возможности: совместная/групповая работа со схемой через механизм Системы взаимодействия 1С.

1 стартмани

07.09.2020    8528    23    Mopo3    11    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. awk 744 16.01.20 09:24 Сейчас в теме
Нарушение стандарта 1С в коде, например "Работа с транзакциями"

1.3. При использовании транзакций необходимо предусмотреть обработку исключений, придерживаясь следующих правил:

* метод НачатьТранзакцию должен быть за пределами блока Попытка-Исключение непосредственно перед оператором Попытка;
2. dadel 19 16.01.20 10:15 Сейчас в теме
(1) Согласно 1.3 да, там рекомендуется непосредственно перед попыткой.
Но если у меня идет получение объектов из выборки в цикле и хоть в одной из нескольких записей если ошибка, то нужно отменить все изменения. Как тут согласно рекомендации п1.3 реализовать?
А вообще код не оптимизировал конечно, выложил просто как некий план к действию, направление в котором нужно копать. Мой частный случай вряд ли кому то подойдет, сами объекты не совпадут.
Но если поясните подробнее, как в моём случае правильнее прописать Транзакцию - буду благодарен!)
3. awk 744 16.01.20 13:16 Сейчас в теме
(2) Да легко.

Как пример:

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

    КонецЦикла;

    УдаляемыйБП = ТекущийБП.ПолучитьОбъект();
    УдаляемыйБП.ВедущаяЗадача     = Неопределено;
    УдаляемыйБП.Стартован         = Истина;
    УдаляемыйБП.Завершен         = Истина;
    УдаляемыйБП.Записать();    
    ТекПретензия = Претензия.ПолучитьОбъект();
    ТекПретензия.ТекущийБП = ПредыдущийБП;
    ТекПретензия.Записать(РежимЗаписиДокумента.Проведение);
    
    
КонецПроцедуры

&НаСервере
Процедура ОтменаВложенногоБПНаСервере()
    
    НачатьТранзакцию();
    
    Попытка
        ОтменаВложенногоБПНаСервере_БезТранзакции()
        ЗафиксироватьТранзакцию(); 
    Исключение
        ОтменитьТранзакцию();
	ТекстСообщенияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        ВызватьИсключение ТекстСообщенияОбОшибке ; // Запись в ЖР и т.п.
    КонецПопытки;
        
КонецПроцедуры
Показать
nightowl; dadel; +2 Ответить
4. dadel 19 16.01.20 16:40 Сейчас в теме
(3)
Попытка
ОтменаВложенногоБПНаСервере_БезТранзакции()
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ТекстСообщенияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ВызватьИсключение ТекстСообщенияОбОшибке ; // Запись в ЖР и т.п.
КонецПопытки;

Здорово!)
И главное просто), приму к сведению.
9. dadel 19 17.01.20 10:31 Сейчас в теме
(3)Исправил обработку и текст по замечанию.
Спасибо!
Жаль кто-то скачал сегодня утром без исправлений (хотя я думал кода достаточно будет и не думал, что будут скачивать). А там действительно транзакция может при ошибке в середине отмениться и дальше будет работать обработка уже не в транзакции и получится не хорошо...
5. CyberCerber 872 16.01.20 20:19 Сейчас в теме
Где-то лет семь назад делал возможность возврата к произвольной точке маршрута. Можно было открыть схему, правой кнопкой нажать на блок и выбрать в меню. А потом еще извратился сделать переход наоборот вперед, т.е. вообще к любой точке.
Вообще механизм БП в 1С хороший, но жаль не популярный и поэтому мало развиваемый.
6. dadel 19 17.01.20 00:04 Сейчас в теме
(5)Ну просто перепрыгнуть в любую точку текущего БП можно просто изменив в задаче точку маршрута.
Я так делал для отладки, сразу перепрыгивал весь БП на точку перехода в вложенный БП. У меня схем(карт) куча и все они друг с другом связаны, по факту это один БП раздробленный. И попасть например в процесс Исполнения Судебного решения нужно только пройдя через Переговорную работу, Претензионную, Подготовку к Судебному процессу и т.д.
Перепрыгивать можно но говорить о сохранении целостности маршрута тут не приходится, я только в отладке так прыгал. А у меня задача как можно адекватнее откатить\отменить неправильные шаги.
Сначала в опытной эксплуатации у меня пользователям поле точка БП было открыто, так шаловливые именно так и стали прыгать))) Сразу увидел бардак и закрыл.
7. CyberCerber 872 17.01.20 00:09 Сейчас в теме
(6) Ну нет, через изменение точки маршрута в задаче не делал, это как-то слишком грубо. Происходило именно восстановление актуальности нужной задачи и отмена всех после нее.
А переход вперед был сделан уже для эксперимента, конечно, фактического смысла в нем было немного.
8. dadel 19 17.01.20 00:28 Сейчас в теме
(7)Я просто понял фразу "ткнуть в произвольную точку маршрута" именно так. Что можно из текущей перепрыгнуть в любую точку, пропустив все промежуточные например.
Оставьте свое сообщение