Разработка сценариев

Разработка сценариев включает в себя следующие этапы:
  • Написание кода сценария.

  • Отладка кода сценария.

  • Сохранение готового сценария в процессе или подпроцессе.

Код сценария может быть написан непосредственно в диалоговом окне Редактирование скрипта, в диалоговом окне функции сценария, в любом другом редакторе или при помощи Visual Studio.NET — с последующей вставкой полученного кода в функцию процесса.

К сценарию автоматически добавляется коллекция необходимых сборок:
  • Mscorlib.dll

  • System.dll

  • System.Core.dll

  • System.Data.dll

  • System.ServiceModel.dll

  • System.Xml.dll

  • DocsVision.Platform.dll

  • DocsVision.Platform.CardLib.dll

  • DocsVision.Platform.ObjectManager.dll

  • DocsVision.Platform.ObjectModel.dll

  • DocsVision.ObjectManager.Interop.dll

    Данная библиотека может быть пропущена. Если в настройках сценария будет выставлен флаг Не добавлять ссылку на DocsVision.ObjectManager.Interop.dll, будет подключена сборка DocsVision.Platform.ObjectManager.dll.

  • DocsVision.Workflow.Interfaces.dll

  • DocsVision.Workflow.Objects.dll

  • DocsVision.Workflow.Runtime.dll

  • DocsVision.Workflow.Functions.dll

  • DocsVision.Workflow.Gates.dll

  • DocsVision.BackOffice.ObjectModel.dll

  • DocsVision.SecurityManager.Interop.dll

  • DocsVision.HelperAPI.Interop.dll

В сценариях, приведенных далее, будет использоваться сборка DocsVision.Platform.ObjectManager.dll (в параметрах сценария установлен флаг Не добавлять ссылку на DocsVision.ObjectManager.Interop.dll) — нужно учитывать при указании типа переменных.

При добавлении в карточку бизнес-процесса сценария, автоматически формируется стандартная структура класса сценария — DVScript, со стандартной точкой входа — метод Execute:

class DVScript
{
 public void Execute (ProcessInfo process, PassState passInfo) (1)
 {
  try
  {
   ProcessVariable oVar = process.GetVariableByName("Var1"); (2)

   oVar.Value = "Scripted"; (3)

   process.LogMessage ("Значение переменной изменено"); (4)
  }
  catch (Exception ex)
  {
   process.LogMessage("Ошибка выполнения скрипта:" + ex.Message); (5)
  }
  return;
 }
}
1 Стандартная функция, которая будет вызвана подсистемой СУБП.
Входные параметры функции:
  • process — информация о процессе. Содержит коллекции:

    • Gates — коллекция шлюзов процесса

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

  • passInfo — информация о текущем проходе

2 Пример — получение переменной процесса с именем Var1.
3 Присвоение переменной нового значения.
4 Запись в журнал процесса.
5 Запись в журнал ошибки исполнения.

Если в сценарии идет обращение к контексту объектов, то вместо его создания из пользовательской сессии достаточно изменить точку входа. Также необходимо подключить пространство имён DocsVision.Platform.ObjectModel:

public void Execute (ProcessInfo process, PassState passInfo, ObjectContext objectContext)
Помимо приведенных сигнатур метода, можно использовать точку входа, возвращающую результат выполнения:
public ExecResultEnum Execute(ProcessInfo process, PassState passInfo)

Вариант с ExecResultEnum позволяет после завершения сценария оставить функцию активной или ожидающей какого-то события — сценарий будет запущен повторно после наступления события или (в зависимости от ExecResultEnum) при следующем проходе.

В ранних версиях Docsvision подобное поведение можно было организовать при помощи вызова в сценарии исключения типа FunctionResultException.

Сигнатура приведенного метода не является жесткой — список параметров может формироваться разработчиком сценария. Допускается использование параметров определённых типов, указанных ниже.

Тип Привязка к объекту

ProcessInfo

Расширенная объектная модель текущего бизнес-процесса.

Process

Объектная модель текущего бизнес-процесса.

ProcFunction

Объектная модель над данными текущей выполняемой функции.

PassState

Объектная модель текущего прохода исполняемой функции.

ScriptFunction

