Сервис запуска бизнес-процессов

PDF
Сложный

Одной из задач интеграции внешнего приложения с Creatio является запуск бизнес-процессов. С этой целью в сервисной модели Creatio реализован веб-сервис ProcessEngineService.svc. Назначение ProcessEngineService.svc — запуск бизнес-процессов.

Запустить бизнес-процесс из внешнего приложения 

Адрес сервиса ProcessEngineService.svc
https://mycreatio.com/0/ServiceModel/ProcessEngineService.svc

Запуск бизнес-процессов в Creatio реализован в классе Terrasoft.Core.Service.Model.ProcessEngineService. Основные методы сервиса  ProcessEngineService.svc:

  • Execute() — запускает бизнес-процесс. Позволяет передать набор входящих параметров бизнес-процесса и вернуть результат его выполнения.
  • ExecProcElByUId() — запускает отдельный элемент бизнес-процесса. Запускать на выполнение можно только элемент выполняющегося процесса.

На заметку. Полный перечень методов веб-сервиса доступен в библиотеке .NET классов.

Запустить бизнес-процесс из front-end части  

Способы запуска бизнес-процесса из front-end части:

  • С помощью метода executeProcess() модуля ProcessModuleUtilities.
  • С помощью метода execute() класса Terrasoft.RunProcessRequest.

Запустить бизнес-процесс с помощью метода executeProcess()

Для запуска бизнес-процесса из схемы клиентского модуля используется модуль ProcessModuleUtilities пакета NUI. Этот модуль предоставляет удобный интерфейс для выполнения запросов к сервису ProcessEngineService.svc.

Чтобы запустить бизнес-процесс из схемы клиентского модуля:

  1. В модуль страницы, из которой вызывается сервис, в качестве зависимости подключите модуль ProcessModuleUtilities.
  2. Вызовите метод executeProcess(args) модуля ProcessModuleUtilities. В качестве параметра укажите объект args.

    Свойства объекта args:

    • sysProcessName — имя вызываемого процесса (необязательное свойство, если указано свойство свойство sysProcessId).
    • sysProcessId — уникальный идентификатор вызываемого процесса (необязательное свойство, если указано свойство sysProcessName).
    • parameters — объект, свойствами которого являются входящие параметры вызываемого процесса.

Запустить бизнес-процесс с помощью метода execute()

Чтобы запустить бизнес-процесс из схемы клиентского модуля:

  1. Создайте класс RunProcessRequest. В этом классе укажите свойства запускаемого процесса и необходимые результирующие параметры.

    • schemaName — имя вызываемого процесса (поле Код (Code) дизайнера процессов)​​​​​​.
    • schemaUId — уникальный идентификатор вызываемого процесса.
    • parameterValues — объект, свойствами которого являются входящие параметры вызываемого процесса.
    • resultParameterNames — массив параметров, значения которых необходимо получить при завершении процесса.
  2. Вызовите метод execute() класса RunProcessRequest.

Запустить бизнес-процесс из back-end части 

Чтобы запустить бизнес-процесс из back-end части вызовите метод Execute() интерфейса Terrasoft.Core.Process.IProcessExecutor. Интерфейс IProcessExecutor описан в библиотеке .NET классов.

Интерфейс IProcessExecutor предоставляет набор перегрузок метода Execute() для решения пользовательских задач.

Запустить бизнес-процесс без параметров

Способы запуска бизнес-процесса без передачи и получения параметров:

  • По названию схемы бизнес-процесса. Для этого используйте метод Execute(string processSchemaName), где processSchemaName — название схемы бизнес-процесса.
  • По уникальному идентификатору схемы бизнес-процесса. Для этого используйте метод Execute(Guid processSchemaUId), где processSchemaUId — уникальный идентификатор схемы бизнес-процесса.
Пример запуска бизнес-процесса по названию схемы бизнес-процесса
UserConnection userConnection = Get<UserConnection>("UserConnection");
IProcessEngine processEngine = userConnection.ProcessEngine;
IProcessExecutor processExecutor = processEngine.ProcessExecutor;
processExecutor.Execute("UsrProcess2Custom1");
return true;

Запустить бизнес-процесс с передачей входящих параметров

Способы запуска бизнес-процесса с передачей входящих параметров:

  • По названию схемы бизнес-процесса. Для этого используйте метод Execute(string processSchemaName, IReadOnlyDictionary<string, string> parameterValues), где processSchemaName — название схемы бизнес-процесса, а parameterValues — коллекция входящих параметров типа “ключ-значение”. В коллекции параметров ключ — имя параметра в бизнес-процессе, значение — значение параметра, которое приведено к строковому типу.
  • По уникальному идентификатору схемы бизнес-процесса. Для этого используйте метод Execute(Guid processSchemaUId, IReadOnlyDictionary<string, string> parameterValues), где processSchemaUId — уникальный идентификатор схемы бизнес-процесса, а parameterValues — коллекция входящих параметров типа “ключ-значение”. 

Примеры запуска бизнес-процесса представлены ниже.

