logo

Доступ к контексту родительского экземпляра процесса из сценария

В статье рассмотрены примеры сценариев для получения/изменения простых и блоковых контекстных переменных родительского процесса.
А так же сценарий для передачи блока из родительского процесса в подпроцесс.
Сценарий подпроцесса для изменения значения контекстной переменной родительского процесса.
Нужно подключить Глобальную сбоку:
Microsoft.CSharp
Пространства имен:
using Microsoft.CSharp;
Текст сценария:
var parentInstance = context.WorkflowInstance.ParentInstance;
if (parentInstance != null)
            {
             // Есть родительский экземпляр
             // Получаем контекст родительского экземпляра
             dynamic parentContext = parentInstance.Context;
             // Устанавливаем значение свойства контекста родительского экземпляра (из контекста данного процесса)
             parentContext.Znachenie = context.Znachenie;
            }
Сценарий для создания элементов блока в родительском процессе из подпроцесса.
Для работы необходимы сборки:
EleWise.ELMA.Workflow.Processes
ICSharpCode.NRefactory (глобальная сборка)
Microsoft.CSarp (глобальная сборка)
Пространства имен:
using EleWise.ELMA.Model.Entities.ProcessContext;
using EleWise.ELMA.Model.Services;
using Microsoft.CSharp; 
Также в коде перед самим сценарием следует поместить описание использующейся в нем функции:
// Функция создания элемента блока:
     private dynamic CreateParentItem(object parentTablePart)
     {
      if (parentTablePart == null)
      {
       throw new InvalidOperationException("Блок не существует");
      }
      var itemType = parentTablePart.GetType().GetInterface(typeof(Iesi.Collections.Generic.ISet<>).FullName).GetGenericArguments()[0];
      return InterfaceActivator.Create(itemType);
     } 
Текст сценария:
var parentInstance = context.WorkflowInstance.ParentInstance;
         if (parentInstance != null)
         {
             // Есть родительский экземпляр
              // Получаем контекст родительского экземпляра
             dynamic parentContext = parentInstance.Context;
             // Создаем элемент родительского блока
             var item = CreateParentItem(parentContext.Blok);
             // Присваиваем значения переменных в этом элементе блока
             item.StrokaBloka = context.Stroka;
             // Добавляем элемент в блок
             parentContext.Blok.Add(item);
         } 
Сценарий для передачи блока из родительского процесса в подпроцесс.
Для работы необходимы сборки:

EleWise.ELMA.Workflow.Processes
ICSharpCode.NRefactory (глобальная сборка)
Microsoft.CSarp (глобальная сборка)

Пространства имен:
using EleWise.ELMA.Extensions;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Model.Entities.ProcessContext;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Model.Types.Settings;
using Microsoft.CSharp;
Текст сценария:
var parentInstance = context.WorkflowInstance.ParentInstance;
if (parentInstance != null)
{
dynamic parentContext = parentInstance.Context;
foreach (var t in (Iesi.Collections.ISet)parentContext.Blok)
{  var b = new P_Pod_test_Podblok();//создание элемента блока подпроцесса
b.Stroka=t.AsDynamic().StorkaBloka;//получение значения родительского блока
context.PodBlok.Add(b);
}
}
Примечание

При работе с переменной "parentContext" автозаполнение (подсказки) в редакторе сценариев работать не будут. Кроме того, при публикации не проверяется правильно ли записаны имена свойств, к которым идет обращение в parentContext. Т.е. если написать "parentContext.Znachenie123", а на самом деле переменной Znachenie123 в родительском процессе нет, то процесс опубликуется нормально, но при исполнении сценария будет выдана ошибка.Поэтому нужно быть внимательными при работе с контекстом родительского экземпляра. Можно для надежности оборачивать данный код в "try { } catch {}" для обработки ошибки в процессе исполнения.