параметры БП
7.12
service

У меня есть элемент "Читать данные", у него есть ИД, Имя, и другие параметры сущности, которую считали. Как получить значения этих параметров из кода в элементе "Задание-сценарий"?Изображение удалено.

Нравится

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

Добрый день! вот ссылка на статью https://academy.terrasoft.ru/documents/technic-bpms/7-12/element-proces…

 

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

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

Get<T>(string path)

где:

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

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

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

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

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

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

Добрый день! вот ссылка на статью https://academy.terrasoft.ru/documents/technic-bpms/7-12/element-proces…

 

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

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

Get<T>(string path)

где:

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

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

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

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

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

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

Вы можете нужные Вам значения из элемента "Читать данные" добавить в параметры бизнес-процесса (БП), а потом в элементе "Задание-сценарий" вычитать их из параметров БП с помощью метода Get

Показать все комментарии
параметры БП
коллекция объектов
7.10
Ninja Forms

Добрый день!

В процессе использую параметр с типом Коллекция объектов. Значение данного параметра передается в процесс из родительского процесса. Далее в элементе с типом задание сценарий происходит некая работа с коллекцией (по сути коллекция передается в другой метод, сами ее значения не меняются). После чего по условию БП либо идет дальше, либо возвращается в данный же кубик задание сценарий и должен снова вызвать метод и передать данную коллекцию в качестве параметра. Однако, при повторном заходе в задание сценарий, БП падает с ошибкой 

Terrasoft.Common.ItemNotFoundException: Элемент с идентификатором "00000000-0000-0000-0000-000000000000" не найден
   в Terrasoft.Core.ManagerItemCollection`1.GetByUId(Guid uid)
   в Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   в Terrasoft.Core.Process.GetGoldWarrantyAmountProcess.get_ProductConditionCollection()
   в Terrasoft.Core.Process.GetGoldWarrantyAmountProcess.ScriptTask1Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Насколько я понимаю, это именно ошибка чтения параметра - коллекции объектов. 

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

Нравится

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

Судя по тому, что в первый раз передалось нормально, потом значение переменной кто-то очищает. Если есть возможность, можно произвести отладку и посмотреть, какое значение в разные моменты находится в параметре.

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

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

Показать все комментарии
Бизнес-процессы
параметры БП
7.11
bank_customer_journey

Здравствуйте! Возникла следующая задача: есть БП, в нём выполняется шарпный код, по таймеру, и при завершении процесса, в параметры этого процесса, записываются значения, и мне необходимо после выполнения этого БП, на клиенте анализировать эти параметры и выводить соответствующие информационные уведомления. Но я чего-то не пойму как передать в callback, выполнения БП, эти самые параметры?

Нравится

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

Здравствуйте! Попробуйте передавать по каналу web-socket

Код на стороне БП

var userConnection = Get&lt;UserConnection&gt;("UserConnection");
var messageToUser = Get&lt;string&gt;("AbMessageToUser");
Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, "AbCreatingSmsAudienceProcess", messageToUser);
return true;

На клиенте следующий код

 

define("ContactSectionV2", [], function() {
	return {
		entitySchemaName: "Contact",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			init: function () {
				this.callParent(arguments);
				this.subscriptionFunction();
			},
			subscriptionFunction: function() {
				Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
				this.onAbCreatingSmsAudienceProcessMessage, this);
			},
			onAbCreatingSmsAudienceProcessMessage: function(scope, message) {
				if (!message || message.Header.Sender !== "AbCreatingSmsAudienceProcess") {
					return;
				}
				var message2 = message.Body;
				if (!this.Ext.isEmpty(message2)) {
					this.Terrasoft.showInformation(message2);
				}
			}
		},
		messages: {}
	};
});

 

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

 

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

Добрый день.

Запускаю  БП из действия раздела:

var selectedRows = this.get("SelectedRows");
var accounts = selectedRows.join();
var processName = "UsrChangeAccountOwnerProcess";
 
var params = {
	AccountIds: accounts
};
ProcessModuleUtilities.runProcess(processName, params);



При запуске БП по выделенным записям (более 50 записей) возвращается ошибка:

https://yadi.sk/i/k7KXj5VE3PTDoj

Предположительно ошибка связана с длиной строки с идентификаторами выделенных записей, которая передаётся в параметр процесса. Т.к. если выделено до 50 записей, то БП запускается. 

Вопросы:

Как снять ограничение на длину параметра?

Можно ли запустить БП с использованием callService, передав параметры в виде jsonData, а не в url?

Нравится

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

Добрый день. Передать параметры в виде JSON строки, к сожалению, не выйдет. Вам стоит смотреть в сторону передачи фильтров, по которым можно будет выбрать данные записи. Пример можно глянуть в реализации мультиделита. Серверный код дисериализации находится в GridUtilitiesService DeleteRecordsAsync.

Терещук Сергей,

А с чем связана описанная мной проблема?

Коновалов Игорь,

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

maxReceivedMessageSize. Но я могу и ошибаться.

Показать все комментарии
7.x
автоматизация бизнес-процессов
параметры БП
Технические вопросы
5.x

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

Необходима помощь в решении нескольких тривиальных задач при построении БП (решение желательно листинг простенький или ссылку)

1) Как программно через элемент БП задание-сценарий получить ID созданной записи из элемента Страница редактирования

2) Как программно через элемент БП задание-сценарий получить/установить параметр БП

3) Как в условном потоке написать условие ID!=null, при том что ID с типом уникальный идентификатор

Данные вопросы возникли при решении простой задачи: при входе в подпроцесс на него передается AccountID -> при старте БП идет проверка AccountID есть/нет
если есть, то идем к шагу задачи
если нет, то идем на шаг с создание Контрагента

На данный момент реализация проверки на AccountID!=null довольно убогая... через чтение данных получаю count записей с id = AccountID и в условном потоке проверяю сравнением...

p.s. так же наблюдается некоторая странность при запуске подпроцесса. Первая задача падает в расписание, а не появляется сразу на экран (остальные задачи в подпроцессе отрабатывают нормально), возможно есть какая-нибудь настройка или прием?

p.p.s. Я пытался найти описание методов для получения коллекции параметров БП в SDK, но не нашел ) если они там есть и я просто проглядел - скиньте ссылку

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

Нравится

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

Артем, добрый день.

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

Но, т.к. в таком случае, Вам бы пришлось создать два БП, рассмотрим конкретно Ваш кейс.
БП будет следующим:

Стартовое сообщение - сигнал на объекте "Активность" после добавления новой записи.
Далее в элементе "Чтение данных" считываем все поля записи, по которой был запущен процесс:

После этого, создаем условный поток к элементу "Создание нового контрагента", условие следующее:

ReadDataUserTask1.ResultEntity.GetTypedColumnValue<Guid>("Account.Id") != Guid.Empty

где ReadDataUserTask1 - название элемента "Чтение данных".

и потом добавляем поток по умолчанию к элементу "Создать новую задачу".

В принципе это всё.

Если будут вопросы - обращайтесь.

Спасибо, Дмитрий!
Вопрос N3 можно считать решенным ) (не знал что в условии можно использовать C#)

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

если при старте родительского БП AccountID был заполнен (была связь Лида с контрагентом), то передавать далее в подпроцесс необходимо именно его
, а если при старте родительского БП AccountID пустой (например Лида квалифицировали как контакт и поле Контрагент пустое), то передавать далее в подпроцесс необходимо идентификатор записи из шага "Создайте нового контрагента".

Можно конечно решить вопрос с помощью конструктора, но это избыточность в чистом виде =\ куда проще мне было бы вставить после шага "Создайте нового контрагента" скриптик, который просто заполнил бы параметр процесса AccountID идентификатором созданной записи из шага "Создайте нового контрагента" + я практически на 100% уверен что в будущем еще не раз придется работать с параметрами БП через скрипт.

Так что вопросы 1,2 все еще актуальны

Артём, добрый день.

Если Вы добавили в структуру процесса параметр MyParam с типом GUID, то обратиться к нему можно просто:

MyParam = new Guid(stringGuid);
Guid fromParam = MyParam;

это по второму вопросу. Т.е. обращаемся в любом скрипте процесса по имени параметра.

По первому вопросу:

Если Вы раскроете действие "Открыть карточку редактирования", то увидите там параметр RecordId, с него и считывайте:

Guid recordId = OpenPageElement1.RecordId;

Спасибо Дмитрий!
На этот раз все вопросы сняты

С уважением,
Волков Артем

Показать все комментарии
параметры БП
Бизнес-процессы
Разработка

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

Первый элемент БП - Открытие окна (создается новый документ).
Второй элемент БП - Задача.

Подскажите пожалуйста, как передать из первого элемента значение какого-либо поля (в моем случае Контрагента) во второй элемент и как передать ID этого созданного документа, т.е. чтобы в задаче, которая создается после документа, в поле Документ стоял созданный документ.

Нравится

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

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

Необходимо создать параметр диаграммы AccountID, параметр DocumentID уже должен быть создан автоматически, если нет - создайте и его:

1

Далее, настройте соответствие параметров на первом шаге:

2

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

Показать все комментарии
Автоматический запуск процессов
параметры БП

При автоматическом запуске процессов
1
есть вопрос, как получить параметр, по которому мы запустили процесс
К примеру, мы создали условия для автоматического запуска по созданию записей в реестре, и хотим получить ID записи, по которой мы запустили процесс.
Для этого на элементе Start БП определим событие OnStart
2
Создадим параметр диаграммы AutoID
3
В коде

function Item1OnStart(StartItem) {
        var ParentDiagram = GetDiagramByItem(StartItem);
        var RecordID = WFGetParamValue(ParentDiagram, 'AutoID');
}

После чего имеем ID записи в переменной RecordID

Нравится

Поделиться

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

Здравствуйте! Делаю так, как описано, но GetDiagramByItem(StartItem) выдает ошибку, пишет "предполагается наличие объекта".

Решение найдено, нужно было добавить в используемые скрипты scr_WorkflowUtils.

Добавлю маленький комментарий, если есть желание дополнительно записать в параметры значения по ключевому полю RecordID, разумно воспользоваться функцией GetDatasetFieldValueByID с scr_DB

var CustomerID = GetDatasetFieldValueByID('ds_Opportunity',RecordID ,'CustomerID'); //Подключаем scr_DB, 
WFSetParamValue(StartItem,'AccountID',CustomerID);

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

Здравствуйте, Василий.

Сделайте точно также как описано в этой теме. Т.е. создайте параметр диаграммы типа строка с именем, к примеру, StartedProductID.

Далее, определите событие OnStart для элемента Start. И в коде считайте значение этого параметра (в нем и будет хранится ID продукта, по которому запущен БП):

function Item1OnStart(StartItem) {
        var ParentDiagram = GetDiagramByItem(StartItem);
        var RecordID = WFGetParamValue(ParentDiagram, 'StartedProductID');
}

А если не получится так сделать как говорит Дмитрий, назовите параметр AutoID :wink:

   var RecordID = WFGetParamValue(ParentDiagram, 'AutoID');

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

Кирилл, заполняется этот параметр (AutoID) в момент старта процесса (если такой параметр диаграммы существует).
Сам процесс заполнения параметра реализован при создании триггера на таблицу, который при срабатывании передает значение ID записи по которой он сработал в БП.

Так значит нужно именно AutoID, а не к примеру StartedProductID? :smile:

Да, именно так. :)

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

как всегда, когда что-нибудь спросишь ответ сам находится

Показать все комментарии
бизнес-процесс
параметры БП
Бизнес-процессы
Разработка

При работе с дизайнером бизнес-процессов столкнулись с интересным моментом:
1. В элементе "чтение/запись данных" создаем логический параметр со значением "истина" и закрываем элемент;
2. Снова открываем элемент и меняем значение любого другого праметра, закрываем элемент.
3. Снова же открываем элемент чтения/записи, значение логического параметра равняется 0.

Нравится

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

Фича на исправление:)
А в какой версии?

3.3.2.61

Данная проблема возникает из-за различия в форматах булевого поля: в датасете его значения хранятся как 0 или 1 - соответственно typeof(Value) вернёт "number", а в скрипте происходит проверка на тип "boolean" - следовательно, значение должно быть true либо false.

Возможное обходное решение - обрабатывать не числовые значения 0 и 1, а строки "True" и "False". Маловероятно, что в системе найдутся какие-либо сущности с такими названиями. Для реализации необходимо следующее:

1) Изменить блок, соответствующий булевому значению, в функции SaveData скрипта wnd_WorkflowParameterMapEditScript следующим образом:

case wptBool:
	Dataset('BoolValue') = edtBoolValue.IsChecked;
	Dataset('Value') = edtBoolValue.IsChecked ? 'True' : 'False';
	break;

2) Изменить блок, соответствующий строковому значению, в функции ReadDatasetFields скрипта wnd_ReadWriteDataEditScript:

if (typeof(Value) == 'string') {
	if ((Value != 'True') && (Value != 'False')) {
		Record.ParamType = wptString;
		Record.Value = Record.StringValue = Value;
	} else {
		Record.ParamType = wptBool;
		Record.Value = Record.BoolValue = Value == 'True' ? true : false;
	}
}

3) Наконец, внести изменения в блок для булевого значения функции SaveDatasetFields того же скрипта wnd_ReadWriteDataEditScript:

case wptBool:
	ParameterMap.Value = Record.Value;
Показать все комментарии
параметры БП
Бизнес-процессы
Разработка

Уважаемые Гуру бизнес-процессов! Возник вопрос, по которому очень хотелось бы услышать совет и рекомендацию, как лучше и как правильно.
Terrasoft 3.3.2.125.
Итак, для создания например счета мы используем action "Открыть окно". Назначаем окно wnd_InvoiceEdit, задаем для него набор параметров (в "Свойствах действия"), в том числе "Планируемую дату" - будем проставлять ее как текущую или впоследствии сделаем что-то хитрее.

Параметр этот создаем с типом "Дата", что логично

Тем не менее, отображается сгенерированный параметр как тип "Строка" в списке параметров (реестр "Параметры действия" для данного элемента).

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

Назначаем на событие данного элемента обработчик такого примерно вида:

function Action4OnBeforeExecute(ActionItem) {
        var Diagram = GetDiagramByItem(ActionItem);
        var StartDate = GetTodayDate();
        WFSetParamsMapItemValue(ActionItem, 'Field_StartDate', StartDate.getVarDate());
}

И вот тут вопрос - так как не проставляется в это поле желаемая дата, увы... (кэш чистим, стандартное заполнение поля в карточке отключаем, либо просто берем произвольное/новое поле и получается то же самое...)
Поле с датой взято для примера, аналогично необходимо назначать значения различных полей.
Интересно, как для окон, вызываемых этим action передавать значения параметров - без использования связи их с параметрами диаграммы (таким образом, естественно, все получается).

Нравится

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

Попробуйте вместо WFSetParamsMapItemValue использовать WFSetParamValue:

function Action4OnBeforeExecute(ActionItem) {
        var Diagram = GetDiagramByItem(ActionItem);
        var StartDate = GetTodayDate();
        WFSetParamValue(ActionItem, 'Field_StartDate', StartDate.getVarDate());
}

"Лабьяк Олег Игоревич" написал:Попробуйте вместо WFSetParamsMapItemValue использовать WFSetParamValue:

И ведь сработало, спасибо!

Раз с эти вопросом все стало ясно, подниму еще одну тему - раньше использовались actions Счет, Продажа и прочие - для них передавалось в датасет значение WorkflowItemID, его обработка в скрипте карточек осталась по сей день. При использовании "Открыть окно" такое значение не передается, соответственно объекты как бы оторваны от БП - есть ли уже задуманная, внесенная в систему "штатная" альтернатива или можно использовать любые способы по желанию - атрибут для вызываемого окна передавать и т.д. и писать для него свои обработчики в коде карточки?

Можно сделать проще - перед открытием окна элемента "Открыть окно" заполнить элемент с кодом WorkflowItemID атрибута DefaultValues этого окна соответствующим значением. Если в датасете окна есть такое поле, оно будет заполнено, иначе - ничего не произойдёт.

Изменения нужно внести в функцию ExecuteOpenWindow скрипта wa_OpenWindowScript:

function ExecuteOpenWindow(WindowType, ActionItem, WorkflowAction, 
	WorkflowItemID) {
	var WindowUSI = WFGetParamValue(ActionItem, 'WindowUSI', '');
	if (!WindowUSI) {
		ShowErrorDialog(WindowServiceIsEmptyError);
		return false;
	}
	var ServiceInfo = Services.InformationsByUSI(WindowUSI);
	if (!ServiceInfo) {
		ShowErrorDialog(FormatStr(WindowServiceNotFoundError, WindowUSI));
		return false;
	}
	var Window = GetSingleItemByCode(ServiceInfo.USI, 'OpenWindow');
 
	ProcessCloseOptions(Window, ActionItem, WorkflowAction, WorkflowItemID);
 
	// Заполнение значения по умолчанию для поля WorkflowItemID
	var DefaultValues = GetNewDictionary();
	DefaultValues('WorkflowItemID') = WorkflowItemID;
	Window.Attributes('DefaultValues') = DefaultValues;
	// Заполнение завершено
 
	SetAdditionalWindowAttributes(Window, ActionItem);
 
	if (WindowType == owtEdit) {
		var IsNew = WFGetParamValue(ActionItem, 'CreateNewRecord', true);
		var RecordID = WFGetParamValue(ActionItem, 'RecordID', GUID_NULL);
		Window.Attributes('IsNew') = IsNew;
		Window.Attributes('RecordID') = RecordID ? RecordID : GUID_NULL;
		if (!IsNew && IsEmptyGUID(RecordID)) {
			ShowErrorDialog("Не указана запись для редактирования");
			return false;
		}
	}
........
}

Спасибо Вам за замечание, информация по нему будет передана в департамент разработки продуктов.

Ага, ценное дополнение, спасибо вновь! сейчас применим
+ по ошибке с параметром Дата письмо я отослал на суппорт

Да, мы получили Ваше письмо. В ближайшее время ожидайте ответ.

Олег, спасибо за оперативность! уже получил ответ, окно параметров стало открываться корректно

Показать все комментарии
ввод
параметры БП
пользователь
Бизнес-процессы
Разработка

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

Стоит задача получать от пользователя на определенном этапе некоторые данные, чтобы в дальнейшем их использовать в БП. В частности, нужно использовать какой-нибудь элемент для ввода даты, CalendarControl, например, и NumericEdit.

В БД эти данные сохранять не нужно (по крайней мере, пока), поэтому, как я понимаю, достаточно их записать в параметры БП. Однако сделать это не удается, я пытаюсь обработать событие OnClick единственной в окне кнопки ОК. Вопросы:

1. Как получить запущенный экземпляр БП из обработчика нажатия кнопки? Как я понимаю, GetDiagramByItem() тут не подходит, так же как и GetNewItemByUSI().

2. Для установки параметров диаграммы кажутся подходящими ф-ии WFSetParamValueDirect и WFSetParamValue. В чем их отличия?

3. Как работать с датой из CalendarControl?

4. Описан ли вообще где-то в документации DOM, ф-иям для БП? Без этого как-то очень тяжело :(

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

Нравится

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

Юрий, добрый день.

1) Среди элементов БП есть такой, как "Открытие окна". Вы можете создать своё окно для ввода значений, связать этот элемент с окном и сопоставить поля окна с параметрами бизнес-процесса. Другой вариант - добавить на диаграмму элемент "Скрипт", в обработчике события OnExecute которого написать примерно такой код:

var Window = Services.GetNewItemByUSI(<USI окна редактирования>);
Window.ShowModal();
var ResultValue = Window.ComponentsByName(<Название контрола>).DataField.Value;
............

Далее можно присвоить эти значения параметрам диаграммы.

2) Данные функции отличаются исключительно набором входящих параметров: функция WFSetParamValueDirect работает непосредственно с коллекцией параметров, а WFSetParamValue получает на вход элемент диаграммы (параметры которого извлекаются уже внутри функции). В остальном - никаких отличий.

3) Получить дату из компонента ICalendarControl просто:

var ResultDate = Window.ComponentsByName('CalendarControl').Value;

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

4) Информацию о свойствах и методах элемента БП и диаграммы можно найти в SDK на нашем сайте. События определённых элементов БП, а также другая информация о создании БП описаны в Руководстве администратора, которое поставляется вместе с установочным пакетом системы Terrasoft. Различного рода примеры, ответы на вопросы и другую информацию Вы можете найти и на нашем комьюнити.

Спасибо, со скриптом все получилось!

Я как раз и пользовался "Открытием окна", и думал про связывание параметров диаграммы с полями данных. Однако в окне настройки блока это поле пустое, а кнопки "Добавить" и прочие неактивны (см. скрин). С чем это может бызть связано?

Возможно, Ваше окно wnd_InsertPaymentDate - наследник wnd_BaseEdit, а не wnd_BaseDBEdit, то есть, в нём нет ссылки на датасет. Попробуйте подставить окно с датасетом, всё должно быть корректно. Если же используются контролы без привязки к датасету, тогда лучше вызывать окно из скрипта.

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