Передача целочисленного значения параметра
Передача значения параметра типа коллекция значений
Передача значения параметра типа коллекция объектов с атрибутами
UserConnection userConnection = Get<UserConnection>("UserConnection");
IProcessEngine processEngine = userConnection.ProcessEngine;
IProcessExecutor processExecutor = processEngine.ProcessExecutor;
var nameValues = new Dictionary<string, string>();
int parameter1Value = 100;
nameValues["parameter1"] = parameter1Value.ToString();
processExecutor.Execute("UsrProcess3Custom1", nameValues);
return true;
UserConnection userConnection = Get<UserConnection>("UserConnection"); 
IProcessEngine processEngine = userConnection.ProcessEngine; IProcessExecutor processExecutor = processEngine.ProcessExecutor;
ObjectList<int> values = ObjectList.Create(1, 2, 3, 4);
string serializedValue = BaseSerializableObjectUtilities.SerializeToJson(values);
var parameterNameValues = new Dictionary<string, string>();
parameterNameValues["InputValueList"] = serializedValue;
processExecutor.Execute("ProcessRunsFromScriptTask", parameterNameValues);
return true;
UserConnection userConnection = Get<UserConnection>("UserConnection"); 
IProcessEngine processEngine = userConnection.ProcessEngine; IProcessExecutor processExecutor = processEngine.ProcessExecutor;
/* Создание коллекции объектов. */
var list = new CompositeObjectList<CompositeObject>();
var item1 = new CompositeObject();
/* Объект параметра процесса содержит поля [Id] и [Name]. */
item1["Id"] = new Guid("94cc536a-71a7-4bfb-87ca-13f53b23c28e");
item1["Name"] = "Name1";
list.Add(item1);
var item2 = new CompositeObject();
item2["Id"] = new Guid("e694d36e-1727-4276-9fbf-b9aa193e4f44");
item2["Name"] = "Name2";
list.Add(item2);
string serializedValue = BaseSerializableObjectUtilities.SerializeToJson(list);
var parameterNameValues = new Dictionary<string, string>();
parameterNameValues["InputObjectList"] = serializedValue;
processExecutor.Execute("ProcessRunsFromScriptTask", parameterNameValues);
return true;

Запустить бизнес-процесс с получением одного исходящего параметра

Способы запуска бизнес-процесса с получением одного исходящего параметра:

  • По названию схемы бизнес-процесса. Для этого используйте метод Execute<TResult>(string processSchemaName, string resultParameterName), где processSchemaName — название схемы бизнес-процесса, а resultParameterName — название исходящего параметра.
  • По названию схемы бизнес-процесса с передачей входящих параметров. Для этого используйте метод Execute<TResult>(string processSchemaName, string resultParameterName, IReadOnlyDictionary<string, string> parameterValues), где processSchemaName — название схемы бизнес-процесса,  resultParameterName — название исходящего параметра, а parameterValues — коллекция входящих параметров типа “ключ-значение”.
  • По уникальному идентификатору схемы бизнес-процесса. Для этого используйте метод Execute<TResult>(Guid processSchemaUId, string resultParameterName), где processSchemaUId — уникальный идентификатор схемы бизнес-процесса, а resultParameterName — название исходящего параметра.
  • По уникальному идентификатору схемы бизнес-процесса с передачей входящих параметров. Для этого используйте метод Execute<TResult>(Guid processSchemaUId, string resultParameterName, IReadOnlyDictionary<string, string> parameterValues), где processSchemaUId — уникальный идентификатор схемы бизнес-процесса, resultParameterName — название исходящего параметра, а parameterValues — коллекция входящих параметров типа “ключ-значение”.
Пример запуска бизнес-процесса c получением одного исходящего параметра
UserConnection userConnection = GetUserConnection();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
/* Список входящих параметров. */ 
var inputParameters = new Dictionary<string, string> {
    ["ProcessSchemaParameter1"] = "Value1",
    ["ProcessSchemaParameter2"] = "Value2"
};
string processSchemaName = "processSchemaName";
Guid processSchemaUId = Guid.Parse("00000000-0000-0000-0000-000000000000");
/* Запускает процесс по имени схемы и возвращает текстовое значение  параметра [ProcessSchemaParameter3]. */
string resultValue = processExecutor.Execute<string>(processSchemaName, "ProcessSchemaParameter3");
/* Запускает процесс по идентификатору схемы и возвращает текстовое значение  параметра [ProcessSchemaParameter3]. */
string resultValue = processExecutor.Execute<string>(processSchemaUId, "ProcessSchemaParameter3");
  
/* Запускает процесс по имени схемы c передачей параметров и возвращает текстовое значение  параметра [ProcessSchemaParameter3]. */
string resultValue = processExecutor.Execute<string>(processSchemaName, "ProcessSchemaParameter3", inputParameters);
/* Запускает процесс по идентификатору схемы c передачей параметров и возвращает текстовое значение  параметра [ProcessSchemaParameter3]. */
string resultValue = processExecutor.Execute<string>(processSchemaUId, "ProcessSchemaParameter3", inputParameters);

Запустить бизнес-процесс с получением нескольких исходящих параметров

Способы запуска бизнес-процесса с получением нескольких исходящих параметров:

  • По названию схемы бизнес-процесса. Для этого используйте метод Execute(string processSchemaName, IEnumerable<string> resultParameterNames), где processSchemaName — название схемы бизнес-процесса, а resultParameterNames — коллекция исходящих параметров.
  • По названию схемы бизнес-процесса с передачей входящих параметров. Для этого используйте метод Execute(string processSchemaName, IReadOnlyDictionary<string, string> parameterValues, IEnumerable<string> resultParameterNames), где processSchemaName — название схемы бизнес-процесса,  parameterValues — коллекция входящих параметров типа “ключ-значение”, а resultParameterNames — коллекция исходящих параметров.
  • По уникальному идентификатору схемы бизнес-процесса. Для этого используйте метод Execute(Guid processSchemaUId, IEnumerable<string> resultParameterNames), где processSchemaUId — уникальный идентификатор схемы бизнес-процесса, а resultParameterNames — коллекция исходящих параметров.
  • По уникальному идентификатору схемы бизнес-процесса с передачей входящих параметров. Для этого используйте метод Execute(Guid processSchemaUId, IReadOnlyDictionary<string, string> parameterValues, IEnumerable<string> resultParameterNames), где processSchemaUId — уникальный идентификатор схемы бизнес-процесса,  parameterValues — коллекция входящих параметров типа “ключ-значение”, а resultParameterNames — коллекция исходящих параметров..
