Добрый вечер!

столкунлся со след проблемой

я создаю новые записи в бизнес процессе след образом.

var schema = _connection.EntitySchemaManager.FindInstanceByUId(entityToMapId);
var newEntity = schema.CreateEntity(_connection);
newEntity.SetDefColumnValues();
 
newEntity.SetColumnValue(columnSchema, creatioValue);
 
newEntity.Save();

при этом я так же подписался на сигнал создания записей для той же схемы таким образом

Изображение удалено.

но этот сигнал не срабатывает при программном добавлении записей. что необходимо еще выполнить чтоб бизнесс процессы срабатывали должным образом?

Нравится

2 комментария
Лучший ответ

Добрый вечер.

 

Попробуйте вместо FindInstanceByUId использовать метод GetInstanceByName, как в примере ниже:

EntitySchema contactSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
Entity contactEntity = contactSchema.CreateEntity(UserConnection);
contactEntity.SetDefColumnValues();
contactEntity.SetColumnValue("Name", "User01");
contactEntity.Save();

Напишите, если проблему удастся решить таким образом.

Добрый вечер.

 

Попробуйте вместо FindInstanceByUId использовать метод GetInstanceByName, как в примере ниже:

EntitySchema contactSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
Entity contactEntity = contactSchema.CreateEntity(UserConnection);
contactEntity.SetDefColumnValues();
contactEntity.SetColumnValue("Name", "User01");
contactEntity.Save();

Напишите, если проблему удастся решить таким образом.

Спасибо за ответ! да, такой вариант сработал. в данный момент я выполняю такой код

 

var tempSchema = connection.EntitySchemaManager.FindInstanceByUId(entityId);
var schema = connection.EntitySchemaManager.GetInstanceByName(tempSchema.Name);

так как у меня хранится только гуид обьекта. есть лучше решение в данной ситуации?

Показать все комментарии

When opened, the process constantly shows the loading icon, it is not possible to make any changes to it. Tried looking at the metadata, but couldn't find any errors. Please tell me how to solve this problem

Нравится

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

Hello Hanna, 

 

Please write to support@creatio.com and clarify the website name. Also, provide external access to your website. 

 

Looking forward to hearing from you, 

Показать все комментарии

Добрый день. я хочу показать более подробную ошибку пользователю, который запускает бизнесс процесс из кастомной кнопки. Бизнесс процесс запускает C# код, который бросает исключение. Но я не могу найти информацию по результатам выполнения бизнесс процесса.

Я получаю вот такой JSON в коллбеке ProcessModuleUtilities.executeProcess

 

'"{\\"message\\":\\"Произошла ошибка во время выполнения процесса. Пожалуйста, проверьте журнал процессов для получения детальной информации\\",\\"success\\":false,\\"errorInfo\\":{\\"initialConfig\\":{\\"errorCode\\":null,\\"message\\":\\"Произошла ошибка во время выполнения процесса. Пожалуйста, проверьте журнал процессов для получения детальной информации\\",\\"stackTrace\\":null},\\"errorCode\\":null,\\"message\\":\\"Произошла ошибка во время выполнения процесса. Пожалуйста, проверьте журнал процессов для получения детальной информации\\",\\"stackTrace\\":null,\\"instanceId\\":\\"8a078ebd-540c-476a-aab0-98fa4c42ce83\\",\\"hasListeners\\":{},\\"events\\":{\\"destroyed\\":true}}}"'

 

Здесь есть instanceId (8a078ebd-540c-476a-aab0-98fa4c42ce83), но когда я пробую сделать поиск по нему в базе данных, то не нахожу никакой ошибки. 

Изображение удалено.

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

 

Если же я выполню бизнес процесс успешно, тогда существует поле processId, по которому я могу найти текст ошибки.

 

Как другим способом можно найти ошибку выполнения бизнесс процесса который запускает C# код?

 

Спасибо

Нравится

4 комментария

Или может быть я делаю неправильно когда кидаю исключение в бизнес процессе. Как правильно создать исключение, если бизнес процесс должен быть остановлен?

Добрый день, instanceId о котором вы говорите не совсем относиться к бизнес-процессу. В данном случае удобнее всего искать в SysProcessLog сортировав его по дате создания и добавив фильтр на название нужного процесса. 

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

спасибо за ответ. но данное решение работает когда я вручную захожу и проверяю результат. как мне получить текст ошибки из кода, чтоб потом показать на диалоге? сделать селект последней ошибки по названию бизнес процесса?

Добрый день. Возможно ли данный функционал добавить? Это выглядит очень удобно когда надо при нажатии на кнопку запустить бизнесс процесс и показать ошибку если она появилась.

Показать все комментарии

Привет,

 

написал код, который вытягивает данные из веб сервиса. получается List, который мне надо загрузить в базу данных. 

