Доступ к контексту родительского экземпляра процесса из сценария
В статье рассмотрены примеры сценариев для получения/изменения простых и блоковых контекстных переменных родительского процесса.
А так же сценарий для передачи блока из родительского процесса в подпроцесс.
Для работы необходимы сборки:
Сценарий подпроцесса для изменения значения контекстной переменной родительского процесса.
Нужно подключить Глобальную сбоку:
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 {}" для обработки ошибки в процессе исполнения.