Вопрос

Коллеги, здравствуйте!

Подскажите, где происходит сакральный Set("UserConnection", UserConnection) для БП?

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

 

У меня такой же вопрос

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

Где то внутри Terrasoft.Core.ProcessEngine.... без исходников или дизасма и не видно :)

При запуске процесса из конфигурации, интерпретируемого или компилируемого, UserConnection передаётся извне, как видно из примеров, которые приводил Григорий.

А при запуске через ProcessEngineService там в начале функции ExecuteProcess считывается то самое HttpContext.Current.Session["UserConnection"].

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

Добрый день!

Создал свой WS с методом GET. Он не требует авторизации в BPM. По прямой ссылке он прекрасно выдает результат в браузере.
При попытке использования его в БП появляется сообщение: 
Ошибка HTTP 401.1 — Unauthorized

Я верно понимаю, что причина кроется именно в настройке самой BPM  для работы с WS, а не в настройке конкретного БП?

У меня такой же вопрос

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

В броузере вы подключились к своему сеансу, из БП нужно выполнить авторизацию

Григорий Чех,

Верно ли понимаю, что можно в БП первым действием блок для работы с WS вставить, 
описать WS AuthService.svc/Login в справочнике WS и на первом шаге к нему обращаться так:
https://bpm/ServiceModel/AuthService.svc/Login

Тем самым решая проблему выполнения последующих блоков в рамках данного БП.
Или нужно c# кодом описывать логику дополнительно?

При работе с веб-сервисами кроме авторизации ещё нужно получать CSRF-токен. Если в итоге с авторизацией через AuthService не получится, можно переделать на basic-аутентификацию, как поступил автор темы тут. Правда, её не рекомендуют из-за недостатков.

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

Требуется перенести базу с прода на дев с целью тестирования.

Но возникает вопрос - когда я восстановлю бэкап и запущу IIS, у меня запустятся все БП по расписанию, чего очень нужно избежать. 

Каким образом отключить эти БП sql-скриптом до старта IIS (все имена известны), чтобы результат был аналогичен действию из библиотеки процессов? И они не стартовали?

У меня такой же вопрос

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

Внесите ваши процессы (их SysSchemaId) в таблицу SysProcessDisabled (список отключенных БП)

Выбрать SysSchema.Id можно по их имени запросом:

SELECT id FROM SysSchema ss WHERE ManagerName='ProcessSchemaManager' AND name IN ('MIRegCRF0', 'MICRFdatecontrolM',
'SendResolution',
'IncidentRegistrationFromEmailProcess',
'SetOrderInWorkFromOperatorSingleWindowProcess')

 

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

Добрый день!

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

Как можно вынести свое поле в блок расширенные настройки?

вариант реализации через "добавить элемент" не хотелось бы рассматривать.

 

 

У меня такой же вопрос

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