Пример запуска бизнес-процесса c получением исходящих параметров
UserConnection userConnection = GetUserConnection();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
/* Коллекция входящих параметров.*/
var inputParameters = new Dictionary<string, string> {
    ["ProcessSchemaParameter1"] = "Value1",
    ["ProcessSchemaParameter2"] = "Value2"
};
/* Коллекция исходящих параметров.*/
var resultParameterNames = new string[] {
    "ProcessSchemaParameter3",
    "ProcessSchemaParameter4"
};
string processSchemaName = "processSchemaName";
Guid processSchemaUId = Guid.Parse("00000000-0000-0000-0000-000000000000");
  
/* Запускает процесс по имени схемы с получением исходящих параметров.*/
ProcessDescriptor processDescriptor = processExecutor.Execute(processSchemaName, resultParameterNames);
/* Запускает процесс по идентификатору схемы с получением исходящих параметров.*/
ProcessDescriptor processDescriptor = processExecutor.Execute(processSchemaUId, resultParameterNames);
  
/* Запускает процесс по имени схемы с передачей входящих и получением исходящих параметров.*/
ProcessDescriptor processDescriptor = processExecutor.Execute(processSchemaName, inputParameters, resultParameterNames);
/* Запускает процесс по идентификатору схемы с передачей входящих и получением исходящих параметров.*/
ProcessDescriptor processDescriptor = processExecutor.Execute(processSchemaUId, inputParameters, resultParameterNames);

Запуск бизнес-процесса с получением коллекции исходящих параметров возвращает объект типа ProcessDescriptor. Чтобы получить значения исходящих параметров, используйте свойство ResultParameterValues типа IReadOnlyDictionary<string, object> класса ProcessDescriptor.

Пример получения значения исходящих параметров
ProcessDescriptor processDescriptor = processExecutor.Execute("processSchemaName", inputParameters, resultParameterNames);
object parameter3Value = processDescriptor.ResultParameterValues["ProcessSchemaParameter3"];
if (processDescriptor.ResultParameterValues.TryGetValue("ProcessSchemaParameter4", out object parameter4value)) {
    Console.Log(parameter4value);
}

Важно. Независимо от настроек, бизнес-процесс с получением исходящих параметров всегда запускается не в фоновом режиме.

Запустить бизнес-процесс через веб-сервис
Сложный

Пример. Используя веб-сервис ProcessEngineService.svc, из строки навигации браузера или из консольного приложения запустить демонстрационные бизнес-процессы создания и считывания контактов Creatio, .

1. Создать процесс добавления контакта 

На заметку. Особенности и лучшие практики создания бизнес-процессов в Creatio подробно описаны в документации по настройке процессов.

  1. Создайте пользовательский пакет и установите его в качестве текущего.
  2. Перейдите в дизайнер процессов.
  3. Заполните значения свойств бизнес-процесса:

    • Название (Name) — "Add New External Contact".
    • Код (Code) — "UsrAddNewExternalContact".

    Для остальных свойств оставьте значения по умолчанию.

    scr_add_contact_bp.png
  4. Добавьте параметры бизнес-процесса.

    С помощью параметров в процесс передаются реквизиты добавляемого контакта — имя и телефон.

    Значения свойств параметра ContactName:

    • Заголовок (Title) — "Имя контакта" ("Contact Name").
    • Код (Code) — "ContactName".
    • Тип данных (Data type) — "Текст (50 символов)" ("Text (50 characters)").

    Значения свойств параметра ContactPhone:

    • Заголовок (Title) — "Телефон контакта" ("Contact Phone").
    • Код (Code) — "ContactPhone".
    • Тип данных (Data type) — "Текст (50 символов)" ("Text (50 characters)").
    scr_add_contact_params.png
  5. Добавьте элемент Задание-сценарий (ScriptTask).

    Значения свойств элемента:

    • Название (Name) — "Add contact".
    • Код (Code) — "ScriptTaskAddContact".
  6. Реализуйте логику добавления нового контакта.

    Чтобы редактировать код сценария, дважды щелкните по элементу на диаграмме. На панели настройки элемента откроется окно для ввода и редактирования программного кода.

    ScriptTaskAddContact
    /* Создание экземпляра схемы объекта [Контакт]. */
    var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
    /* Создание экземпляра нового объекта. */
    var entity = schema.CreateEntity(UserConnection);
    /* Установка значений по умолчанию для колонок объекта. */
    entity.SetDefColumnValues();
    string contactName = Get<string>("ContactName");
    string contactPhone = Get<string>("ContactPhone");
    /* Установка значения колонки [Name] из параметра процесса. */
    entity.SetColumnValue("Name", contactName);
    /* Установка значения колонки [Phone] из параметра процесса. */
    entity.SetColumnValue("Phone", contactPhone);
    /* Сохранение нового контакта. */
    entity.Save();
    return true;
    
  7. После внесения изменений сохраните бизнес-процесс, нажав на кнопку Сохранить (Save) на панели инструментов дизайнера процессов.

