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

Сложный

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

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

Доступ к объектам Creatio предоставляет веб-сервис ProcessEngineService.svc.

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

Функциональность сервиса ProcessEngineService.svc реализована в классе Terrasoft.Core.Service.Model.ProcessEngineService. Основные методы сервиса ProcessEngineService.svc:

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

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

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

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

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

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

Чтобы запустить бизнес-процесс из front-end части, используйте метод 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 предоставляет набор перегрузок метода Execute() для решения пользовательских задач. Интерфейс IProcessExecutor описан в Библиотеке .NET классов.

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

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

Способы запуска бизнес-процесса без передачи и получения параметров
Способ
Метод
Параметры метода
По названию схемы бизнес-процесса
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> класса Terrasoft.Core.Process.ProcessDescriptor. Класс ProcessDescriptor описан в Библиотеке .NET классов.

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

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

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

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

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

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

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлен бизнес-процесс.
  2. Перейдите в дизайнер процессов.
  3. Заполните свойства бизнес-процесса:

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

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

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

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

    Значения параметров бизнес-процесса, которые необходимо заполнить, представлены в таблице ниже.

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

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

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

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

      ScriptTaskAddContact
      /* Создает экземпляр схемы объекта [Contact]. */
      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;
      
  6. Нажмите на кнопку Сохранить (Save) на панели инструментов дизайнера процессов.

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

Бизнес-процесс, который формирует перечень всех контактов, также содержит один элемент Задание-сценарий (ScriptTask).

Чтобы создать процесс чтения всех контактов:

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлен бизнес-процесс.
  2. Перейдите в дизайнер процессов.
  3. Заполните свойства бизнес-процесса:

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

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

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

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

    • Заголовок (Title) — "Contact List".
    • Код (Code) — "ContactList".
    • Тип данных (Data type) — "Строка неограниченной длины" ("Unlimited length text").
    scr_get_contacts_param.png

    Параметр возвращает перечень всех контактов приложения в виде JSON-объекта.

  5. Добавьте элемент Задание-сценарий (ScriptTask).

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

      • Название (Name) — "Get all contacts".
      • Код (Code) — "ScriptTaskGetAllContacts".
    2. Реализуйте логику чтения контактов.

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

      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;
      
  6. Нажмите на кнопку Сохранить (Save) на панели инструментов дизайнера процессов.

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

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

    1. Запустите процесс создания нового контакта. Для этого в строку навигации браузера введите URL, который приведен ниже.

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

      В результате в приложении будет добавлен новый контакт.

      scr_add_contact_result01.png

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

    2. Запустите процесс чтения всех контактов. Для этого в строку навигации браузера введите URL, который приведен ниже.

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

      В результате в окне браузера отображается JSON-объект, который содержит коллекцию контактов.

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

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

    1. Выполните аутентификацию. Для этого используйте сервис аутентификации AuthService.svc. Используйте пример, который доступен в статье Реализовать аутентификацию на C#.
    2. В исходный код класса 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. В исходный код класса Program добавьте метод GET для выполнения запуска бизнес-процесса чтения вскх контактов Creatio.

      Метод 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
Запустить процесс из клиентского модуля
Средний

Пример. На страницу контрагента и страницу раздела Контрагенты (Accounts) добавить пользовательское действие Назначить встречу (Schedule a meeting), которое запускает пользовательский бизнес-процесс Проведение встречи (Holding a meeting). Действие активно при наличии основного контакта для выбранного контрагента (т. е. заполнено поле Основной контакт (Primary contact) страницы контрагента). В качестве параметра бизнес-процесса указать основной контакт контрагента.

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

  1. Создайте бизнес-процесс Проведение встречи (Conducting a meeting). Для этого реализуйте пример, который приведен в статье Отправить email-сообщение при помощи процесса документации по настройке процессов.
  2. Добавьте параметр бизнес-процесса.

    Заполните значения параметра бизнес-процесса.

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

    scr_add_task_parameter.png

