пятница, 10 июля 2009 г.

Запуск одного бизнес-процесса из другого при помощи сценария

Проще, конечно, воспользоваться ф-цией "Подпроцесс", но если очень нужно запустить при помощи сценария, то можно воспользоваться объектом DocsVision.Workflow.Objects.Library (из DocsVision.Workflow.Runtime).

У данного объекта есть метод CreateProcess:

Public Function CreateProcess(ByVal Template As DocsVision.Workflow.Objects.Process) As DocsVision.Workflow.Objects.Process


На вход функция принимает шаблон процесса, а на выходе возвращает экземпляр.
У экземпляра нужно вызвать метод Start:

Public Sub Start(ByVal AccountName As String, ByVal Library As DocsVision.Workflow.Objects.Dictionary)

Да, и в конструкторе Library нужно передать сессию, и два параметра 1 и 1 - это размер пула шлюзов и функций.

Public Sub New(ByVal session As UserSession, ByVal SessionPoolSize As Integer, ByVal GatePoolSize As Integer)

1 комментарий:

  1. Михаил, добрый день. Тема действительно актуальная и в ней есть смысл, так как не всегда блок "подпроцесс" уместен. В моем случае процессы на одном сервере должны запускаться из бизнес-процессов, работающих на других серверах...
    Попытался разобраться с предложенным объектом и функциями и вот что получилось:
    ==========
    SessionManager oSessionManager = new SessionManager();
    oSessionManager.ConnectAuth("http://ИмяСервера/DocsVision/StorageServer/StorageServerService.asmx", ИмяБазы, Логин, Пароль, 600,false);
    UserSession oMainServerSession = oSessionManager.CreateSession();

    Library oMSLibrary = new Library(oMainServerSession,10,10);
    Dictionary oMSDictionary = oMSLibrary.Dictionary;
    Guid oProcessGuid = new Guid(oProcTemplateID);
    Process oTemplProc = (Process)oMSLibrary.GetProcess(oProcessGuid);
    oTemplProc.Start("домен\\логин",oMSDictionary);
    ==========
    но при выполнении данного кусочка кода, процесс падает с ошибкой:

    ==========
    Не удалось скомпилировать сценарий. Код ошибки: 0. Описание ошибки: Аргумент '1': преобразование типа из 'DocsVision.Platform.ObjectManager.UserSession [c:\WINDOWS\assembly\GAC_MSIL\DocsVision.ObjectManager.Interop\4.1.0.0__7148afe997f90519\DocsVision.ObjectManager.Interop.dll]' в 'DocsVision.Platform.ObjectManager.UserSession [c:\WINDOWS\assembly\GAC_MSIL\DocsVision.Platform.ObjectManager\4.1.0.0__7148afe997f90519\DocsVision.Platform.ObjectManager.dll]' невозможно
    ==========

    Не подскажите в чем может быть проблема?
    Удалось, конечно, обойти эту проблему другим способом, но хотелось бы понять почему не получается предложенным способом...

    Обходной способ:
    ==========
    SessionManager oSessionManager = new SessionManager();
    oSessionManager.ConnectAuth("http://Имя_Сервера/DocsVision/StorageServer/StorageServerService.asmx", Имя_Базы, Логин, Пароль, 600,false);
    UserSession oMainServerSession = oSessionManager.CreateSession();

    CardData oProcTemplateCardData = oMainServerSession.CardManager.get_CardData(ИД_Шаблона_Процесса);
    CardData oProcCardData = oProcTemplateCardData.Copy();
    oProcCardData.IsTemplate = false;
    SectionData oProcSection = oProcCardData.Sections["{79F5B1F6-6BD0-499B-9093-232989BDCC6E}"];
    oProcSection.FindRow("@Name=\"Параметр\"").set_Value("Value",Значение);


    WorkflowManagerClass oWFManager = (WorkflowManagerClass)oMainServerSession.WorkflowManager;
    DocsVision.Platform.ObjectManager.ProcessInfo oMSProcess = oWFManager.GetProcess(oProcCardData.ID);
    oMSProcess.Start();
    ==========

    ОтветитьУдалить