2. Создать процесс чтения контактов 

Бизнес-процесс, формирующий список всех контактов, также содержит один элемент Задание-сценарий (ScriptTask), в котором реализуется необходимая логика.

Значения свойств бизнес-процесса:

  • Название (Name) — "Get All Contacts".
  • Код (Code) — "UsrGetAllContacts".

Для остальных свойств оставьте значения по умолчанию.

scr_get_contacts_bp.png

Процесс UsrGetAllContacts содержит единственный параметр ContactList, через который процесс будет возвращать список всех контактов системы в виде JSON-объекта. Тип параметра — строка неограниченной длины.

scr_get_contacts_param.png

Логику выборки контактов реализуйте в элементе процесса Задание-сценарий (ScriptTask).

Значения свойств элемента:

  • Название (Name) — "Get all contacts".
  • Код (Code) — "ScriptTaskGetAllContacts".
ScriptTaskGetAllContacts
/* Создание экземпляра EntitySchemaQuery. */
EntitySchemaQuery query = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
/* Признак для обязательного выбора первичной колонки [Id]. */
query.PrimaryQueryColumn.IsAlwaysSelect = true;
/* Добавление в запрос колонок. */
query.AddColumn("Name");
query.AddColumn("Phone");
/* Получение результирующей коллекции. */
var entities = query.GetEntityCollection(UserConnection);
/* Формирование списка контактов для сериализации в JSON. */
List<object> contacts = new List<object>();
foreach (var item in entities)
{
    var contact = new
    {
        Id = item.GetTypedColumnValue<Guid>("Id"),
        Name = item.GetTypedColumnValue<string>("Name"),
        Phone = item.GetTypedColumnValue<string>("Phone")
    };
    contacts.Add(contact);
}
/* Сохранение сериализованной в JSON коллекции контактов в параметр ContactList. */
string contactList = JsonConvert.SerializeObject(contacts);
Set<string>("ContactList", contactList);
return true;

После внесения изменений сохраните и опубликуйте бизнес-процесс.

3. Запустить выполнение бизнес-процессов из строки навигации браузера 

Поскольку вызов метода сервиса возможен с помощью GET-запроса, то для выполнения запуска бизнес-процесса можно использовать браузер.

Для запуска процесса создания нового контакта в строку навигации браузера введите URL:

URL для запуска процесса создания нового контакта
http[s]://[Адрес приложения Creatio]/0/ServiceModel/ProcessEngineService.svc/UsrAddNewExternalContact/Execute?ContactName=John Johanson&ContactPhone=1 111 111 1111

После перехода по указанному URL, в приложении будет добавлен новый контакт.

scr_add_contact_result01.png

Важно. Новый контакт будет создан при каждом успешном запросе к сервису. Если выполнить несколько запросов с одинаковыми параметрами, будет создано несколько контактов-дублей.

Для запуска процесса чтения всех контактов в строку навигации браузера введите URL:

URL для запуска процесса чтения всех контактов
http[s]://[Адрес приложения Creatio]/0/ServiceModel/ProcessEngineService.svc/UsrGetAllContacts/Execute?ResultParameterName=ContactList

После выполнения перехода по указанному URL, в окне браузера будет отображен JSON-объект, содержащий коллекцию контактов.

scr_get_contacts_result01.png

4. Запустить выполнение бизнес-процессов из консольного приложения 

Полностью исходный код консольного пользовательского приложения, предназначенного для запуска бизнес-процессов с помощью сервиса ProcessEngineService.svc, доступен на GitHub.

Чтобы запустить выполнение бизнес-процессов из консольного приложения:

  1. Выполните аутентификацию. Для этого предназначен сервис аутентификации AuthService.svc. Консольное приложение для выполнения аутентификации можно взять за основу для примера, приведенного ниже.
  2. Для формирования запросов к сервису ProcessEngineService.svc в исходный код класса Program добавьте строковое поле, содержащее базовый URL сервиса.
    URL для формирования запросов к сервису ProcessEngineService.svc
    private const string processServiceUri = baseUri + @"/0/ServiceModel/ProcessEngineService.svc/";
    
  3. Для выполнения запуска бизнес-процесса добавления контакта в исходный код класса Program добавьте метод GET.
    Метод GET для выполнения запуска бизнес-процесса
    public static void AddContact(string contactName, string contactPhone)
    {
        /* Формирование URL запроса. */
        string requestString = string.Format(processServiceUri +
                "UsrAddNewExternalContact/Execute?ContactName={0}&ContactPhone={1}",
                                 contactName, contactPhone);
        /* Создание Http-запроса. */
        HttpWebRequest request = HttpWebRequest.Create(requestString) as HttpWebRequest;
        request.Method = "GET";
        request.CookieContainer = AuthCookie;
        /* Выполнение запроса и анализ Http-ответа. */
        using (var response = request.GetResponse())
        {
            /* Поскольку сервис вернет пустую строку, то можно вывести свойства http-ответа. */
            Console.WriteLine(response.ContentLength);
            Console.WriteLine(response.Headers.Count);
        }
    }
    
  4. Добавьте метод запуска процесса чтения контактов.
    Метод GET для выполнения запуска бизнес-процесса
    public static void GetAllContacts()
    {
        /* Формирование URL запроса. */
        string requestString = processServiceUri +
                           "UsrGetAllContacts/Execute?ResultParameterName=ContactList";
        HttpWebRequest request = HttpWebRequest.Create(requestString) as HttpWebRequest;
        request.Method = "GET";
        request.CookieContainer = AuthCookie;
        /* Создание Http-запроса. */
        using (var response = request.GetResponse())
        {
            /* Выполнение запроса и вывод результата. */
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                string responseText = reader.ReadToEnd();
                Console.WriteLine(responseText);
            }
        }
    }
    
  5. Вызов добавленных методов выполните в главном методе программы после успешной аутентификации.
    Вызов методов
    static void Main(string[] args)
    {
        if (!TryLogin("Supervisor", "Supervisor"))
        {
            Console.WriteLine("Wrong login or password. Application will be terminated.");
        }
        else
        {
            try
            {
                /* Вызов методов запуска бизнес-процессов. */
                AddContact("John Johanson", "+1 111 111 1111");
                GetAllContacts();
            }
            catch (Exception)
            {
                /* Обработка исключений. */
                throw;
            }
        };
        Console.WriteLine("Press ENTER to exit...");
        Console.ReadLine();
    }
    
