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

Дело было так: У меня есть основной процесс, который вызывает веб сервис и обрабатывает ответ. Я настроил метод для веб сервиса. Настроил обработку ответа с помощью инструмента "Быстрая настройка" и передаю параметры, которые получил от веб сервиса подпроцессу.



Изначально всё работало как часы. Подпроцесс запускался и обрабатывал параметры.

Далее мне потребовалось добавить ещё один  параметр в "Обработку ответа" для метода веб сервиса. Изначально я руками создал параметр и настроил его. Пусть к элементу (JSONpath) я указал верный!

Далее я перешёл в основной процесс и увидел, что только что добавленный параметр я не могу выбрать, потому что блок веб сервиса его попросту не имеет. Я пошёл обратно к веб сервису, удалил параметр и создал его уже с помощью инструмента "Быстрая настройка". Перешёл в бп и наконец-то увидел нужный мне параметр.

Далее я поставил этот параметр в подпроцесс и тут всё сломалось.

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

Я подумал что всё дело в "Задании-сценари" в моём подпроцессе. Я удалил его и сохранил. По непонятной мне причине подпроцесс начал работать.

Но возникла другая проблема с вызовом веб сервиса.

Мой веб сервис обращается к телеграм api с помощью метода "getUpdates", параметры ответа которого я обрабатываю в моём веб сервисе.

Если раньше ответ от нажатия на inline нопки в телеграмме я получал и всё работало прекрасно, то теперь, возникала ошибка:

Terrasoft.Common.UnsupportedTypeException: Тип "System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" не поддерживается

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

С этого момента я попробовал поменять работу с передаваемыми параметрами, но ничего не помогло. После я заново переопределил параметры ответа для параметра в веб сервисе, но после этого подпроцесс вновь перестал запускаться. Я пробовал с 0 создавать мои 2 процесса, но это не помогло. Что делать в такой ситуаци?

Нравится

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

Добрый день.



Данная ошибка может быть связана с некорректной обработкой массива параметров в ответе (Result) веб сервиса.

Попробуйте убрать масив параметров из ответа  веб сервиса.

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

Добрый день!

Есть задача: привязать условие определения родительского инцидента/обращения не к цепочке в хэдере, а к значению в теме письма. Не могу разобраться в том, в какой момент срабатывает логика, заполняющая CaseId у активности типа email (или соответственно ConversationId в EmailMessageData, т.к. насколько я вижу это связанные факторы и в дальнейшем именно на ConversationId построено разграничение связанных и не связанных email).

Где она запускается и можно ли как-то написать класс-расширение который переопределил бы эти методы?

Заранее спасибо!

Нравится

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

Добрый день,

 

Логика проверки активности на привязку к существующему обращению или создания нового обращения находится в бизнес процессе "IncidentRegistrationFromEmailProcess" (который запускается после каждой завершенной сессии синхронизации писем в системе). В элементе скрипт-таск процесса вызывается метод RegisterIncidentFromEmail, который в конце выполнения делает вызов:

 

result = helper.GetRegisterIncidentId(activityId);

 

helper - это класс IncidentRegistrationFromEmaillHelper.

GetRegisterIncidentId - публичный виртуальный метод, который вызывает другой защищенный метод InternalRegisterCase, который в свою очередь или регистрирует новое обращение или привязывает активность к существующему обращению.

 

Поэтому, если нужно изменить логику, нужно смотреть в сторону замещения метода GetRegisterIncidentId внутри IncidentRegistrationFromEmaillHelper и прописывать свою кастомную логику там.

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

Есть Си Шарповый код, который вызывает процессы через UserConnection.ProcessEngine.ProcessExecutor.Execute(), появилась необходимость не просто вызывать эти процессы, но и получать из них результат. Для этого, я так понял, нужно пользоваться методом ExecuteProcessWithResult(). Но где можно найти пример использования этого метода ? В идеале, и бизнес-процесс, и код, который вызывает этот БП, если такое есть.



Так же волнует то, что есть небходимость всегда получать какой-то ответ из процесса, будь то результат его действий или ошибка при их выполнении. Но, скажем, есть процесс из 10 элементов, в последнем мы возвращаем результат в этот метод вызова БП. Но если процесс сломается на каком-то из предидущих 9и элементов, то и результат мы никогда не получим, верно ? Что можно сделать, чтобы в такой ситуации всегда получать назад ответ(с результатом действий БП или с ошибкой при их выполнении) ?

Нравится

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

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

 

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

 

Насчет вопроса с ошибкой в бизнес-процессе, можете попробовать разобраться, как реализована логика работы раздела [Process log].

 

Ещё рекомендую посмотреть свойства и методы интерфейса ProcessEngine.

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

Использую EntitySchemaQuery, чтобы сделать селект данных, появилась необходимость одно из полей сравнить через регулярные выражения, но среди возможностей FilterComparisonType такого не вижу. Есть способ как-то обойти это ? Или остаётся только чистые SQL запросы писать, не используя EntitySchemaQuery ?