Добрый день!
При открытии страницы на добавление новой записи любые поля можно предзаполнять (https://monosnap.com/file/tPSQ0trcaysvRU4HTCUngC2G16hyXF). При открытии страницы на редактирование такое сделать нельзя, да и не нужно это делать (перезатирать существующие значения).

Сидоров Александр В.,

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

Опочина Любовь,

"При этом создается активность" - тогда предлагаю во внутреннем бизнес процессе Активности добавить логику по заполнению полей при создании активности

Сидоров Александр В.,

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

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

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

На прод среде имеется бизнес-процесс в пакете Custom. Я хочу изменить этот процесс, внести его в свой пакет разработки. Что собственно уже сделал на среде разработки. Однако при импорте на тестовую заметил, что этот БП не импортируется, так как такой уже есть в пакете Custom. Есть какие нибудь методы решения такой проблемы? только удаление из Custom на прод перед импортом? Или лучше всё таки новый бп создать?

У меня такой же вопрос

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

Добрый день!
Можно у себя на стенде перетащить БП в свой пакет (сменить пакет у БП), а при установке в прод ставить архивом изменяемые пакеты (включая Custom) через установку приложения (не импорт схемы)

Добрый день!
Можно у себя на стенде перетащить БП в свой пакет (сменить пакет у БП), а при установке в прод ставить архивом изменяемые пакеты (включая Custom) через установку приложения (не импорт схемы)

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

Запускаю из сервиса БП, в котором нет никаких ожиданий.

UserConnection 	userConnection	= HttpContext.Current.Session["UserConnection"] as UserConnection;
var 			manager 		= userConnection.ProcessSchemaManager;
var 			processSchema 	= manager.GetInstanceByName("UsrProcess");
var 			process 		= processSchema.CreateProcess(userConnection);
 
process.SetPropertyValue("ExternalCall", true);
process.Execute(userConnection);

Подскажите, как дождаться завершения БП и прочитать параметры, которые мы имеем в конце выполнения?

У меня такой же вопрос

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

Добрый день!
Данное действие синхронно, т.е. после завершения операции process.Execute(userConnection); уже можно забирать параметры.
Забирать их следующим образом (пример):

res.Success = process.GetPropertyValue("RpSuccess") != null ? (bool)process.GetPropertyValue("RpSuccess") : false;
res.ErrorDescription = process.GetPropertyValue("RpReturnMsg") != null ? (string)process.GetPropertyValue("RpReturnMsg") : "";

 

Добрый день!
Данное действие синхронно, т.е. после завершения операции process.Execute(userConnection); уже можно забирать параметры.
Забирать их следующим образом (пример):

res.Success = process.GetPropertyValue("RpSuccess") != null ? (bool)process.GetPropertyValue("RpSuccess") : false;
res.ErrorDescription = process.GetPropertyValue("RpReturnMsg") != null ? (string)process.GetPropertyValue("RpReturnMsg") : "";

 

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

if (process.Status != ProcessStatus.Running && process.Status != ProcessStatus.Error)

or

if (process.Status == Terrasoft.Core.Process.ProcessStatus.Done)

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

UserConnection 	userConnection	= HttpContext.Current.Session["UserConnection"] as UserConnection;
var manager 		= userConnection.ProcessSchemaManager;
var processSchema 	= manager.GetInstanceByName("UsrPreCreateDealProcess");
var flowEngine 		= new Terrasoft.Core.Process.FlowEngine(userConnection);
Dictionary<string, object> parameter = new Dictionary<string, object>();
parameter.Add("CarId", car_id);
Terrasoft.Core.Process.ProcessDescriptor pd = flowEngine.RunProcess(processSchema, parameter);
if (pd.ProcessStatus == Terrasoft.Core.Process.ProcessStatus.Done)
{
	?????
}

Как вытащить параметры в конце выполнения здесь?

Есть предположение, что копать стоит в сторону FlowEngineStateService, у него есть метод FindProcessComponentSet(Guid processUId), который возвращает инфу о процессе. И там уже забрать параметры

Сидоров Александр В.,

я нашел этот класс, у него есть метод GetParameterValue, но он стабильно возвращает, что параметр не найден по данному пути и возникает (философский) вопрос, что есть Путь? Видимо, это не просто имя. Но товарищи из Террасофта не догадались описать этот момент нигде ни разу.

перепробовал всё с FlowEngineStateService - ничего не работает, написал в ТП

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

ТП ответила, что решения в 7.11 нет. Я так и знал :)) и заранее сделал обходной путь через БД. Заодно полезное для отладки логирование получилось

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

Всем привет.

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

Заранее спасибо за помощь.

У меня такой же вопрос

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

Начиная с версии 7.12.3 все создаваемые бизнес-процессы в bpm’online являются интерпретируемыми. Для обращения к значениям параметра процесса следует использовать методы get и set 

Метод Get возвращает значение параметра элемента или процесса.

Сигнатура метода:

Get<T>(string path)

где:

T — тип значения параметра;

path — строка, определяющая путь к параметру или свойству. Путь формируется согласно правилам:

“имя параметра”,

“имя свойства”,

“имя элемента.имя параметра”,

“имя элемента.имя свойства”.

Метод Set указывает значение параметру элемента или процесса.

Сигнатура метода:

Set(string path, T value)

где:

value — указываемое значение,

path — строка, определяющая путь к параметру или свойству. Путь формируется согласно правилам, описанным выше для метода Get.

 

Так например чтобы получить в скриптаске UserConnection нужно использовать конструкцию:

UserConnection userConnection = Get<UserConnection>("UserConnection");