Результат выполнения пользовательского приложения
scr_result.png
Запустить процесс из клиентского модуля
Средний

Чтобы запустить бизнес-процесс из JavaScript-кода клиентской схемы, необходимо:

  1. В модуль страницы, из которой вызывается сервис, подключить в качестве зависимости модуль ProcessModuleUtilities. Этот модуль предоставляет удобный интерфейс для выполнения запросов к сервису ProcessEngineService.svc.
  2. Вызвать метод executeProcess(args) модуля ProcessModuleUtilities, передав ему в качестве параметра объект args с такими свойствами:
Свойства объекта args
Свойство Описание
sysProcessName Имя вызываемого процесса (необязательное свойство в случае, если определено свойство sysProcessId).
sysProcessId Уникальный идентификатор вызываемого процесса (необязательное свойство в случае, если определено свойство sysProcessName).
parameters

Объект, свойствами которого являются входящие параметры вызываемого процесса.

Пример. На страницу контрагента добавить действие, по которому будет запускаться бизнес-процесс "Проведение встречи". В бизнес-процесс передать в качестве параметра основной контакт контрагента.

1. Создать и настроить пользовательский бизнес-процесс "Проведение встречи" 

  1. Создайте бизнес-процесс.

В примере используется бизнес-процесс "Проведение встречи", создание которого детально описано в разделе "Как работать с email" документации по настройке процессов .

scr_process_diagram.png
  1. Добавьте в бизнес-процесс  параметр.

Заполните свойства параметра:

  • Заголовок (Title) — "Meeting contact".
  • Код (Code) — "ProcessSchemaContactParameter".
  • Тип данных (Data type) — "Уникальный идентификатор" ("Unique identifier").
scr_process_parameter.png
  1. В свойствах первого действия процесса Позвонить клиенту (Call customer) заполните поле Контакт (Contact) входящим параметром процесса.
scr_add_task_parameter.png

2. Создать замещающую страницу контрагента и добавить на нее действие 

Добавление действия на страницу записи подробно описано в статье Добавить действие на страницу записи.

В схему замещающего модуля страницы записи и схему раздела контрагента добавьте локализуемую строку CallProcessCaption с заголовком действия, например, "Назначить встречу" ("Schedule a meeting").

Дополнительно в объявлении модуля страницы записи подключите в качестве зависимости модуль ProcessModuleUtilities.

Исходные коды схемы раздела и страницы записи раздела Контрагенты (Accounts) приведены ниже.

3. Добавить необходимые методы в схемы 

Для запуска процесса воспользуйтесь методом executeProcess() модуля ProcessModuleUtilities, в который в качестве параметра необходимо передать объект со следующими свойствами:

  • имя созданного бизнес-процесса,
  • объект с проинициализированными входящими параметрами для процесса.

В исходном коде, приведенном ниже, это реализовано в методе callCustomProcess(). Также реализованы методы проверки существования основного контакта isAccountPrimaryContactSet() и добавления элементов меню действий getActions().

Исходный код замещающего модуля страницы записи:

define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
    return {
        // Название схемы объекта страницы записи.
        entitySchemaName: "Account",
        // Методы модели представления страницы записи.
        methods: {
            // Проверяет, заполнено ли поле [Основной контакт] страницы.
            isAccountPrimaryContactSet: function() {
                return this.get("PrimaryContact") ? true : false;
            },
            // Переопределение базового виртуального метода, возвращающего коллекцию действий страницы записи.
            getActions: function() {
                // Вызывается родительская реализация метода для получения
                // коллекции проинициализированных действий базовой страницы.
                var actionMenuItems = this.callParent(arguments);
                // Добавление линии-разделителя.
                actionMenuItems.addItem(this.getActionsMenuItem({
                    Type: "Terrasoft.MenuSeparator",
                    Caption: ""
                }));
                // Добавление пункта меню [Назначить встречу] в список действий страницы записи.
                actionMenuItems.addItem(this.getActionsMenuItem({
                    // Привязка заголовка пункта меню к локализуемой строке схемы.
                    "Caption": { bindTo: "Resources.Strings.CallProcessCaption" },
                    // Привязка метода-обработчика действия.
                    "Tag": "callCustomProcess",
                    // Привязка свойства видимости пункта меню к значению, которое возвращает метод isAccountPrimaryContactSet().
                    "Visible": { bindTo: "isAccountPrimaryContactSet" }
                }));
                return actionMenuItems;
            },
            // Метод-обработчик действия.
            callCustomProcess: function() {
                // Получение идентификатора основного контакта контрагента.
                var contactParameter = this.get("PrimaryContact");
                // Объект, который будет передан в качестве аргумента в метод executeProcess().
                var args = {
                    // Имя процесса, который необходимо запустить.
                    sysProcessName: "UsrCustomProcess",
                    // Объект со значением входящего параметра ContactParameter для процесса CustomProcess.
                    parameters: {
                        ProcessSchemaContactParameter: contactParameter.value
                    }
                };
                // Запуск пользовательского бизнес-процесса.
                ProcessModuleUtilities.executeProcess(args);
            }
        }
    };
});

