Добрый день.

Не могу понять как запустить БП из другого БП через элемент "Задание-сценарий". Подскажите, можно ли это сделать?
Так же в запускаемый процесс мне нужно передать параметр.

Нравится

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

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

Запустить БП из ScriptTask можно. Для передачи параметров необходимо использовать словарь. Пример:
DateTime someDate = Get("dateTimeParam");
IDictionary parameters = new Dictionary();
parameters["ContactNum"] = Get("ContactNum");
parameters["starttime"] = someDate.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrSomeProcessName ", parameters);

"Зарицкий Олег" написал:Здравствуйте!

Запустить БП из ScriptTask можно. Для передачи параметров необходимо использовать словарь. Пример:
DateTime someDate = Get("dateTimeParam");
IDictionary parameters = new Dictionary();
parameters["ContactNum"] = Get("ContactNum");
parameters["starttime"] = someDate.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrSomeProcessName ", parameters);

Спасибо. Попробовала сделать как вы сказали. В элементе "Задание-сценарий" прописала:

UserConnection userConnection=context.UserConnection;
IDictionary<string, string> parameters = new Dictionary<string, string>();
parameters["param1"] = idSale.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrProcess23", parameters);

При сохранении и публикации процесса возникает ошибка (скриншот прикрепляю).
Не подскажите что я делаю не так?

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

Зачем придумывать велосипед? Есть элемент "Подпроцесс" - можно использовать его. Альтернативный вариант был описан в теме:
http://www.community.terrasoft.ru/forum/topic/25071

"Демьяник Алексей" написал:Зачем придумывать велосипед? Есть элемент "Подпроцесс" - можно использовать его.

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

Можете из скриптаска дернуть веб сервис, вот статья:
https://academy.terrasoft.ru/documents/technic-sdk/7-4-0/zapusk-process…

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

Добрый день! Подскажите, пожалуйста, в чем может быть ошибка????? Есть такая задача: необходимо удалять из резерва щиты по заданному клиенту. Есть очередь из четырех позиций. В этой очереди записываем ID компании, которая зарезервировала рекламный щит. Например, компания отказалась от всех своих резервов и соответственно надо удалить из очереди эту компанию. Процесс запускается из карточки клиента по кнопке из Действия. Делаем это следующим образом:
в карточке редактирования клиента в методе прописываем
showGrafInfo: function() {
var AccountId = this.get("Id");
var processArgs = {
sysProcessName: "GroupDelete",
parameters: {
IDClient: AccountId
}
};
ProcessModuleUtilities.executeProcess(processArgs);
},

getActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getActionsMenuItem({
"Type": "Terrasoft.MenuSeparator",
"Caption": ""
}));
actionMenuItems.addItem(this.getActionsMenuItem({
"Caption": this.get("Resources.Strings.GroupDelete"),
"Tag": "showGrafInfo"
}));
actionMenuItems.addItem(this.getActionsMenuItem({
"Type": "Terrasoft.MenuSeparator",
"Caption": ""
}));
return actionMenuItems;
}

Процесс пишем на C#:

EntitySchema UsrPlacementsschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrPlacements"); //выбираем из таблицы UsrPlacements
EntitySchemaQuery UsrPlacementsesq = new EntitySchemaQuery(UsrPlacementsschema);
UsrPlacementsesq.AddAllSchemaColumns();

var filter1 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve1", IDClient);
var filter2 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve2", IDClient);
var filter3 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve3", IDClient);
var filter4 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve4", IDClient);
// Объединить фильтры в коллекции логической операцией OR
UsrPlacementsesq.Filters.LogicalOperation = LogicalOperationStrict.Or;

// Добавить фильтры в запрос
UsrPlacementsesq.Filters.Add(filter1);
UsrPlacementsesq.Filters.Add(filter2);
UsrPlacementsesq.Filters.Add(filter3);
UsrPlacementsesq.Filters.Add(filter4);

EntityCollection Placementsentities = UsrPlacementsesq.GetEntityCollection(UserConnection);

foreach (Entity Placement in Placementsentities) {

if (Placement.GetTypedColumnValue("UsrReserve1Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve1Id", null);
Placement.SetColumnValue("UsrResPrice1", 0);
Placement.SetColumnValue("UsrResDate1", "");
Placement.Save();
}

if (Placement.GetTypedColumnValue("UsrReserve2Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve2Id", null);
Placement.SetColumnValue("UsrResPrice2", 0);
Placement.SetColumnValue("UsrResDate2", "");
Placement.Save();
}

if (Placement.GetTypedColumnValue("UsrReserve3Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve3Id", null);
Placement.SetColumnValue("UsrResPrice3", 0);
Placement.SetColumnValue("UsrResDate3", "");
Placement.Save();
}

if (Placement.GetTypedColumnValue("UsrReserve4Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve4Id", null);
Placement.SetColumnValue("UsrResPrice4", 0);
Placement.SetColumnValue("UsrResDate4", "");
Placement.Save();
}

}