На данный момент код выполняется в бизнес процессе как script task.

теперь мне его надо сохранить в базу данных. как это сделать? 

Прочитав статью Добавить данные https://academy.terrasoft.ua/docs/user/biznes_processy/spravka_po_eleme… я не уверен что это то, что мне нужно. 

 

Спасибо!

Нравится

2 комментария
Лучший ответ

попробовать через c# скрипт достучатся до пропети веб сервиса где лежит результат и там уже через Entity/Insert/CustomQuery.

попробовать через c# скрипт достучатся до пропети веб сервиса где лежит результат и там уже через Entity/Insert/CustomQuery.

Стас Гаврилюк,

спасибо за помощь. получилось сделать с помощью Entity.

 

var warehouseSchema = UserConnection.EntitySchemaManager.FindInstanceByName(WarehouseTableName);
var entity = warehouseSchema.CreateEntity(connection);
 
var entityExists = entity.FetchFromDB(conditionColumnName: WarehouseRefColumn, conditionValue: instance.Ref);
 
entity.SetDefColumnValues();
entity.SetColumnValue(WarehouseCityColumn, instance.CityDescription);
entity.Save();

 

Показать все комментарии

I am trying to start the process and for the first time I am faced with the problem of setting parameters in the BP in an object of the Process class. Why does it go into the "if" block with verification, but an error occurs when assigning?Изображение удалено.

Нравится

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

Hello Mikhail,

Following the link below you can find a community post with a similar problem and an example of starting BP from the server-side. Using this code example you can probably fix the error.

 

https://community.creatio.com/questions/calling-business-process-parame…



Hope this helps.

Показать все комментарии

Пытаюсь запустить процесс и ни первый раз сталкиваюсь с проблемой задания параметров в БП в объекте класса Process. Почему в блок "if" с проверкой заходит, а при присвоении возникает ошибка?

Изображение удалено.

Нравится

2 комментария

Михаил, добрый день!

В вашем случае для запуска процесса стоит попробовать использовать FlowEngine, привожу пример его использования:

using Terrasoft.Core;

using Terrasoft.Core.Process;

using Terrasoft.Core.Process.Configuration;

 

ProcessSchema schema = UserConnection.ProcessSchemaManager.GetInstanceByName("LeadManagement");

//schema = UserConnection.ProcessSchemaManager.GetInstanceByUId(leadManagementProcessUId);

 

//different engines for interpretable and compiled BP

bool canUseFlowEngine = ProcessSchemaManager.GetCanUseFlowEngine(UserConnection, schema);

if(canUseFlowEngine) {

    var flowEngine = new FlowEngine(UserConnection);

    var param = new Dictionary<string, string>();

    param["LeadId"] = Entity.Id.ToString();

    flowEngine.RunProcess(schema, param);

} else {

    Process process = schema.CreateProcess(UserConnection);

    process.SetPropertyValue("LeadId", Entity.Id);

    process.Execute(UserConnection);

}        

FlowEngine считается устаревшим или я ошибаюсь?

Показать все комментарии

Доброго времени суток.

Тестирую возможности вашего инструмента, пытаюсь настроить интеграцию фронта через прокси с Creatio.

 

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

 

Есть вот такой процесс заказа:

Изображение удалено.

Мне нужно, чтобы после создания заказа, с ним можно было оперировать, например, завершить его.

 

Пытался отправлять сигнал похожим на создание процесса способом:

Изображение удалено.

Но вместо schemaUId мне нужно передавать uid процесса, запущенного ранее.

По документации, не могу найти под каким параметром можно передать uid процесса, а не uid схемы процеса.

 

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

 

Подскажите, существует ли возможность активировать сигнал в определенном запущенном процессе с передачей данных?

Нравится

3 комментария
Лучший ответ

>Если функционал по вызову События или отправки Сигнала с передачей данных в БП через ProcessEngineService.svc отсутствует, то этот ответ меня тоже устроит.

К сожалению с таким на практике не встречался, подсказать не могу.

 

Вариант решения делать на каждой действие простой процесс (подпроцесс).

Например процесс добавления товара в заказ, у него будут входящие параметры: id заказа, id товара, булевый параметр. Запускаем этот процесс через ProcessEngineService.

На мой взгляд для текущей задачи больше подойдет odata https://academy.terrasoft.ru/docs/7-17/developer/integrations_and_api/d…

Для обобщения, меня в данном случае интересует выработка бест практайс и определение возможностей сервиса, а не решение конкретной задачи.

 

Интеграцию с odata я уже реализовал на прокси и умею через нее добавлять товары в заказ. Но хотелось бы больше контроля над бизнес процессом, от этого и вопрос.

Например мне нужно при изменении заказа уведомить склад о реформировании заказа. В таком случае я вижу 3 варианта:

1. OData. На прокси при добавлении заказа отсылать email (плохо, мало контроля и не очевидно в рамках БП).

2. OData + BPMN. В самом БП создать некую подписку на добавление товара в данный заказ и сделать отправку email (уже лучше, но например не при каждом изменении заказа мне нужно отправлять email, в таком случае появятся кастыли вроде сохранения промежуточных булевых переменных в данных, для определения вида изменения заказа).

3. BPMN. Чистая реализация на вызове отдельного события в процессе с передачей данных. Это позволит добавлять любой товар по простому сигналу и получить контроль над процессом, передавать дополнительно булевые переменные для модификации поведения БП в рантайме.

 

3-ий вариант для меня сейчас самый приоритетный.

Если функционал по вызову События или отправки Сигнала с передачей данных в БП через ProcessEngineService.svc отсутствует, то этот ответ меня тоже устроит.

>Если функционал по вызову События или отправки Сигнала с передачей данных в БП через ProcessEngineService.svc отсутствует, то этот ответ меня тоже устроит.

К сожалению с таким на практике не встречался, подсказать не могу.

 

Вариант решения делать на каждой действие простой процесс (подпроцесс).

Например процесс добавления товара в заказ, у него будут входящие параметры: id заказа, id товара, булевый параметр. Запускаем этот процесс через ProcessEngineService.

Показать все комментарии

Привет. 



При запуске процесса из элемента "Задание сценарий" следующим образом: 



var manager    = UserConnection.ProcessSchemaManager;

var flowEngine = new FlowEngine(UserConnection);

var processSchema = manager.GetInstanceByName("test process");

Dictionary parameter = new Dictionary();

TestCompositeObjectList list = new TestCompositeObjectList();

list.Add(new A { ColName= "test1" });

list.Add(new A { ColName= "test2" });

parameter.Add("TestCollection", list);

parameter.Add("Name", "Test");

flowEngine.RunProcess(processSchema, parameter);

return true;

 

Сам класс TestCompositeObjectList был создан по этому примеру.

 

При запуске процесса ловим: 

System.InvalidCastException: Unable to cast object of type 'Terrasoft.Common.CompositeObjectList`1[Terrasoft.Common.CompositeObject]' to type 'System.Collections.Generic.List`1[System.String]'.



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

TestCollection - и есть коллекция записей с полем стринг.

Name - просто ещё один параметр.



Дайте пожалуйста пример как сделать это.

 

 

Нравится

4 комментария
Лучший ответ

Разобрался. 

Ничего не нужно придумывать, а просто брать готовое и правильно использовать, прошу добавить инфу в документацию, что бы не приходилось как и мне тыкаться в стену. 



Код вызова: 

 

var manager	= UserConnection.ProcessSchemaManager;
var flowEngine = new FlowEngine(UserConnection);
var processSchema = manager.GetInstanceByName("ProcessName");
 
Dictionary&lt;string, object&gt; parameter = new Dictionary&lt;string, object&gt;();
 
CompositeObjectList&lt;CompositeObject&gt; objList = new CompositeObjectList&lt;CompositeObject&gt;();
 
objList.Add(new CompositeObject (new Dictionary&lt;string, object&gt;() {{"SubParamName",  "SubParamValue1"}}));
objList.Add(new CompositeObject (new Dictionary&lt;string, object&gt;() {{"SubParamName",  "SubParamValue2"}}));
// ....
// Первый коллекция записей - второе примитивный 
parameter.Add("CollectionName", objList);
parameter.Add("PrimaryParam", "Test");
 
flowEngine.RunProcess(processSchema, parameter);

 

Получение в скрипте: 

 

CompositeObjectList&lt;CompositeObject&gt; collection = Get&lt;CompositeObjectList&lt;CompositeObject&gt;&gt;("CollectionName");

 

if (ProcessSchemaManager.GetCanUseFlowEngine(userConnection, processSchema)) {

                    var flowEngine = new FlowEngine(userConnection);

                    Dictionary<string, string> parameter = new Dictionary<string, string>();

                    parameter.Add("CaseRecordId", CaseRecordId.ToString());

                    flowEngine.RunProcess(processSchema, parameter);

                } else {

                    var moduleProcess = processSchema.CreateProcess(userConnection);

                    if (processSchema.Parameters.ExistsByName("CaseRecordId")) {

                        moduleProcess.SetPropertyValue("CaseRecordId", CaseRecordId);

                    }

                    moduleProcess.Execute(userConnection);

                }

Полозюков Евгений Петрович,

У вас в примере обычный параметр, а не лист. С обычными то все понятно. Меня интересует передача именно параметра типа коллекция записей.

Возможно ли это вообщ? Потому что тут последний коммент говорит что "неа".

Разобрался. 

