Здравствуйте,
у меня есть бизнес процесс который запускаеться после внесения строки в справочник, но его результатом может быть удаление этой же строки,
из-за чего есть необходимость обновить страницу справочника с Бизнес процесса.
Подскажите как это можно реализовать.
Спасибо.
Нравится
Добрый вечер.
Для передачи сообщений из серверной логики на клиент используется механизм 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 ); },