return true;

В параметрах прописали аргумент IDClient - уникальный идентификатор. Процесс запускается, проблема в том, что если в очереди (UsrReserve1, UsrReserve2, UsrReserve3, UsrReserve4) стоят разные компании, то они удаляются все, а не только та компания, которая нам необходима. Помогите, пожалуйста разобраться в чем неточность.... Спасибо!

Нравится

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

Добрый день Юлия!!!

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

Михаил, добрый день! Структура таблицы UsrPlacements: есть поля резерв1...резерв4, в которых хранятся Id компании, дата резерва 1...дата резерва 4, цена резерва1...цена резерва 4. В карточке клиента есть кнопка Удаление резервов, по которой запускается процесс. В итоге должны обнуляться поля резерв1...резерв4, дата резерва 1...дата резерва 4, цена резерва1...цена резерва 4, если резерв1 или резерв2 или резерв3 или резерв4 равны Id клиента из карточки.

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

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

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

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

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

Юля так как вы исправлять структуры таблиц не желаете, а желаете оставить все как есть, то предлагаю алгоритм процесса перестроить следующим образом. Ниже привожу алгоритм 1 скрипта в Бизнес-процессе:

EntitySchema UsrPlacementsschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrPlacements"); //выбираем из таблицы UsrPlacements
EntitySchemaQuery UsrPlacementsesq = new EntitySchemaQuery(UsrPlacementsschema);
UsrPlacementsesq.AddAllSchemaColumns();
 
var filter1 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve1", IDClient);
UsrPlacementsesq.Filters.LogicalOperation = LogicalOperationStrict.AND;
 
// Добавить фильтры в запрос
UsrPlacementsesq.Filters.Add(filter1);
 
EntityCollection Placementsentities = UsrPlacementsesq.GetEntityCollection(UserConnection);
 
foreach (Entity Placement in Placementsentities) {
 
    if (Placement.GetTypedColumnValue("UsrReserve1Id")==IDClient);
    {
        Placement.SetColumnValue("UsrReserve1Id", null);
        Placement.SetColumnValue("UsrResPrice1", 0);
        Placement.SetColumnValue("UsrResDate1", "");
        Placement.Save();
    }

Далее создаете 2,3,4 скрипты по образу и подобию первого только меняете "UsrReserve1Id" на "UsrReserve2Id". Алгоритм конечно не идеален и мне если честно вообще не нравиться. Я бы так никогда не сделал. Но работать точно будет как вы хотите. Я бы если обнаружил такую таблицу, где изначально неправильно распланировали структуру. Я бы создал новую правильную талбицу. Далее перенес бы все данные, ну и конечно переписал все алгоритмы под новую таблицу. Я бы так сделал.

Михаил, большое спасибо! Попробую сделать и напишу Вам

Михаил, добрый вечер! Большое спасибо за скрипт, все работает корректно!

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

В SDK bpm'online дополнен раздел "Рекомендуемые средства интеграции".
Заходите на сайт Terrasoft Academy в раздел "Документация SDK" и узнайте как

Статьи расположены в разделе "Рекомендуемые средства интеграции".

Нравится

Поделиться

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

Добрый день!
Вопрос по статье "выполнить аутентификацию внешних запросов к веб-сервисам bpm'online". Что делать, если у пользователей ntlm-аутентификация (логин/пароль доменные) и нужно обратить к сервису OData?

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

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

Сергей, не совсем понял, при чем тут страница логина.
Есть внешний код (в примере это код на C#), там жестко зашиты логин/пароль.
Вопрос: что зашивать, если логин/пароль доменные?

NTLM - аутентификация используется только через страницу логина.
В версиях 5.4, 7.6 и выше через аутентификационный сервис можно выполнить аутентификацию по логину/паролю пользователя в системе или по LDAP.

То есть, если у меня 5 пользователей, все доменные, то я не смогу создать например лид через OData, использую какую то внешнюю систему?

Вы не сможете этого сделать. В текущем случае рекомендуем настроить LDAP подключение к Вашему домену, и авторизоваться через LDAP.

Сергей,
я подключусь, авторизуюсь по LDAP из своего кода, а как потом обратиться к сервису (например добавить лид)? Он же попросит авторизацию логин/пароль, а я после авторизации только на уровне кода смогу проверить, что все ок, а пароль то все равно не смогу в сервис передать и он меня не пустит.

Александр, данная аутентификация не поддерживается.
Поддерживаются:
1. Basic
2. Cookie (если есть способ получить аутентификационные куки из bpm'online, выполняется с помощью auth-сервиса).

Добрый день!
Скажите, пожалуйста, правильно ли я поняла?
чтобы использовать протокол ODATA необходимо, чтобы был хотя бы один пользователь(администратор) НЕ с доменной авторизацией ?

Добрый день, Дарья!

Верно, для использования протокола OData необходим пользователь с обычной или ldap авторизацией.

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