Нравится

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

Подскажите, в Вашей реализации можно записать результат ESQ в аттрибут, например, массивом, а потом пройтись по массиву из аттрибута и сделать нужную проверку?

Oleg Drobina,

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

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

Есть БП, который создаёт объекты через

new Insert(userConnection).Into("UsrCards")

Нужно сразу после создания давать права на этот объект людям, у которых есть конкретная роль. Давать права через элемент БП Change access rights в нашем случае неудобно, поэтому надо через код. Пока вроде понял, что нужен UserConnection.DBSecurityEngine, но вот не пойму, где найти нужный мне метод для него.

Нравится

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

Пример раздачи прав через DBSecurityEngine есть в методе CheckTagTypeAndGrantAdditionalRights в процесе на объекте CampaignTag. Там пример такой:

 

UserConnection.DBSecurityEngine.SetEntitySchemaRecordRightLevel(TSConfiguration.BaseConsts.PortalUsersSysAdminUnitUId, 

                        Entity.Schema, Entity.PrimaryColumnValue, SchemaRecordRightLevels.All); 

 

то есть в метод аргументами передаются:

TSConfiguration.BaseConsts.PortalUsersSysAdminUnitUId - Id пользователя или роли;

Entity.Schema - название объекта;

Entity.PrimaryColumnValue - Id записи из этого объекта;

SchemaRecordRightLevels.All - уровень прав доступа.

 

Еще пример - процесс на объекте Activity из пакета Base (тот же метод SetEntitySchemaRecordRightLevel). Можете локально отладить (на запись маркетинговой кампании добавить тэг и посмотреть что в этом методе передается в аргументах).

 

Также можете попробовать использовать RightsManagerHelper пакета PRMBase или пример в SocialSubscriptionService пакета ESN, там аналогичные операции доступны.

Пример раздачи прав через DBSecurityEngine есть в методе CheckTagTypeAndGrantAdditionalRights в процесе на объекте CampaignTag. Там пример такой:

 

UserConnection.DBSecurityEngine.SetEntitySchemaRecordRightLevel(TSConfiguration.BaseConsts.PortalUsersSysAdminUnitUId, 

                        Entity.Schema, Entity.PrimaryColumnValue, SchemaRecordRightLevels.All); 

 

то есть в метод аргументами передаются:

TSConfiguration.BaseConsts.PortalUsersSysAdminUnitUId - Id пользователя или роли;

Entity.Schema - название объекта;

Entity.PrimaryColumnValue - Id записи из этого объекта;

SchemaRecordRightLevels.All - уровень прав доступа.

 

Еще пример - процесс на объекте Activity из пакета Base (тот же метод SetEntitySchemaRecordRightLevel). Можете локально отладить (на запись маркетинговой кампании добавить тэг и посмотреть что в этом методе передается в аргументах).

 

Также можете попробовать использовать RightsManagerHelper пакета PRMBase или пример в SocialSubscriptionService пакета ESN, там аналогичные операции доступны.

Oleg Drobina,

Спасибо, получилось сделать.

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

Предпологаю, что можно в 1м скрипет через сетеры сохранить значения на уровне переменных процесса, а потом во 2м скрипте через геттеры получить их значения. Но может есть ещё какие-то способы ?

Нравится

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

Добрый день,

 

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

 

Вот несколько примеров геттеров и сеттеров того, как это можно реализовать:

 

Скрипт 1

string s = "Test1";
Set<string>("ProcessSchemaParameter2", s);
 
return true;

Скрипт 2

string s2 = Get<string>("ProcessSchemaParameter2");
s2 += " and param 3";
Set<string>("ProcessSchemaParameter3", s2);
 
int i = Get<int>("ProcessSchemaParameter1");
i += 2;
Set<int>("ProcessSchemaParameter4", i);
return true;

В сеттерах и геттерах мы ставим «Код» параметра, а не его заголовок. Мы можем увидеть код параметра, если нажмем на него.

 

Здесь вы можете найти дополнительную информацию:

https://academy.terrasoft.ua/docs/user/biznes_processy/spravka_po_eleme…

 

С уважением,

Дарий

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

Есть у меня бизнес-процесс А, в нём есть элемент скрипт, который через код добавляет новые объекты, делает он это, примерно, так:

 

var insert = new Insert(userConnection).Into("UsrCard")
                .Set("Id", Column.Parameter("id"))
                .Set("Name", Column.Parameter("Name"))
                ...;
 
insert.Execute();

 

Есть бизнес-процесс Б, который стартует по сигналу создания этих объектов(Object signal, UsrCard, Record Added). Точнее он должен старовать, но этого не делает. Я так понимаю, что проблема в том, как именно я добавляю эти объекты. Естественно, если бы я это делал через элемент Add data, то всё работало бы, но мне надо добавлять именно через код, так как объектов создать надо много и так удобней.