Для корректного отображения действия в меню действий в совмещенном режиме отображения страницы с вертикальным реестром добавьте реализацию метода isAccountPrimaryContactSet() в схему раздела.

Исходный код замещающего модуля схемы раздела:

define("AccountSectionV2", [], function() {
    return {
        // Название схемы раздела.
        entitySchemaName: "Account",
        methods: {
            // Проверяет, заполнено ли поле [Основной контакт] выбранной записи.
            isAccountPrimaryContactSet: function() {
                // Определение активной записи.
                var activeRowId = this.get("ActiveRow");
                if (!activeRowId) {
                    return false;
                }
                // Получение коллекции данных списочного представления реестра раздела.
                // Получение модели выбранного контрагента по заданому значению первичной колонки.
                var selectedAccount = this.get("GridData").get(activeRowId);
                if (selectedAccount) {
                    // Получение свойства модели — наличие основного контакта.
                    var selectedPrimaryContact = selectedAccount.get("PrimaryContact");
                    // Метод возвращает true, если основной контакт установлен. Иначе возвращает false.
                    return selectedPrimaryContact ? true : false;
                }
                return false;
            }
        }
    };
});

Результат выполнения примера

После сохранения схем и обновления страницы приложения в меню действий страницы контрагента появится новое действие Назначить встречу (Schedule a meeting) . Это действие будет доступным только в случае наличия основного контакта для активной записи реестра. При выполнении действия будет запущен пользовательский бизнес-процесс "Проведение встречи" ("Holding a meeting"). При этом в параметр бизнес-процесса будет передан основной контакт контрагента.

Вызов бизнес-процесса по действию на странице записи
scr_result01.png
 Результат запуска бизнес-процесса. Передача параметра со страницы контрагента в бизнес-процесс
scr_result02.png
Запустить бизнес-процесс из клиентского модуля с получением параметров
Средний

Пример. На страницу контрагента добавить действие, по которому запускается пользовательский  бизнес-процесс Результирующие параметры (Result parameters). Действие отобразить на странице раздела Контрагенты (Accounts). Действие отображается при наличии основного контакта для выбранного контрагента (т. е. значение поля Основной контакт (Primary contact) страницы контрагента не пустое). В качестве входящего параметра бизнес-процесс получает значение основного контакта контрагента. В качестве результирующих параметров в диалоговом окне бизнес-процесс отображает должность и возраст основного контакта контрагента. 

