Взаимодействие с объектной моделью Workflow

Основные объекты, которыми оперирует функция сценария, — это внутренние объекты сервиса СУБП, специфические для исполняемого процесса. К ним относятся переменные процесса, шлюзы, журнал процесса и др. Необходимые типы данных собраны в пространстве имён DocsVision.Workflow.Runtime.

Главный способ получения данных бизнес-процесса — это обращение к соответствующим свойствам объекта типа ProcessInfo, который содержит данные о текущем процессе:

  • Коллекция шлюзов, доступных процессу.

  • Коллекция переменных процесса.

  • Ссылка на справочники.

  • Ссылка на карточку процесса.

  • Журнал процесса.

Кроме того, ProcessInfo содержит методы:
  • Получение шлюза с указанным именем.

  • Получение переменной с указанным именем.

  • Запись информационного сообщения в журнал процесса.

Экземпляр данного класса выступает в качестве входного параметра функции сценария.

Работа со шлюзами

Коллекция шлюзов процесса (переменная ProcessInfo.Gates) содержит типизированные экземпляры серверных классов шлюзов, реализующих общий интерфейс IGate. Для получения конкретного шлюза из коллекции, необходимо знать его название или тип.

Тип шлюза (уникальный идентификатор) задаётся в процессе его разработки и в дальнейшем не должен изменяться.

Для организации взаимодействия с объектами внешней системы сценарий может общаться с этой системой напрямую (при помощи её собственного API), либо с помощью шлюза, который может содержать вспомогательные классы для работы с каждым из объектов внешней системы.

Например, при работе со Справочником сотрудников разработчик сценария может работать напрямую с данными справочника, либо использовать соответствующие объекты шлюза к Docsvision. Однако чаще всего объекты шлюза служат внутренним целям (для организации работы стандартных функций), и могут не иметь всех свойств и методов по сравнению с API Docsvision. Поэтому по возможности, рекомендуется работать с внешней системой через API Docsvision.

Пример работы с объектами из сценария с использованием API Docsvision:
public void Execute (ProcessInfo process, PassState passInfo)
{
 DVGate dvGate = (DVGate)process.Gates[DVGate.GateID]; (1)

 UserSession userSession = dvGate.UserSession; (2)

 CardData data = userSession.CardManager.GetCardData(new Guid("00000000-0000-0000-0000-000000000000")); (3)

 // ...
}
1 Получение шлюза к Docsvision.
2 Получение сессии для доступа к API.
3 Получение данных карточки с идентификатором 00000000-0000-0000-0000-000000000000.
Сессия может быть получена из самого сценария:
public void Execute (ProcessInfo process, PassState passInfo)
{
 UserSession userSession = process.Session; (1)

   // ...
}
1 Получение сессии процесса.

Работа с переменными

Переменные процесса могут быть получены из переменной ProcessInfo.Variables, которая содержит объекты типа ProcessVariable.

Данный тип предоставляет следующие данные:
  • Уникальный идентификатор переменной, её название, тип и значение.

  • Отображаемое значение объекта, хранящегося в переменной.

  • Идентификатор шлюза, которому принадлежит переменная.

  • Коллекция строчных значений (для переменных типа "Перечисление").

При работе с переменными простых типов ("Строка", "Целое", "Дробное" и др.), значение переменной может быть получено непосредственно из свойства ProcessVariable.Value. Для прочих типов (переменные шлюзов) в качестве значения переменной будет возвращена ссылка на соответствующий типизированный объект шлюза:

ProcessVariable varStr = process.GetVariableByName("ПростоСтрока");
string strValue = (string)varStr.Value; (1)

ProcessVariable varDoc = process.GetVariableByName("Карточка");
DVCard card = (DVCard)varDoc.Value; (2)
1 Получение переменной простого типа (тип "Строка").
2 Получение переменной, тип которой предоставлен шлюзом.

Присвоение значений переменным выполняется аналогично: переменные простых типов получают непосредственное значение, тогда как шлюзовые переменные в качестве нового значения могут получать только объекты шлюза:

ProcessVariable varStr = process.GetVariableByName("ПростоСтрока");
varStr.Value = "Новое значение"; (1)

DVGate dvGate = (DVGate)process.Gates[DVGate.GateID]; (2)

ProcessVariable varDoc = process.GetVariableByName("Карточка"); (3)
varDoc.Value = dvGate.GetVariable((int)DVVariableType.DOCUMENT, "ID_карточки");
1 Получение переменной простого типа (тип "Строка") и присвоение ей значения.
2 Получение шлюза к Docsvision.
3 Получение переменной, тип которой предоставлен шлюзом, и присвоение ей значения.