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

Нравится

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

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

Добрый день!

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

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 добавится возможность пользовательской настройки  последовательного запуска одинаковых подпроцессов по каждому элементу коллекции из параметра.

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

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

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

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

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

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, то есть, в нём нет ссылки на датасет. Попробуйте подставить окно с датасетом, всё должно быть корректно. Если же используются контролы без привязки к датасету, тогда лучше вызывать окно из скрипта.

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