Есть Си Шарповый код, который вызывает процессы через 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 и на все подпапки/ файлы.

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

Виникають труднощі з оновленням актуальної версії кейсів.

Зміни внесені в дизайнері кейсу не розповсюджуються на всі угоди кейсу, тому доводиться вручну оновлювати версію до актуальної в кожній угоді окремо, що ускладнено їх кількістю. Скріни додаю.

Нравится

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

Добрий день.

У базовій версії Creatio немає механізму, який би дозволив масово актуалізувати Кейси.
Рішення про зміну версії кейсу повинен приймати користувач самостійно, оскільки за деякими записами можуть виконуватись процеси.

У команди розробників Creatio зареєстровано завдання, щодо додавання даного механізму в базову логіку додатка.

На цей момент змінювати версію Кейса можна лише вручну в кожному записі окремо.

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

Был у нас объект (с наследованием от Base lookup) UsrTlsVersion. Был объект UsrConnectionSetting, в котором была Lookup колонка TLS Version, ссылающаяся на объект UsrTlsVersion. В какой-то момент необходимость в UsrTlsVersion отпала, и сначала была удалена соотвествующая колонка из UsrConnectionSetting, а потом и сам объект UsrTlsVersion. Оба удаления прошли без ошибок. После этого любые изменения в UsrConnectionSetting и последуюзий паблишинг начали ломаться с ошибкой:
 

Error while saving: No lookup workspace item reference specified for lookup type column "TLS Version".

Я так понимаю, суть ошибки в том, что где-то, где использовался UsrConnectionSetting, остались следы колонки TLS Version. Но их нигде не видно, отовсюду удалили. Может можно через SQL найти как-то эти следы ?

Нравится

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

Александр, здравствуйте!
Чтобы предоставить корректный сценарий решения данной проблемы необходимо проанализировать базу данных вашего приложения и найти какие именно ссылки и взаимосвязи вызывают данную ошибку.
Обратитесь, пожалуйста, в поддержку.
С уважением, Алексей.

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