Исполняемая функция "Сценарий".

IFunction

Интерфейс IFunction# текущей исполняемой функции.

IFunction2

Интерфейс IFunction2# текущей исполняемой функции.

IWorkflowRuntime

Объект представляющий текущий WorkflowRuntime. В первую очередь рекомендуется использовать его при необходимости максимально эффективно запустить новый бизнес-процесс.

UserSession

Пользовательская сессия, в контексте которой работает текущий бизнес-процесс. Эта сессия не имеет отношения к сессии, хранящейся в шлюзе к Docsvision, текущего бизнес-процесса.

ObjectContext

Проинициализированный контекст для работы с объектной моделью над данными, доступной через библиотеку DocsVision.Platform.ObjectModel. В передаваемом ObjectContext будут добавлены сервисы, достаточные для работы с объектами BackOffice.

DVGate

Шлюз к Docsvision текущего бизнес-процесса.

ExGate

Шлюз к почте текущего бизнес-процесса.

FSGate

Шлюз к файловой системе текущего бизнес-процесса.

BasicGate

Шлюз к базовым типам текущего бизнес-процесса.

AxaptaGate

Шлюз к Axapta\Dynamics Ax текущего бизнес-процесса.

SPGate

Шлюз к SharePoint текущего бизнес-процесса.

1CGate

Шлюз к 1C текущего бизнес-процесса.

Тип стороннего шлюза

Любой сторонний шлюз, который реализует интерфейс IGate и доступен в бизнес-процессе.

Кроме того, предусмотрено использование переменной типа ProcessVariable — переменная процесса.

В этом случае алгоритм получения значения переменной следующий:
  1. У параметра осуществляется поиск атрибута типа VariableNameAtrribute, в значении которого должно быть указано название переменной бизнес-процесса. Переменную требуется передать в выполняемый сценарий.

    Если такой атрибут у параметра отсутствует, то в качестве имени переменной принимается имя самого параметра метода.

  2. Если переменная с полученным именем не найдена в бизнес-процессе, то в качестве значения параметра будет передан null.

  3. Если значение параметра определить не удалось, то в качестве его значения принимается DefaultValue данного параметра. Если DefaultValue равно DBValue.Null, то оно принимается равным null.

Использование нескольких параметров, в том числе переменных процессов, позволяет реализовать следующий сценарий:
using System;
using System.Xml; (1)

using DocsVision.Workflow.Objects;
using DocsVision.Workflow.Runtime;
using DocsVision.Workflow.Gates;
using DocsVision.Platform.HelperAPI; (2)

using DocsVision.Workflow.Functions;
using DocsVision.Platform.ObjectManager; (3)

namespace DVScriptHost
{
 class DVScript
 {
  public ExecResultEnum Execute( (4)
   ProcessInfo process (5)
   , PassState passInfo (6)
   , UserSession session (7)
   , DVGate gate (8)
   , [VariableName("Input card")] ProcessVariable inputCard (9)
   , ProcessVariable outputCard (10)
  )
  {


   return ExecResultEnum.Done; (11)
  }
 }
}
1 Подключение системных библиотек.
2 Подключение библиотек СУБП.
3 Подключение дополнительных пространств имён.
4 Стандартная функция, которая будет вызвана подсистемой СУБП.
5 Текущий процесс.
6 Описание состояния функции в процессе.
7 Сессия текущего процесса.
8 Шлюз к Docsvision текущего процесса.
9 Переменная текущего БП с именем "Input card", т.к. присутствует атрибут VariableName.
10 Переменная текущего БП с именем "outputCard".
11 Выполнение операций, предусмотренных бизнес-логикой.

В приведенном примере метод Execute принимает несколько параметров, два из которых (inputCard, outputCard) будут получены их переменных процесса. Переменные процесса будут получены по схеме приведенной выше.

Сам метод Execute будет вызван при запуске функции, в которой он определён. После выполнения операций, предусмотренных бизнес-логикой, метод должен вернуть результат своей работы, например, ExecResultEnum.Done — "Функция успешно выполнилась". Параметр passInfo используется для передачи в метод контекста выполнения (см. описание типа PassState) функции. При повторном вызове функции в метод будут переданы новые данные.