Всем доброго времени суток, хотелось бы немного прояснить вопрос.
Пробую вызывать веб-сервис из бизнес-процесса.
Через Postman, прохожу аунтентификацию через .../ServiceModel/AuthService.svc/Login, далее вызываю .../0/odata - получаю перечень таблиц и статус 200, то же самое через адресную строку браузера.

Но если вызывать этот веб-сервис через бизнес-процесс, кроме HTTP Error 401.1 - Unauthorized или Invalid user name or password не получил.
В бизнес-процессе пробовал вызывать сначала веб-сервис .../ServiceModel/AuthService.svc получать через параметры процесса BPMCSRF  - без результата.

Через веб-сервис .../0/ServiceModel/EntityDataService.svc/  получаю статус 200 и ответ в виде XML.


Суть вопроса почему .../0/odata возвращает статус 200 и данные через постман и браузер, а через бизнес-процесс возращает ошибку.
Приложение on-site. 

 

Нравится

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

Сергей,

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

Олег Нефедьев, спасибо.

Этот момент описан в документации, с аутентификацией с логином и паролем и в константах (пароль в зашифрованой константе) и в явном виде не работало, пробовал разные комбинации.

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

Добрый день!

Необходимо реализовать следующую задачу.

В моем пакете создан Исходный код следующего содержания:

На странице редактирования записи имеется поле "Скрипт проверки":

Каким образом я могу с помощью бизнес-процесса запустить этот скрипт и выполнить его таким образом, чтобы у меня запустился код из первого скрина и получить значение true? (само содержание Скрипта проверки не обязательно должно быть именно таким)

Нравится

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

Думаю, Вам нужно использовать Activator.CreateInstance()

Думаю, Вам нужно использовать Activator.CreateInstance()

Безуглый Кирилл Александрович,

А можно немного подробней...

Pavel Litvinovich, 

Вот пример кода:

using System;
using System.Reflection;

namespace ActivatorCreateInstance
{
    class Program
    {
        static void Main(string[] args) {
            var resultOne = Invoker.CreateAndInvoke("ActivatorCreateInstance.MyClass", null, "MethodOne", null);
            var resultTwo = Invoker.CreateAndInvoke("ActivatorCreateInstance.MyClass", null, "MethodTwo", null);
            Console.WriteLine(resultOne);
            Console.WriteLine(resultTwo);
            Console.ReadKey(true);
        }
    }

    public static class Invoker
    {
        public static object CreateAndInvoke(string typeName, object[] constructorArgs, string methodName, object[] methodArgs) {
            Type type = Type.GetType(typeName);
            object instance = Activator.CreateInstance(type, constructorArgs);

            MethodInfo method = type.GetMethod(methodName);
            return method.Invoke(instance, methodArgs);
        }
    }

    public class MyClass
    {
        public static bool MethodOne() {
            return true;
        }

        public static bool MethodTwo() {
            return false;
        }
    }
}
 

При помощи элемента БП "Читать данные" читаете поле "Скрипт проверки"

Безуглый Кирилл Александрович,

Спасибо!

Безуглый Кирилл Александрович,

Данный код необходимо вставить в элемент Задание-сценарий в БП?

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

Безуглый Кирилл Александрович,

Спасибо! Разобрался!

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

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

Нравится

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

Добрый день!

Прошу Вас более детально описать Вашу задачу и какие трудности у Вас возникли. Возможно Вы имеете в виду работу с мультиязычными шаблонами?

Для работы с мультиязычными email-сообщениями Вам необходимо выполнить в системе следующие действия:
1. Настроить языки общения с клиентами. Это язык, на котором контакту будут отправляться email-уведомления. Для указания языка общения и формирования мультиязычных шаблонов используются значения справочника [Языки общения].
 
2. Настроить мультиязычные шаблоны. Для этого, Вам необходимо добавить локализации для используемого шаблона.
Если необходимо добавить в шаблон несколько языков, повторите шаги 3 и 4 для каждой локализации.  В результате на странице шаблона появится несколько вкладок для формирования писем на выбранных языках.

При отправке, язык определяется следующим образом:​​​​​​​
1. Заполнен ли на странице контакта язык общения.
•Если поле заполнено, то адресату будет отправлен шаблон на его языке общения.
•Если поле не заполнено, то будет выполнен переход на следующий шаг проверки.
2. Заполнена ли системная настройка “Язык сообщений по умолчанию”.

•Если системная настройка заполнена, то адресату будет отправлено письмо на языке, установленном в системной настройке.

•Если системная настройка не заполнена, то адресату будет отправлено письмо на языке системы по умолчанию.

Более подробно с логикой работы мультиязычных шаблонов Вы можете ознакомиться на Академии: https://academy.terrasoft.ru/documents/base/7-16/kak-nastroit-otpravku-…

 

 

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

Добрый день!

Я запускаю БП из кода (при нажатии на соответствующую кнопку в Действия) с помощью ProcessModuleUtilities. 

БП должен добавлять записи на деталь в карточку редактирования с которой запускается БП.

Как сделать так, чтобы считывался Id карточки редактирования из которой запускается БП?

Вот скрин БП.

Нравится

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

В БП создать входящий параметр. Например RecordId с типом уникальный идентификатор.

Передать Id записи в свойство parameters в метод ProcessModuleUtilities.executeProcess.

someMethod: function() {
	this.customRunProcess("SomeProcessName", { RecordId: this.$Id });
},
 
customRunProcess: function(name, parameters, callback) {
	ProcessModuleUtilities.executeProcess({
		sysProcessName: name,
		callback: function() {
			this.hideBodyMask();
			Ext.callback(callback, this);
		},
		scope: this,
		parameters: parameters
	});
},

 

В БП создать входящий параметр. Например RecordId с типом уникальный идентификатор.

Передать Id записи в свойство parameters в метод ProcessModuleUtilities.executeProcess.

someMethod: function() {
	this.customRunProcess("SomeProcessName", { RecordId: this.$Id });
},
 
customRunProcess: function(name, parameters, callback) {
	ProcessModuleUtilities.executeProcess({
		sysProcessName: name,
		callback: function() {
			this.hideBodyMask();
			Ext.callback(callback, this);
		},
		scope: this,
		parameters: parameters
	});
},

 

Владислав Литвинчук,

Спасибо!

Владислав Литвинчук,

Подскажите еще один момент. Если мне еще необходимо помимо Id карточки получить значение одного из справочных полей. Как необходимо изменить код?

Павел, если карточка сохранена, значения её полей есть в базе. По Id можно вычитать в самом БП элементом чтения данных.

Pavel Litvinovich пишет:

Владислав Литвинчук,

Подскажите еще один момент. Если мне еще необходимо помимо Id карточки получить значение одного из справочных полей. Как необходимо изменить код?

Как сказал Александр, можно прямо в БП считать данные из БД.

Либо добавить еще входящий параметр, и дополнительно его передать со страницы в объект parameters при вызове процесса.

Владислав Литвинчук,

На подобии этого?

someMethod: function() {
	this.customRunProcess("SomeProcessName", { RecordId: this.$Id });
    this.customRunProcess("SomeProcessName2", { RecordPeriod: this.$UsrPeriod });
},
 
customRunProcess: function(name, parameters, callback) {
	ProcessModuleUtilities.executeProcess({
		sysProcessName: name,
		callback: function() {
			this.hideBodyMask();
			Ext.callback(callback, this);
		},
		scope: this,
		parameters: parameters
	});
},

 

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

Да, точно. Так и сделал. Спасибо!

Pavel Litvinovich пишет:

Владислав Литвинчук,

На подобии этого?

Уже прочли в БП - ок.
Если бы передавать из страницы, то так:

 

someMethod: function() {
    this.customRunProcess("SomeProcessName", { 
        RecordId: this.$Id,
        RecordPeriod: this.$UsrPeriod // Если это справочное поле, то this.$UsrPeriod.value
    });
},
 
customRunProcess: function(name, parameters, callback) {
	ProcessModuleUtilities.executeProcess({
		sysProcessName: name,
		callback: function() {
			this.hideBodyMask();
			Ext.callback(callback, this);
		},
		scope: this,
		parameters: parameters
	});
},

 

Владислав Литвинчук,

Спасибо за помощь!

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

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

Нравится

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

Добрый день. Попробуйте включить из в справочник деактивированные процесс и перенести значения справочника вместе с процессами

Виктор, объект раздела «Библиотека процессов» строится по view VwProcessLib, поле «Активен» там вычисляется так:

,[Enabled] =
	CAST(CASE
		WHEN EXISTS (
			SELECT 1
			FROM [SysProcessDisabled]
			WHERE
				[SysProcessDisabled].[SysSchemaId] IN([VwSysSchemaInWorkspace].[Id], [VwSysSchemaInWorkspace].[ParentId]))
			THEN 0
		ELSE 1
	END AS BIT)

То есть для переноса признака неактивности нужно перенести на новое место записи в объекте «Деактивированные процессы» (SysProcessDisabled).

 

Или создать на новом месте записи скриптом вставки в эту таблицу, как описано тут, и прикрепить скрипт к пакету.

Зверев Александр пишет:
То есть для переноса признака неактивности нужно перенести на новое место записи в объекте «Деактивированные процессы» (SysProcessDisabled)

Это запрещает запускать процессы вручную, но если процесс стартует по сигналу, то его надо именно деактивировать, а добавление в объект "Деактивированные процессы" не поможет. 

Владимир, насколько понял, у Виктора не переносится именно признак.

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

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

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

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

Александр, зарегистрировал пожелание, но не совсем понимаю, как такое могло бы выглядеть. Есть веб-сервис запуска процессов с нужными значениями параметров, его можно запустить из клиентской логики при выполнении нужного события. Как это делается, можно увидеть в ProcessModuleUtilities:

PROCESS_ENGINE_SERVICE_NAME: "ServiceModel/ProcessEngineService.svc",
...
		_runProcessOld: function(processName, parameters, callback, scope) {
			let queryString = "";
			if (parameters) {
				const queryItems = _.map(parameters, function(value, name) {
					return name + "=" + value;
				}, this);
				queryString = "?" + queryItems.join("&");
			}
			this.callService({
				serviceName: this.PROCESS_ENGINE_SERVICE_NAME,
				methodName: processName + "/RunProcess" + queryString
			}, callback, scope);
		},

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

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

Добрый день!

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

То есть аналитик смог бы настраивать текст и варианты ответов. И после этого элемента использовать условные потоки.

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

Елизавета, уже зафиксирована идея «Возможность открывать страницы по процессу/показывать сообщения как всплывающее/модальное окно / уведомление (не путать с панелью уведомлений)». 

 

Если же первично для Вас не отображение в виде модального окна, а получение от пользователя ответа на один из нескольких вариантов, можно использовать стандартный элемент БП «Автогенерируемая страница», где добавить две кнопки, привязав к ним условные потоки.

Отличие от модального будет в том, что такое окно будет в верхней части экрана и его можно будет по кнопке «Закрыть» свернуть в правую панель, чтобы дать ответ и продолжить выполнение позже.

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

Александр, да, с автогенерируемой страницей понятно, "Вопрос пользователю"  тоже подойдет для этой цели. Но идея именно в том, чтобы не открывать новую страницу, а выводить маленькое одно модальное окно)  Для глаз пользователя есть разница: открывается новая страница или же на старой появляется модальное окно.

Здорово, что идея уже зафиксирована, будем очень ждать реализации.

Елизавета, такого на уровне элементов БП, а не написанием кода на странице, пока нет, идея заведена.

Караваева Елизавета Дмитриевна,

Елизавета, по ссылке есть подходящий темплейт

https://marketplace.creatio.com/template/popup-element-business-process…

Константин, спасибо за уточнение. Тогда уже лучше его же отсюда.

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

Добрый день!

Есть задача - добавлять в аудиторию письма (элемент "отправка письма" в процессе) коллекцию получателей (контакты, или их email'ы)

 

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

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

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

Вопрос - каким образом задачу можно решить средствами low-code платформы? :)

Нравится

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

Доброе утро.

 

Средствами low-code можно попробовать реализовать с помощью обработки коллекций данных в бизнес-процессах через многоэкземплярное выполнение элемента [ Подпроцесс ].

Доброе утро.

 

Средствами low-code можно попробовать реализовать с помощью обработки коллекций данных в бизнес-процессах через многоэкземплярное выполнение элемента [ Подпроцесс ].

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

Баг/фича не пойму, но по мне это серьезная недоработка. В элементе БП Подпроцесс(действие вызов) система предлагает выбрать не активные БП.

А теперь заходим в библиотеку процессов и видим что часть процессов не активны:

Предлагаю либо убрать не активные процессы, либо помечать в выборе что процесс не активен.

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

Алексей, не уверен, что это именно бага.

 

Более того, если процесс деактивирован, но его задать из другого активного процесса как подпроцесс, то он запустится.

 

Такое поведение является штатным, оно закладывалось в архитектуру. Активация-деактивация влияет только но запуск ОСНОВНОГО бизнес-процесса. Если он является подпроцессом другого основного процесса, то ничем не отличается по поведению от любого другого элемента БП. Потому что подпроцесс выполняется В КОНТЕКСТЕ ОСНОВНОГО БП. При выполнении подпроцесса учитывается только признак актуальной версии подпроцесса.

 

Если нужно добавить в выпадающий список фильтрацию по активности, заместите схему SubProcessPropertiesPage и там измените функцию getSchemaListFilter, значение свойства EnabledOnly:

/**
 * Returns schema list filter.
 * @protected
 * @param {Function} callback The callback function.
 * @param {Object} callback.filter Schemas filter.
 */
getSchemaListFilter: function(callback) {
	const element = this.get("ProcessElement");
	const schema = this.get("Schema") || {};
	const parentSchema = element.parentSchema;
	const excludedSchemaUId = schema.value;
	let filter = {
		PackageUId: Terrasoft.formatGUID(parentSchema.packageUId, "B"),
		EnabledOnly: true,//false,
		ExcludedSchemas: [Terrasoft.formatGUID(parentSchema.uId, "B")]
	};
	filter = Ext.apply(filter, element.schemaFilter);
	if (excludedSchemaUId) {
		filter.ExcludedSchemas.push(Terrasoft.formatGUID(excludedSchemaUId, "B"));
	}
	callback(filter);
},

Идею стандартно включить такой фильтр зафиксирую.

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

С версии 7.16 появилась возможность множественного запуска бизнес-процессов через элемент подпроцесс. 

 

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

 

Для этого необходимо создать процесс с двумя элементами: 

1. Элемент [Читать коллекцию] контактов у которых сегодня день рождения

2. Элемент [Подпроцесс] в который передать коллекцию контактов которых нужно поздравить.

 

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

 

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

Нравится

Поделиться

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