Обновить страницу справочника с Бизнес процесса

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

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

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

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

Спасибо.

Нравится

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
	);
},

 

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

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