Чтобы получить строковый параметр БП:

string message = Get<string>("Message");

Подробнее тут

Начиная с версии 7.12.3 все создаваемые бизнес-процессы в bpm’online являются интерпретируемыми. Для обращения к значениям параметра процесса следует использовать методы get и set 

Метод Get возвращает значение параметра элемента или процесса.

Сигнатура метода:

Get<T>(string path)

где:

T — тип значения параметра;

path — строка, определяющая путь к параметру или свойству. Путь формируется согласно правилам:

“имя параметра”,

“имя свойства”,

“имя элемента.имя параметра”,

“имя элемента.имя свойства”.

Метод Set указывает значение параметру элемента или процесса.

Сигнатура метода:

Set(string path, T value)

где:

value — указываемое значение,

path — строка, определяющая путь к параметру или свойству. Путь формируется согласно правилам, описанным выше для метода Get.

 

Так например чтобы получить в скриптаске UserConnection нужно использовать конструкцию:

UserConnection userConnection = Get<UserConnection>("UserConnection");

Чтобы получить строковый параметр БП:

string message = Get<string>("Message");

Подробнее тут

Григорий Чех,

Спасибо большое! Как-то этот мануал мимо меня прошёл.

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

Вопрос:

Возникла необходимость разобрать массив с большим кол-вом данным.  На академии такой пример не рассмотрен.
В курсе о возможности парсинга массива при настройке параметров JSONPath, но это работает при условии возвращения одной записи в массиве. А как быть с большим кол-вом данных?

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

Вопросы:
Что за интерфейсы IObjectList/ICompositeObject/ICompositeObjectList<TObject>, и как обрабатывать такой конвертированный массив?
Можно-ли обработать массив из ответа веб-сервиса и как это сделать?

Веб-сервис http://hetzner1.k-matika.ru:64123/0/rest/KmWebService/GenderSearchContact?GenderName={значение}, выборка по полу {Male/Female}

Выборка полей по каждому контакту: Id, Name, Phone

Ответ:

Пример реализации:
Сервис (схема):

Рекомендации: используйте контракты для передачи объектов, для формирования json, используйте возможности newtonsoft.json
Бизнес-процесс:

Сервис


Настройки элемента "Вызвать веб сервис"


Настройки элемента "Задание-сценарий":

Поделиться

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

ICompositeObjectList представляет собой массив элементов ICompositeObject. Перебирается обычным циклом (foreach).
ICompositeObject - dictionary (ключ-значение).
Получить значение можно одним из 2х методов:
 

/// <summary>Returns inner value by key.</summary>
    /// <param name="key">The key.</param>
    /// <param name="valueType">Type of the value.</param>
    /// <param name="value">Result value.</param>
    bool TryGetValue(string key, Type valueType, out object value);
 
    /// <summary>Returns inner value by key.</summary>
    /// <typeparam name="TValueType">The type of the value.</typeparam>
    /// <param name="key">The key.</param>
    /// <param name="value">Result value.</param>
    bool TryGetValue<TValueType>(string key, out TValueType value);

 

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

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

Есть следующая ситуация:

Заходим в деталь карточки раздела, добавляя туда запись отрабатывает БП который меняет значение поля в Entity, но при возвращении в карточку остается старое значение.
Поэтому возникает необходимость актуализировать данные в карточке, к примеру, при помощи метода this.reloadEntity(), но непонятно как отправить message из БП в схему карточки и там уже запустить обновление.

Есть идеи?

У меня такой же вопрос

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

На сервере через Элемент скрипты делаете так:
 

string messageText = "{\"любой текст, если хотите\"}";
string sender = "NeedUpdatedGrid";
MsgChannelUtilities.PostMessageToAll(sender, messageText);

Затем создаете клиентский модуль, такого содержания:
 

define("ClientMessageBridge", ["ConfigurationConstants"],
function(ConfigurationConstants) {
    return {
        messages: {
            "NeedUpdatedGrid": {
                "mode": Terrasoft.MessageMode.BROADCAST,
                "direction": Terrasoft.MessageDirectionType.PUBLISH
            }
        },
        methods: {
            init: function() {
                this.callParent(arguments);
                this.addMessageConfig({
                    sender: "NeedUpdatedGrid",
                    messageName: "NeedUpdatedGrid"
                });
            },
            afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
            }
        }
    };
});

А там, где хотите обновить грид, делаете так:

init: function() {
  this.callParent(arguments);
  this.sandbox.subscribe("NeedUpdatedGrid", this.myNameMethod, this);
},
myNameMethod: function(args) {
    this.reloadEntity();
}

Ну и соответственно не забудьте в схеме дописать 
блок messages, сообщение можете принимать как BROADCAST
 

На сервере через Элемент скрипты делаете так:
 

string messageText = "{\"любой текст, если хотите\"}";
string sender = "NeedUpdatedGrid";
MsgChannelUtilities.PostMessageToAll(sender, messageText);

Затем создаете клиентский модуль, такого содержания:
 

define("ClientMessageBridge", ["ConfigurationConstants"],
function(ConfigurationConstants) {
    return {
        messages: {
            "NeedUpdatedGrid": {
                "mode": Terrasoft.MessageMode.BROADCAST,
                "direction": Terrasoft.MessageDirectionType.PUBLISH
            }
        },
        methods: {
            init: function() {
                this.callParent(arguments);
                this.addMessageConfig({
                    sender: "NeedUpdatedGrid",
                    messageName: "NeedUpdatedGrid"
                });
            },
            afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
            }
        }
    };
});

А там, где хотите обновить грид, делаете так:

init: function() {
  this.callParent(arguments);
  this.sandbox.subscribe("NeedUpdatedGrid", this.myNameMethod, this);
},
myNameMethod: function(args) {
    this.reloadEntity();
}

Ну и соответственно не забудьте в схеме дописать 
блок messages, сообщение можете принимать как BROADCAST
 

Литвинко Павел,

Спасибо, попробую.
А зачем эта функция?

afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
                }

И модуль этой же функции должен от кого-то наследоваться?

Литвинко Павел,

На сервере через Элемент скрипты делаете так:

Под - "...Элемент скрипты..." , вы имели ввиду элемент задание сценарий?
Если это так, то следующий код там неприменим:

MsgChannelUtilities.PostMessageToAll(sender, messageText);

Так как объект MsgChannelUtilities отсутствует в данном контексте.

Андреев Андрей Сергеевич пишет:

Литвинко Павел,

На сервере через Элемент скрипты делаете так:

Под - "...Элемент скрипты..." , вы имели ввиду элемент задание сценарий?
Если это так, то следующий код там неприменим:

MsgChannelUtilities.<span>PostMessageToAll</span><span>(</span>sender, messageText<span>)</span><span>;</span>

Так как объект MsgChannelUtilities отсутствует в данном контексте.

ЕщеСвернуть

Да, задание сценарий 

Андреев Андрей Сергеевич пишет:

Литвинко Павел,

Спасибо, попробую.
А зачем эта функция?


 
afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
                }

И модуль этой же функции должен от кого-то наследоваться?

https://academy.terrasoft.ua/documents/technic-sdk/7-13/clientmessagebr… 

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

Подскажите, как из бизнес-процесса сделать запись в центр уведомлений (нужно записать текст ошибки для админа при работе интеграции сделанной с  помощью бизнес-процесса)?

У меня такой же вопрос

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

Prime Source,

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

Обсуждалось тут описано тут

Григорий Чех,

 

Можно найти эту запись в базе в таблице Reminding и посмотреть значение поля NotificationTypeId и других интересующих полей.

Григорий Чех,

 Можно ли отправить уведомление не конкретному человеку а группе, к примеру пользователям с правами System Administrator ?

Нет, поле «Кому» ссылается только на контакт.

Зверев Александр,

 это я тоже заметил. Но есть же наверно возможность уведомления в центр уведомлений отправлять группе? Или все же это только поименно и других нет способов?

Почему Вы считаете, что такая возможность есть? Список полей объекта виден в дизайнере, там поля «Группа пользователей» нет.

Зверев Александр,

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

Prime Source,

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

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

Зверев Александр,

во, отличная идея про канал. Теперь только нужно подумать как из процесса в канал отправить сообщение))

См. здесь.

Войдите или зарегистрируйтесь, чтобы комментировать