В статье Ускоряем мониторинг были рассмотрены 2 варианта замены блока «Мониторинг»: через подзадачу служебному пользователю и изменением периода мониторинга. В этом материале я постараюсь подробно описать первый вариант и рассмотреть пример реализации замены блока «Мониторинг» в его наиболее типичной задаче: ожидание завершения подзадач.
Вся работа будет осуществляться через объектную модель и параметры типового маршрута. Основной алгоритм работы можно описать следующим образом:
На рисунке 1 представлена схема основного типового маршрута.
Рис.1 Схема основного ТМ.
Так как мы работаем через параметры, то в 1 блоке, при создании подзадач, каждую созданную подзадачу сохраняем в параметр (это требуется для проверки завершенности всех подзадач). Служебную подзадачу также необходимо сохранить в параметр, чтобы впоследствии её выполнить из подзадач и удалить из основной задачи.
Рис.2 Схема ТМ для подзадач.
Основной особенностью типового маршрута исполнения подзадач, является сценарий, который выполняет служебную подзадачу, если все подзадачи были выполнены:
// Инициализация
LANGUAGE_CODE = "ru"
CanceledState = LoadString('DIRF882839D_EAC4_48D2_8E4A_DB1199301223'; 'EDM'; LANGUAGE_CODE) // "Прекращена"
CompletedState = LoadString("DIR6AAC6989_9A94_4A2C_A546_B7A97235ABC3"; "EDM"; LANGUAGE_CODE) // "Выполнена"
// Имена свойств основной задачи
// Имя свойства основной задачи, содержащего ссылку на служебную подзадачу
SERVICE_TASK_PROPERTY_NAME = 'СлужебнаяПодзадача'
// Имя свойства основной задачи, содержащего ссылку на список созданных задач
CREATED_SUB_TASKS_PROPERTY_NAME = 'СозданныеПодзадачи'
// Индикатор завершенности всех подзадач
// Изначально - истина, если встретится хотя бы 1 незвершенная задача - ложь
AllCompleted = true
// Получить ID ведущей задачи, он хранится в реквизите LeaderTaskID подзадачи
LeaderTaskID = Object.Requisites('LeaderTaskID').Value
if Assigned(LeaderTaskID)
// Получить основную задачу и параметр созданных подзадач
LeaderTask = Tasks.GetObjectByID(LeaderTaskID)
SubTaskParam = LeaderTask.WorkflowParams.FindItem(CREATED_SUB_TASKS_PROPERTY_NAME)
if Assigned(SubTaskParam)
// Получить ИД служебной подзадачи
ServiceTaskParam = LeaderTask.WorkflowParams.FindItem(SERVICE_TASK_PROPERTY_NAME)
if Assigned(ServiceTaskParam)
if Assigned(ServiceTaskParam.Value)
ServiceTask = ServiceTaskParam.Value.Task
// Получить ИД служебного задания
JobDataSet = ServiceTask.DetailDataSet(3)
if JobDataSet.RecordCount <> 1
// Не создано служебное задание
Raise(CreateException('EDIRServiceJobNotCreated'; LoadString('DIR5D681B5B_EBE3_4DCA_BFCB_405521C82062'; 'EDM'); ecException))
else
ServiceJob = Jobs.GetObjectByID(JobDataSet.SYSREQ_ID)
endif
ServiceTask.LeaveEditMode
else
// "Не задано свойство %s !
Raise(CreateException('EDIRRequiredPropertyNotSpecified'; LoadStringFmt('DIR23C72693_1499_443F_930F_DE56AF09D336'; 'EDM'; ArrayOf(SERVICE_TASK_PROPERTY_NAME)); ecException))
endif
else
// "Не задано свойство %s !
Raise(CreateException('EDIRRequiredPropertyNotSpecified'; LoadStringFmt('DIR23C72693_1499_443F_930F_DE56AF09D336'; 'EDM'; ArrayOf(SERVICE_TASK_PROPERTY_NAME)); ecException))
endif
i = 0
// Проверить каждую задачу из списка подзадач
while i < SubTaskParam.Count
if Assigned(SubTaskParam.Values(i))
CurTask = SubTaskParam.Values(i).Task
// Если состояние задачи не "Выполнена" и не "Прекращена",
// значит еще не все подзадачи завершены
if CurTask.Requisites('TaskState').Value <<>> CanceledState
and CurTask.Requisites('TaskState').Value <<>> CompletedState
and CurTask.ID <<>> Object.ID // Текущую задачу не проверять
AllCompleted = false
i = SubTaskParam.Count
endif
endif
i = i + 1
endwhile
// Если все подзадачи завершены - выполнить служебную подзадачу
if AllCompleted
ServiceJob.Perform
endif
endif
endif
Если требуется создание задач, а не подзадач, то при создании задач в основном типовом маршруте, реквизит LeaderTaskID необходимо указывать в ручную.
Пакет разработки для версии DIRECTUM 4.6.1 и выше:
Авторизуйтесь, чтобы написать комментарий