Вопрос в том, как мне нужно поменять мой подход добавления объектов, чтобы процесс Б начал триггериться на эти новые объекты, можно ли вообще этого добиться, не используя элемент Add data ?

Нравится

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

Добрый день.

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

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

 

Алла Савельева,

Добрый день. Попробовал так, но бизнес-процесс всё равно не стартует по сигналу. В процессе, в котором вызывается этот код, ошибок при выполнении нет, сами данные успешно добавились, а процесс, который должен запуститься, не запускается вовсе, то есть тоже нет каких-либо ошибок в логах процессов.

Хм, я заметил, что старт бизнес-процесса по сигналу всё таки срабатывает, но только, если запустить процесс создания объектов вручную(нажав Run). Но мне надо, чтобы этот процесс запускался автоматически(механизм этого есть и работает). Не пойму, что именно в автоматическом запуске первого процесса мешает позже запуститься второму процессу. Может, надо UserConnection как-то по-другому доставать ?

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

Добрый день!

 

Подскажите, пожалуйста, возможно ли добавление новых полей в system settings при помощи создания замещающего объекта или другим способом? Пробую добавить поле в замещающий объект, но тогда в system settings слетают все заполненные записи, поле не появляется.

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

 

Нравится

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

Добрый день,

 

У Вас не отображаются значения для полей, потому что, скорее всего, сваливается с 500 ошибкой SelectQuery на VwSysSettings. То есть, Вы добавили новую колонку в таблицу SysSettings, но не отобразили изменение во Vw по этой таблице. Еще необходимо поменять структуру Vw. Как трафарет, можете использовать SQL сценарий "VwSysSetting" из конфигурации (их там три, каждый для разной СУБД, все в пакете UIv2), в сценарий нужно добавить Вашу кастомную колонку. После выполнения сценария можно не перелогиниваться в систему и не обнолвять страницу, запросы должны проходить после этого.

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

Добрый день!

Пытаюсь по инструкции https://community.terrasoft.ua/articles/kak-sozdat-polzovatelskii-eleme… добавить кастомный элемент управления (задача - сделать поле textEdit, которое будет парсить введенную строку и возвращать число)

Столкнулась с проблемой: не получается привязать логику к событию сhange.

Как привязываю:

Ext.define("Terrasoft.controls.ITdsDataControl", {
	/*extend: "Terrasoft.Component",*/
	extend: "Terrasoft.controls.TextEdit",
init: function() {
		this.callParent(arguments);
		this.addEvents(
			"myMethod",
			"onChange" //пытаюсь привязать стандартный метод к событиям
		);
	},
onChange: function(event){
        var value = this.getTypedValue();
        value = value+"ttt";
        this.setValue(value); //пытаюсь увидеть изменилось ли значение
        this.setReadonly = true;//или хотя бы изменилась ли редактируемость поля
        this.setTimeString(value);
        this.reRender();
        this.callParent(arguments);
        };



Брейк-поинты и дебаггер, если добавляю в метод onChange, тоже не работают.

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

 

Можете подсказать, из каких элементов должна состоять данная логика? Что должно быть в коде компонента чтобы была возможность написать кастомную логику парсинга в момент, когда введено значение?

Нравится

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

Добрый день, Александра!

Из вашей бизнес задачи могу предположить, что вам достаточно будет в схеме страницы написать атрибут, примером:

attributes: {
			"UsrText": {
                dataValueType: Terrasoft.DataValueType.TEXT,
                dependencies: [
                    {
						columns: ["UsrText"],
                        methodName: "calculateNumber"
                    }
                ]
            }
		},

При изменении поля UsrText будет запускаться метод calculateNumber и уже в нём вы можете сделать всё, что вам необходимо.

Дима Вовченко,

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

 

 

В статье-примере события wrap-элемента отслеживались, насколько я поняла, после привязки их в функции:

initDomEvents: function() {

        this.callParent(arguments);

        var wrapEl = this.getWrapEl();

        if (wrapEl) {

            wrapEl.on("click", this.onClick, this);

        }

    },

У меня (если я правильно поняла логику) нужно событие change самого textEdit а не wrap-элемента. Но может быть мне нужно его включить для отслеживания таким же способом?

 

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

Добрый День, как устранить данную ошибку?

Скриншот прилагается.Изображение удалено.

Нравится

5 комментариев

Содержимое окна сообщения не видно.

 

Текст сообщения об ошибке не виден.

UnauthorizedAccessException. Отказано в доступе по пути "C:\bpmonline\Terrasoft.WebApp\conf\content\_FileContentDescriptors.js". Остальные ошибки могут быть найдены в логе приложения

Здравствуйте, рекомендую проверить и при необходимости раздать права уровня Full control для пользователя, под которым запущен пул в iis, на \Terrasoft.WebApp и рекурсивно выдать права на все подпапки и файлы.

Добрый День, помогло выдача полных прав для пользователя, под которым запущен пул в iis, на \Terrasoft.WebApp и на все подпапки/ файлы.

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