2. Реализовать пользовательское действие страницы контрагента 

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

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

      • Код (Code) — "CallProcessCaption".
      • Значение (Value) — "Назначить встречу" ("Schedule a meeting").
    3. Для добавления локализуемой строки нажмите Добавить (Add).
  3. Реализуйте логику работы пункта меню.

    1. В качестве зависимости подключите модуль ProcessModuleUtilities.
    2. В свойстве methods реализуйте методы:

      • callCustomProcess() — метод-обработчик действия. Реализует метод executeProcess() модуля ProcessModuleUtilities, в который в качестве параметра передаются имя созданного бизнес-процесса и объект с проинициализированными входящими параметрами для процесса.
      • isAccountPrimaryContactSet() — проверяет наличие у контрагента основного контакта.
      • getActions() — переопределенный базовый метод. Возвращает коллекцию действий замещающей страницы.

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

    AccountPageV2
    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);
                }
            }
        };
    });
    
  4. На панели инструментов дизайнера модуля нажмите Сохранить (Save).

3. Реализовать пользовательское действие страницы раздела 

  1. Создать схему замещающей модели представления страницы раздела. Для этого воспользуйтесь инструкцией, которая приведена в статье Добавить действие на страницу записи.
  2. Добавьте локализуемую строку с текстом пункта меню, который планируется добавить. Для этого выполните шаг 2 алгоритма создания схемы замещающей модели представления страницы контрагента.
  3. Реализуйте логику работы пункта меню. Для этого в свойстве 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;
                }
            }
        };
    });
    
  4. На панели инструментов дизайнера модуля нажмите Сохранить (Save).

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

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

  1. Очистите кэш браузера.
  2. Обновите страницу раздела Контрагенты (Accounts).

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

scr_result01.png

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

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

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

1. Реализовать пользовательский бизнес-процесс Результирующие параметры 

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

  3. Заполните свойства бизнес-процесса.

    • Заголовок (Title) — "Результирующие параметры" ("Result parameters").
    • Код (Code) — "UsrParametersProcess".

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

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

    Значения параметров бизнес-процесса, которые необходимо заполнить, представлены в таблице ниже.

    Значения параметров бизнес-процесса
    Заголовок
    (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. В качестве значения колонки укажите значение входящего параметра "Основной контакт" ("Primary contact").
  6. Добавьте значения исходящих параметров.

    1. На панели свойств бизнес-процесса перейдите на вкладку Параметры (Parameters).
    2. Для параметра Должность (Full job title) в поле Значение (Value) укажите "[#Read data.First item of resulting collection.Full job title#]".
    3. Для параметра Возраст контакта (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).
  5. Реализуйте логику работы пункта меню.

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

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

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

    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",
                        /* Привязывает свойство видимости пункта меню к значению, которое возвращает метод isAccountPrimaryContactSet(). */
                        "Visible": { bindTo: "isAccountPrimaryContactSet" }
                    }));
                    return actionMenuItems;
                },
                /* Метод-обработчик действия. Запускает выполнение бизнес-процесса и в информационном окне отображает значения результирующих параметров. */
                callCustomProcess: function() {
                    /* Получает идентификатор основного контакта контрагента. */
                    var contactParameter = this.get("PrimaryContact");
                    /* Создает объект класса Terrasoft.RunProcessRequest. */
                    const runProcessRequest = Ext.create("Terrasoft.RunProcessRequest", {
                        /* Код схемы процесса. */
                        "schemaName": "UsrParametersProcess",
                        /* Уникальный идентификатор схемы процесса. */
                        "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);
                }
            }
        };
    });
    
  6. На панели инструментов дизайнера модуля нажмите Сохранить (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).

В результате выбора действия Получить параметры (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

/* Тело ответа. */
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
    "[
        {\"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\"},
		...
		{},
    ]"
</string>

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

GET required

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

Creatio_application_address required

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

ServiceModel required

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

ProcessEngineService.svc required

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

methodName required

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

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

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

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

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

ResultParameterName optional

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

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

resultParameterName optional

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

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

inputParameter optional

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

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

inputParameterValue optional

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

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

ProcessElementUID optional

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

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

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

ForceUseSession true required

Принудительное использование существующей сессии.

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 запросов.