Замена блока "Мониторинг"

10 0

В статье Ускоряем мониторинг были рассмотрены 2 варианта замены блока «Мониторинг»: через подзадачу служебному пользователю и изменением периода мониторинга. В этом материале я постараюсь подробно описать первый вариант и рассмотреть пример реализации замены блока «Мониторинг» в его наиболее типичной задаче: ожидание завершения подзадач.

Вся работа будет осуществляться через объектную модель и параметры типового маршрута. Основной алгоритм работы можно описать следующим образом:

  1. Создание подзадач;
  2. Создание служебной подзадачи, ожидание её выполнения;
  3. Выполнение подзадач, выполнение служебное подзадачи.
  4. Удаление служебной подзадачи и завершение типового маршрута.

На рисунке 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 и выше:

TR.zip (14,46 Кб)

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий