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

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

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

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

Спасибо.

Нравится

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

 

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

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

Добрый день. Возникла необходимость в bpmonline 7.5, в контактах, на детали "средства связи", динамически менять список социальных сетей, в зависимости от типа контакта. А также менять тип кнопки добавить (точнее убирать типы адресов и оставлять только кнопку добавить без выпадающего списка), детали "Адрес", тоже в зависимости от типа контакта. Проблема в том что скрипты выполняются только при инициализации страницы, т.е. они работают только если полностью перезагрузить страницу. Пробовал методы updateDetail, reloadDetail. Не работает, хотя reloadDetail, не отработал, вызывал так this.reloadDetail('ContactAddress'). Подскажите пожалуйста, как можно решить эту проблему.

Нравится

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

Здравствуйте, Владислав!
Не проще ли вместо перезагрузки детали просто вызывать методы, которые выполняются при инциализщации и устанавливают необходимые параметры?
Вы же используете привязку (bindTo) свойств для управления видимостью и наполнением?

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

define("ContactCommunicationDetail", ["ContactCommunicationDetailResources", "terrasoft", "ViewUtilities", "Contact", "ConfigurationEnums", "ConfigurationConstants","MultiMaskEdit"],
    function(resources, Terrasoft, ViewUtilities, Contact, ConfigurationEnums, ConfigurationConstants,MultiMaskEdit) {
        return {
            entitySchemaName: "ContactCommunication",
 
            attributes: {
                "CommunicationTypes" : {
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    dataValueType: Terrasoft.DataValueType.COLLECTION
                }
            },
            methods: {
                initCommunicationTypesFilters: function(esq) {
                    this.callParent(arguments);
                    var columns = Contact.columns;
                    if (columns !== null) {
                   //     debugger;
                        if(TypeStatus!='60733efc-f36b-1410-a883-16d83cab0980') {
                            if (columns.LinkedIn.usageType === ConfigurationEnums.EntitySchemaColumnUsageType.None) {
                                var InstagtramFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Instagtram);
                                esq.filters.addItem(InstagtramFilter);
                                var OdnoklasnikiFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Odnoklasniki);
                                esq.filters.addItem(OdnoklasnikiFilter);
                                var VkontakteFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Vkontakte);
                                esq.filters.addItem(VkontakteFilter);
                            }
                        }
                    }
                }
            },
 
            diff: /**SCHEMA_DIFF*/[
 
 
            ]/**SCHEMA_DIFF*/
        };
    });

А что вам мешает использовать метод init()?

Владимир, а как вы предлагаете использовать init()?
Я пробовал в детали сделать так

  init:function(){
                    this.callParent(arguments);
                    this.initCommunicationTypesFilters();
                },
                updateDetail: function(config) {
                   this.callParent(arguments);
                   this.init();
 
                },

Но ничего путного не вышло.

Здравствуйте, Владислав!
Я, честно говоря, не совсем понял, как Ваш код должен работать. Возможно Вы не полностью предоставили фрагмент кода, но в условии происходит сравнение:

if(TypeStatus!='60733efc-f36b-1410-a883-16d83cab0980')
...

При этом я не вижу определения переменной TypeStatus. Рекомендую поставить там точку останова и посмотреть, какие условия выполняются.

Андрей, TypeStatus это переменная, которая присваивается в модуле ContactPageV2. При изменении статуса вызывается метод, где присваивается текущее значение статуса и вызывается метод updateDetails.После чего в модуле детали ContactCommunicationDetail и происходит проверка. Если условие выполняется добавляются фильтры, иначе они не добавляются.

attributes: {
            "Type": {
                dependencies: [
                    {
                        columns: ["Type"],
                        methodName: "typeChanged"
                    }
                ]
            }
        },
methods: {
  onEntityInitialized: function() {
                this.callParent(arguments);
                this.typeChanged();
            },
   typeChanged: function() {
       TypeStatus=this.get('Type').value;
         this.updateDetails();}

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

В какой момент Вы хотите обновлять деталь?

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

Попробуйте вместо this.updateDetail() вызвать this.updateDetail({reloadAll: true});

Иван, пробовал, но не работает. В итоге получилось сделать, но иначе. Воспользовался методом loadDetail в модуле NUI.BasePageV2.js. В карточке при изменении поля, взял часть этого метода и вызывал т.о.

this.sandbox.loadModule("DetailModuleV2", {
                            renderTo: "ContactPageV2ContactAddressContainer",
                            id: "SectionModuleV2_ContactSectionV2_CardModuleV2_detail_ContactAddress"
                        });

Ломухин Владислав Вячеславович,

я попробовал тоже самое, у меня пишет ошибку. но нужно тоже самое. подскажете как это сделать, может быть полный пример кода? спасибо

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