1. Настроить пользовательский бизнес-процесс 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Бизнес-процесс (Add —> Business process).

  3. Заполните свойства схемы.

    • Код (Code) — "UsrParametersProcess".
    • Заголовок (Title) — "Результирующие параметры" ("Result parameters").
  4. Добавьте входящие и исходящие параметры бизнес-процесса.

    1. На вкладке Параметры (Parameters) панели свойств бизнес-процесса нажмите Добавить параметр (Add parameter).
    2. Заполните свойства параметров:

      Название (Title) Код (Code) Тип данных (Data type) Направление (Direction)
      Primary contact ProcessSchemaContactParameter Уникальный идентификатор (Unique identifier) Входящий (Input)
      Contact age ProcessContactAge Целое число(Integer) Исходящий (Output)
      Full job title ProcessFullJob Строка (500 символов) (Text (500 characters)) Исходящий (Output)
  5. Реализовать чтение данных.

    1. В рабочую область дизайнера процессов добавьте элемент Читать данные (Read data).

    2. Заполните свойства элемента:

      • Какой режим чтения данных использовать? (Which data read mode to use?) — выберите “Читать первую запись из выборки” (“Read the first record in the selection”).
      • Из какого объекта читать данные? (Which object to read data from?) — выберите “Контакт” (“Contact”).
      • Как отфильтровать записи? (How to filter records?) — установите фильтр по колонке Id. В качестве значения колонки Id укажите значение входящего параметра Primary contact.
  6. Добавьте значения исходящих параметров.

    • На панели свойств бизнес-процесса перейдите на вкладку Параметры (Parameters).
    • Для параметра Full job title в поле Значение (Value) укажите “[#Read data.First item of resulting collection.Full job title#]”.
    • Для параметра Contact age в поле Значение (Value) укажите “[#Read data.First item of resulting collection.Age#]”.
  7. На панели инструментов дизайнера бизнес-процессов нажмите Сохранить (Save).

2. Создать схему замещающей модели представления страницы контрагента 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающая модель представления (Add —> Replacing view model).

  3. Заполните свойства схемы.

    • Код (Code) — "AccountPageV2".
    • Заголовок (Title) — "Страница редактирования контрагента" ("Account edit page").
    • Родительский объект (Parent object) — выберите "AccountPageV2".
  4. Добавьте локализуемую строку с текстом пункта меню, который планируется добавить.

    1. В контекстном меню узла Локализуемые строки (Localizable strings) нажмите кнопку scr_add_button.png.
    2. Заполните свойства локализуемой строки.

      • Код (Code) — "CallProcessParametersCaption".
      • Значение (Value) — "Получить параметры" ("Recieve parameters").
    3. Для добавления локализуемой строки нажмите Добавить (Add).
    4. Реализуйте логику работы пункта меню.

      Для этого в свойстве methods реализуйте методы:

      Исходный код схемы замещающей модели представления страницы контрагента представлен ниже.

      AccountPageV2
      define("AccountPageV2", [], function() {
          return {
              /* Название схемы объекта страницы записи. */
              entitySchemaName: "Account",
              /* Методы модели представления страницы записи. */
              methods: {
                  /* Проверяет заполнено ли поле [Основной контакт] страницы для определения видимости пункта меню. */
                  isAccountPrimaryContactSet: function() {
                      /* Метод возвращает true, если поле [Основной контакт] содержит значение. В другом случае — false. */
                      return this.get("PrimaryContact") ? true : false;
                  },
                  /* Переопределяет базовый виртуальный метод, который возвращает коллекцию действий страницы записи. */
                  getActions: function() {
                      /* Вызывает родительскую реализацию метода для получения коллекции проинициализированных действий базовой страницы. */
                      var actionMenuItems = this.callParent(arguments);
                      /* Добавляет линию-разделитель. */
                      actionMenuItems.addItem(this.getActionsMenuItem({
                          Type: "Terrasoft.MenuSeparator",
                          Caption: ""
                      }));
                      /* Добавляет пункт меню в список действий страницы записи. */
                      actionMenuItems.addItem(this.getActionsMenuItem({
                          /* Привязывает заголовок пункта меню к локализуемой строке схемы. */
                          "Caption": { bindTo: "Resources.Strings.CallProcessParametersCaption" },
                          /* Привязывает метод-обработчик действия. */
                          "Tag": "callCustomProcess",
                          /* Привязывает свойство видимости пункта меню к значению, которое возвращает метод isRunning(). */
                          "Visible": { bindTo: "isAccountPrimaryContactSet" }
                      }));
                      return actionMenuItems;
                  },
                  /* Метод-обработчик действия. Запускает выполнение бизнес-процесса и в информационном окне отображает значения результирующих параметров. */
                  callCustomProcess: function() {
                      /* Получает идентификатор основного контакта контрагента. */
                      var contactParameter = this.get("PrimaryContact");
                      /* Создает объект класса Terrasoft.RunProcessRequest. */
                      const runProcessRequest = Ext.create("Terrasoft.RunProcessRequest", {
                          /* Код схемы процесса. */
                          "schemaName": "UsrParametersProcess",
                          /* UId схемы процесса. */
                          "schemaUId": "9ff60fa7-314e-4b9e-b9fc-57f91b8b2e21",
                          /* Входящие параметры процесса. */
                          "parameterValues": {
                              "ProcessSchemaContactParameter": contactParameter.value
                          },
                          /* Исходящие параметры процесса. */
                          "resultParameterNames": [
                              "ProcessContactAge",
                              "ProcessFullJob"
                          ]
                          });
                      /* Запускает выполнение процесса. */
                      runProcessRequest.execute(function(response) {
                          /* При успешном выполнении процесса в информационном окне отображает значения результирующих параметров. */
                          if (response.isSuccess()) {
                              var job = response.resultParameterValues["ProcessFullJob"];
                              var age = response.resultParameterValues["ProcessContactAge"];
                              Terrasoft.showInformation("Full job title: " +  job + " Age: " + age);
                          }
                      }, this);
                  }
              }
          };
      });
      
      • isAccountPrimaryContactSet() — проверяет существование основного контакта контрагента и определяет видимость добавленного пункта меню.
      • callCustomProcess() — метод-обработчик действия. Запускает выполнение бизнес-процесса и в информационном окне отображает значения результирующих параметров.
      • getActions() — переопределенный базовый метод. Возвращает коллекцию действий замещающей страницы.
  5. На панели инструментов дизайнера модуля нажмите Сохранить (Save).

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

3. Создать схему замещающей модели представления раздела 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающая модель представления (Add —> Replacing view model).

  3. Заполните свойства схемы.

    • Код (Code) — "AccountSectionV2".
    • Заголовок (Title) — "Раздел контрагенты" ("Accounts section").
    • Родительский объект (Parent object) — выберите "AccountSectionV2".
  4. Добавьте локализуемую строку с текстом пункта меню, который планируется добавить. Для этого выполните шаг 4 алгоритма создания схемы замещающей модели представления страницы заказа.
  5. Реализуйте логику работы пункта меню. Для этого в свойстве methods реализуйте метод isAccountPrimaryContactSet(), который проверяет существование основного контакта контрагента и определяет видимость добавленного пункта меню.

    Исходный код схемы замещающей модели представления страницы раздела представлен ниже.

    AccountSectionV2
    define("AccountSectionV2", [], function() {
        return {
            /* Название схемы объекта страницы раздела. */
            entitySchemaName: "Account",
            /* Методы модели представления страницы раздела. */
            methods: {
                /* Проверяет заполнено ли поле [Основной контакт] страницы для определения видимости пункта меню. */
                isAccountPrimaryContactSet: function() {
                    var activeRowId = this.get("ActiveRow");
                    if (!activeRowId) {
                        return false;
                    }
                    /* Получает модель выбранного заказа по заданному значению первичной колонки. */
                    var selectedAccount = this.get("GridData").get(activeRowId);
                    if (selectedAccount) {
                        /* Получает свойство модели — основной контакт контрагента. */
                        var selectedPrimaryContact = selectedAccount.get("PrimaryContact");
                        /* Метод возвращает true, если поле [Основной контакт] содержит значение. В другом случае — false. */
                        return selectedPrimaryContact ? true : false;
                    }
                    return false;
                }
            }
        };
    });
    
  6. На панели инструментов дизайнера модуля нажмите Сохранить (Save).

Результат выполнения примера 

Чтобы посмотреть результат выполнения примера

  1. Обновите страницу раздела Контрагенты (Accounts).
  2. Откройте страницу контрагента (например, Vertigo Systems).

    В результате в меню действий страницы контрагента отображается новое действие Получить параметры (Recieve parameters).

  3. На панели инструментов страницы контрагента в меню Действия (Actions) выберите Получить параметры (Receive parameters). При выполнении действия запущен пользовательский бизнес-процесс "Результирующие параметры" ("Result parameters").  В качестве входящего параметра бизнес-процесс получает значение основного контакта контрагента. В качестве результирующих параметров бизнес-процесс отображает должность и возраст основного контакта контрагента.

    scr_Result.png

    Действие отображается при наличии основного контакта для выбранного контрагента (т. е. значение поля Основной контакт (Primary contact) страницы контрагента не пустое). Например, для контрагента Wilson & Young без основного контакта действие не отображается.

    scr_Result2.png

    Пользовательское действие Получить параметры (Receive parameters) также отображается на странице раздела Контрагенты (Accounts) и активно для выбранного контрагента с основным контактом. 

    scr_Result3.png
Веб-сервис ProcessEngineService.svc
Сложный
/* Строка запроса. */
GET Creatio_application_address/0/ServiceModel/ProcessEngineService.svc/[processSchemaName/]methodName[?ResultParameterName=resultParameterName&inputParameter=inputParameterValue][/processElementUID]

/* Заголовки запроса. */
ForceUseSession: true
BPMCSRF: authentication_cookie_value
/* Код состояния. */
Status: code

/* Тело ответа. */

    "[
        {\"Id\":\"object1_id\",\"object1 field1\":\"object1 field_value1\",\"object1 field2\":\"object1 field_value2\"},
        {\"Id\":\"object2_id\",\"object2 field1\":\"object2 field_value1\",\"object2 field2\":\"object2 field_value2\"},
		...
		{},
    ]"

Строка запроса 

GET required

Метод запроса на запуск бизнес-процессов.

Creatio_application_address required

Адрес приложения Creatio.

ServiceModel required

Путь к сервису запуска бизнес-процессов. Неизменяемая часть запроса.

ProcessEngineService.svc required

Адрес веб-сервиса запуска бизнес-процессов. Неизменяемая часть запроса.

methodName required

Метод веб-сервиса запуска бизнес-процессов.

Основные методы:

  • Execute() — запуск бизнес-процесса. Позволяет передавать набор входящих параметров и возвращать результат выполнения веб-сервиса.
  • ExecProcElByUId() — запуск отдельного элемента бизнес-процесса. Запускать на выполнение можно только элемент выполняющегося процесса. Если элемент процесса, запускаемый методом ExecProcElByUId(), уже выполнен на момент вызова метода, то повторно такой элемент выполняться не будет.
ProcessSchemaName optional

Используется для метода Execute().

Название схемы бизнес-процесса. Название схемы бизнес-процесса можно узнать в разделе Конфигурация (Configuration).

ResultParameterName optional

Используется для метода Execute().

Переменная для кода параметра процесса. Неизменяемая часть запроса.

resultParameterName optional

Используется для метода Execute().

Код параметра процесса, который хранит результат выполнения процесса. Если этот параметр не задан, то веб-сервис запустит указанный бизнес-процесс без ожидания результата его выполнения. Если в вызываемом процессе отсутствует данный код параметра, веб-сервис вернет значение null.

inputParameter optional

Используется для метода Execute().

Переменная для кода входящих параметров бизнес-процесса. Если передается несколько входящих параметров, то они должны быть объединены символом &.

inputParameterValue optional

Используется для метода Execute().

Значения входящих параметров бизнес-процесса.

ProcessElementUID optional

Используется для метода ExecProcElByUId().

Идентификатор запускаемого элемента процесса.

Заголовки запроса 

ForceUseSession true required

Заголовок ForceUseSession отвечает за принудительное использование уже существующей сессии. Отсутствует необходимость использования в запросе к сервису аутентификации AuthService.svc.

BPMCSRF authentication_cookie_value required

Аутентификационный cookie.

Тело ответа 

[]

Коллекция объектов.

{}

Экземпляры объектов коллекции.

Id

Название поля Id.

object1_id, object2_id, ...

Идентификатор экземпляра объекта коллекции.

object1 field1, object1 field2, ..., object2 field1, object2 field2, ...

Имена полей field1, field2, ... экземпляров объектов object1, object2, ... коллекции.

object1 field_value1, object1 field_value2, ..., object2 field_value1, object2 field_value2, ...

Значения полей field1, field2, ... экземпляров объектов object1, object2, ... коллекции. Может присутствовать только для GET и POST запросов.