gifts2017

Документооборот: Сложный порядок выполнения в Комплексных процессах, включающий сложные комбинации групп И и ИЛИ

Опубликовал Антон Китаев (kitaevay) в раздел Управление - Бизнес-процессы

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

Способы решения:
1) Условие маршрутизации. К каждому из этапов можно (в том числе с широкими возможностями языка 1С) приписать условие. Чтобы сгруппировать таким образом блоки И и блоки ИЛИ надо будет написать приличный код на языке 1С. Этот код надо будет поддерживать от версии к версии и он будет не простым ИМХО.

2) Создать роль (скажем Робот) и автоматически «Выполнять» все задачи (фоновым заданием), которые с этой ролью. Код фонового задания элементарнейший. Это даёт нам возможность в качестве этапов группировать наборы в блоки И и блоки ИЛИ. А уже результат их выполнения использовать для решения задачи "Сложного порядка выполнения". На мой взгляд это так же выглядит нагляднее и проще в настройке, чем вариант 1), но, возможно, более затратно по ресурсам (не тестировали, т.к. в конкретном внедрении более низкая стоимость решения и последующей поддержки важнее). Даже продвинутый пользователь сможет это освоить при необходимости. Всё что нужно указать роль исполнителя Робот в таком этапе.

3) возможно, я что то упустил - предлагайте свои варианты решения задачи, решительно)

4) дождаться дружеского интерфейса от 1С, если фирма 1С посчитает полезным таковой разработать. В Условиях маршрутизации аналогичные группировки (+ группировка НЕ) реализованы и это очень удобно. В 1С пожелание такое зафиксировано и на фейсбуке утверждают, что приоритет его после моей публикации повысился (что это значит и есть ли у нас шансы сами понимаете - без гарантий, но надежда есть), пруф.

Принтскрин части одного из шаблонов процесса (старая версия из тестовой базы) прилагается.

 

Собственно сам код фонового задания:

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Just (Just) 11.09.15 03:55
Что за процедура или метод
тЗадача.ВыполнитьЗадачу();
у меня нет такой в док. оброте?
Вы там выполняете что-то типо Задачи.Выполнена = Истина?
2. Антон Китаев (kitaevay) 11.09.15 10:28
(1) Just, нет, это метод объекта Задача

ЗадачаОбъект.<Имя задачи> (TaskObject.<Имя задачи>)
ВыполнитьЗадачу (ExecuteTask)
Синтаксис:

ВыполнитьЗадачу()
Описание:

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

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

Если ТекущаяЗадача.ПроверитьВыполнение() Тогда
    ТекущаяЗадача.ВыполнитьЗадачу();
КонецЕсли
 

3. Антон Китаев (kitaevay) 11.09.15 10:34
Я вынес эту процедуру в отдельный общий модуль (Экспортная, соответственно, галочка Сервер), если планируется команда для ручного проталкивания, то ещё галочка Вызов Сервера (собственно ради этого и вынес в общий модуль).
4. simargle (simargle) 06.10.16 04:22
Публикация не новая, тем не менее способ все еще актуален для сложных маршрутов. Спасибо!
Как вариант, чтобы не включать в конфигурации возможность изменений, можно написать обработчик произошедших бизнес-событий, который повесить на бизнес-событие "Создание задачи". В самом обработчике можно проверить - если задача пришла на служебную роль "Робот", то осуществить автовыполнение задачи. Также, в свежей редакции (2.1) для этих нужд можно использовать механизм эскалации задач.
kitaevay; +1 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа