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

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

из-за чего есть необходимость обновить страницу справочника с Бизнес процесса.

Подскажите как это можно реализовать.

Спасибо.

Нравится

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

Добрый вечер.

 

Для передачи сообщений из серверной логики на клиент используется механизм ClientMessageBridge.

 

Также посмотрите обсуждение в этом посте.

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

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

спасибо за вариант, но уже все реализовано по другому, осталось проблему с рефрешем страницы решить.

попытался реализовать через ClientMessageBridge, хочу повторить пример со статьи, но опять есть вопрос, с Процесса сообщение уходит, в ClientMessageBridge попадает, но потом хочу получить сообщение в нужной мне схеме, 

я беру (BaseLookupConfigurationSection) так как этот функционал мне нужен при добавлении строки, но туда сообщение NewUserSet не доходит, как понять в чем ошибка?

Так же появляется ошибка:

Приведите Ваш код, который Вы разработали для этой функциональности.

1. В процессе добавил в Задание-сценарий:

string messageText = "{\"name\": \"" + "TestName" + "\"}";

string sender = "NewUserSet";

MsgChannelUtilities.PostMessageToAll(sender, messageText);

return true;

 

2. вот код замещающей схемы ClientMessageBridge :

 /**

 * @class ClientMessageBridge.ELBase

 * @extends ClientMessageBridge.NUI

 */

define(

    "ClientMessageBridge",

    ["ConfigurationConstants"],

    function(ConfigurationConstants) {

        return {

            messages: {

                "NewUserSet": {

                    "mode": Terrasoft.MessageMode.BROADCAST,

                    "direction": Terrasoft.MessageDirectionType.PUBLISH

                }

            },

            methods: {

                /**

                 * @inheritDoc ClientMessageBridge.UIv2#init

                 * @override

                 */

                init: function() {

                    this.callParent(arguments);

                    this.addCustomMessages();

                },

                

                addCustomMessages: function() {

                    this.addMessageConfig({

                        sender: "NewUserSet",

                        messageName: "NewUserSet"

                    });

                },

                afterPublishMessage: function(

                    sandboxMessageName,

                    webSocketBody,

                    result,

                    publishConfig) {

                    if (sandboxMessageName === "NewUserSet") {

                        var name = webSocketBody.name;

                        window.console.info("Опубликовано сообщение: " + sandboxMessageName +". Данные: name: " + name);

                    }

                }

            }

        };

    }

);

 

3. и код замещающей схемы BaseLookupConfigurationSection:

/**

 * @class BaseLookupConfigurationSection.ELBase

 * @extends BaseLookupConfigurationSection.UIv2

 */

define(

    "BaseLookupConfigurationSection",

    [],

    function(BusinessRuleModule, ConfigurationConstants) {

        return {

             messages: {

                "NewUserSet": {

                    "mode": Terrasoft.MessageMode.BROADCAST,

                    "direction": Terrasoft.MessageDirectionType.PUBLISH

                }

            },

            methods: {

                /**

                 * @inheritDoc GridUtilitiesV2.NUI#checkCanDelete

                 * @override

                 */

                checkCanDelete: function(items, callback, scope) {

                    this.callGetLookupDisabledActionsService(this.getParentMethod(this, arguments));

                },

                

                callGetLookupDisabledActionsService: function(callback) {

                    this.showBodyMask();

                    this.callService(

                        this.getGetLookupDisabledActionsServiceConfig(),

                        this.handleGetLookupDisabledActionsServiceResponse.bind(this, callback),

                        this

                    );

                },

                

                getGetLookupDisabledActionsServiceConfig: function() {

                    return {

                        serviceName: "GetUserRolesService",

                        methodName: "GetLookupDisabledActions",

                        data: {

                            lookupEntitySchemaUId: (this.getGridEntitySchema() || {}).uId

                        }

                    };

                },

                

                handleGetLookupDisabledActionsServiceResponse: function(callback, response) {

                    this.hideBodyMask();

                    if (response &&

                        response.success &&

                        !(response.data || []).includes(EL.const.db.EL_RECORD_ACTION.DELETE)) {

                        callback();

                    } else {

                        this.showInformationDialog(this.get("Resources.Strings.ForbiddenToEditLookupMessage"));

                    }

                },

// Инициализация схемы.

                init: function() {

                    this.callParent(arguments);

                    this.sandbox.subscribe("NewUserSet", this.onNewUserSet, this);

                },

// Обработчик события получения сообщения NewUserSet.

                onNewUserSet: function(args) {

                    var name = args.name;

                    window.console.info("Получено сообщение: NewUserSet. Данные: name: " + name);

                }

            }

        };

    }

);

 

А почему у Вас на странице, где будет ловиться сообщение, указано «"direction": Terrasoft.MessageDirectionType.PUBLISH», а не «"direction": Terrasoft.MessageDirectionType.SUBSCRIBE», как в примере? Не в этом ли дело?

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

вы правы, получилось, с этим спасибо, сообщение я получил.

но изначально я же хотел обновить страницу, и для этого я заменил вывод на this.reloadEntity();

получилось так:

// Инициализация схемы.

                init: function() {

                    this.callParent(arguments);

                    this.sandbox.subscribe("NewUserSet", this.onNewUserSet, this);

                },



                onNewUserSet: function(args) {

/*                   var name = args.name;

                   window.console.info("Получено сообщение: NewUserSet. Данные: name: " + name);*/

                    

                    this.reloadEntity();

                }

 

Но теперь я вижу что reloadEntity - undefined,

и получаю такую ошибку:

Функция reloadEntity задана в BasePageV2. Видимо, BaseLookupConfigurationSection, куда Вы добавляете обработчик, не наследуется от неё.

спасибо за ответ!

а возможно есть еще какие то варианты как обновить страницу?

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

reloadEntity: function(callback, scope) {
	Terrasoft.chain(
		this.initEntity,
		function(next) {
			this.onEntityInitialized();
			this.actualizeDcmActionsDashboard(next, this);
		},
		function() {
			this.updateDetails();
			this.sandbox.publish("CardRendered", null, [this.sandbox.id]);
			this.hideBodyMask();
			Ext.callback(callback, scope);
		},
		this
	);
},

 

ок, спасибо, буду что то думать.

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

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

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

Нравится

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

Ольга, можно либо самостоятельно реализовать логику вызова сервиса кодом (пример есть тут), либо настроить нужный веб-сервис в разделе обычным образом, а затем взять код запуска в схеме WebServiceUserTask и скопировать его в функцию в разрабатываемом БП вместе со всеми вспомогательными функциями и параметрами, которую затем запускайте в своём скрипте в цикле. Вот основная логика оттуда:

if (ServiceUrl == Guid.Empty || string.IsNullOrEmpty(ServiceMethod)) {
	return true;
}
string serviceUrl = (new Select(UserConnection)
	.Column("URL")
	.From("WebServiceURL")
	.Where("Id").IsEqual(new QueryParameter("Id", ServiceUrl)) as Select)
	.ExecuteScalar<string>();
HttpWebRequest webRequest = CreateWebRequest(serviceUrl, ServiceMethod);
string Request = @"<soap:Envelope xmlns:soap=""http://www.w3.org/2003/05/soap-envelope"" xmlns:web=""http://www.webserviceX.NET/"">
<soap:Header/>
	<soap:Body>";
Request += RequestBodyInternal;
Request += @"
	</soap:Body>
</soap:Envelope>";
webRequest.ContentLength = Request.Length;
using (Stream stream = webRequest.GetRequestStream()) {
	using (StreamWriter streamWriter = new StreamWriter(stream)) {
		streamWriter.Write(Request);
		streamWriter.Close();
	}
}
using (WebResponse response = webRequest.GetResponse()) {
	using (StreamReader rd = new StreamReader(response.GetResponseStream())) { 
		Responce = rd.ReadToEnd();
	}
}
PrepareResponceResult();
if (!IsLoggingRequestAndResponce) {
	Request = string.Empty;
	Responce = string.Empty;
}
return true;

 

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