Ничего не нужно придумывать, а просто брать готовое и правильно использовать, прошу добавить инфу в документацию, что бы не приходилось как и мне тыкаться в стену. 



Код вызова: 

 

var manager	= UserConnection.ProcessSchemaManager;
var flowEngine = new FlowEngine(UserConnection);
var processSchema = manager.GetInstanceByName("ProcessName");
 
Dictionary&lt;string, object&gt; parameter = new Dictionary&lt;string, object&gt;();
 
CompositeObjectList&lt;CompositeObject&gt; objList = new CompositeObjectList&lt;CompositeObject&gt;();
 
objList.Add(new CompositeObject (new Dictionary&lt;string, object&gt;() {{"SubParamName",  "SubParamValue1"}}));
objList.Add(new CompositeObject (new Dictionary&lt;string, object&gt;() {{"SubParamName",  "SubParamValue2"}}));
// ....
// Первый коллекция записей - второе примитивный 
parameter.Add("CollectionName", objList);
parameter.Add("PrimaryParam", "Test");
 
flowEngine.RunProcess(processSchema, parameter);

 

Получение в скрипте: 

 

CompositeObjectList&lt;CompositeObject&gt; collection = Get&lt;CompositeObjectList&lt;CompositeObject&gt;&gt;("CollectionName");

 

Показать все комментарии

Здравствуйте

Задача:

Необходимо создать User Task, в которой создать объект ICompositeObjectList и для последующей передачи значения в другую User Task.

 

Данный пример не работает:

1 SoureCode:

namespace JustTestCompositeObject
{
    using System;
    using System.Collections.Generic;
    using Terrasoft.Common;
    public class A : ICompositeObject
    {
        internal string test;
        public bool TryGetValue(string key, Type valuetype, out object value) { value = default; return true; }
        public bool TryGetValue<TValueType>(string key, out TValueType value) { value = default; return true; }
    }
    public class TestCompositeObjectList : List<A>, ICompositeObjectList<A>
    {
        void ISerializableObject.Serialize(DataWriter dataWriter) { }
        void ISerializableObject.Deserialize(DataReader dataReader) { }
    }
    public class test
    {
        public static ICompositeObjectList<ICompositeObject> GnerateTestList()
        {
            TestCompositeObjectList list = new TestCompositeObjectList();
            list.Add(new A { test = "test1" });
            list.Add(new A { test = "test2" });
            return list;
        }
 
        public static string PrintTest(ICompositeObjectList<ICompositeObject> list)
        {
            string output = "";
            if (list == null)
            {
                output = "this collection is null";
            }
 
            foreach (A v in list)
            {
                output += v.test + " ";
            }
            return output;
        }
    }
}

UserTask1:

list = test.GnerateTestList();
return true;

, где list задан как тип: Serializable list of composite values

 

UserTask2:

output=test.PrintTest(list);
return true;

, где list имеет тип: Serializable list of composite values; output имеет тип: string

 

Процесс выглядит вот так:

Изображение удалено.

На Auto-generated page выводится output из UserTask2 

Конфигурация успешно компилируется.

 

Пробовал прописывать Usings на необходимый namespace в свойствах процесса, не работает...

 

Вещи типа: 

Изображение удалено.

не работают и не возвращаются значение

 

В Visual Studio все ок работает в конфигурации при передачи значений через процесс - нет.

 

Да, конечно, можно делать SerializeObject и просто передавать строки, но не хочется тратить ресурсы на лишнюю серилизацию, если можно сделать и без нее...

 

Пожалуйста подскажите как можно решить подобную задачу.

Нравится

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

Скорее всего, дело в том, что в новых версиях (7.12.3 и выше) процессы интерпретируемые. В старых версиях параметры, скрипты и другие элементы процесса представляли собой свойства и методы класса и такое, как Вы хотите, могло быть возможно.

А сейчас скрипты работают автономно и обмениваются значениями с параметрами через Get и Set.

Get&lt;T&gt;(string path)
Set(string path, T value)

Получится ли таким образом передать объект ICompositeObjectList, нужно экспериментировать, а по поводу возможности существования внутри БП класса с вызовом статических методов, сомневаюсь.

 

Больше об этом можно почитать тут и тут, а также тут и тут.

Показать все комментарии

Добрый день, коллеги!

Набросал небольшой процесс, который позволяет на выходе получить следующий рабочий день после указанного по выбранному календарю.

На вход процесса нужно подать дату и календарь.

Можно использовать в качестве подпроцесса в своих процессах.

Изображение удалено.

Прикрепленные файлы

Нравится

Поделиться

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

Здравствуйте, Руслан.

Возможно, будет удобнее выложить данное решение на marketplace, так как на community в ленте не всегда можно быстро найти нужный пост?

Показать все комментарии