Добрый день!
Стал вопрос об обновлении реестра детали в конце работы БП.
В чем суть:
1) На детали, в редактируемом реестре, изменяются значения (кол-во работ) или добавляется новая строка
2) БП ловит добавление/изменение и высчитывает сумму (кол-во работ * стоимость) и записывает это в поле, отображающееся в реестре детали
3) Требуется обновление этого реестра
И если первые 2 пункта выполняются на "ура" и без проблем, то с реализацией 3 пункта у меня появились проблемы. При этом хотелось бы выполнить все в одном БП, возможно поможет элемент процесса [Задание-сценарий]? Был бы благодарен за предоставленную помощь.
Нравится
Опишу более подробно 2й варинат
1) в конце БП добавить скрипт таск и в нем
//ваше сообщение string sender = "MyBpFinish"; //Доп. информация string messageText // Публикация сообщения по WebSocket. MsgChannelUtilities.PostMessageToAll(sender, messageText);
2) Создать замещающий клиентский модуль , задав родительский объект схему ClientMessageBridge
define("ClientMessageBridge", ["ConfigurationConstants"], function(ConfigurationConstants) { return { // Сообщения. messages: { //Имя сообщения. "MyBpFinish": { // Тип сообщения — широковещательное, без указания конкретного подписчика. "mode": Terrasoft.MessageMode.BROADCAST, // Направление сообщения — публикация. "direction": Terrasoft.MessageDirectionType.PUBLISH } }, methods: { // Инициализация схемы. init: function() { // Вызов родительского метода. this.callParent(arguments); // Добавление нового конфигурационного объекта в коллекцию конфигурационных объектов. this.addMessageConfig({ // Имя сообщения, получаемого по WebSocket. sender: "MyBpFinish", // Имя сообщения с которым оно будет разослано внутри системы. messageName: "MyBpFinish" }); }, // Метод, выполняемый после публикации сообщения. afterPublishMessage: function( // Имя сообщения с которым оно было разослано внутри системы. sandboxMessageName, // Содержимое сообщения. webSocketBody, // Результат отправки сообщения. result, // Конфигурационный объект рассылки сообщения. publishConfig) { if (sandboxMessageName === "MyBpFinish") { var name = webSocketBody.name; window.console.info("Опубликовано сообщение: " + sandboxMessageName + ". Данные: name: " + name ); } } } }; });
3) Подписаться на получение сообщений MyBpFinish в любой клиентской схеме
define("AccountSectionV2", [], function(BusinessRuleModule, ConfigurationConstants) { return { //entitySchemaName: "Contact", messages: { //Имя сообщения. "MyBpFinish": { "mode": Terrasoft.MessageMode.BROADCAST, "direction": Terrasoft.MessageDirectionType.SUBSCRIBE } }, methods: { // Инициализация схемы. init: function() { this.callParent(arguments); this.sandbox.subscribe("MyBpFinish", this.onMyBpFinish, this); }, // Обработчик события получения сообщения NewUserSet. onMyBpFinish: function(args) { //Обновим грид this.refreshGridData(); } } }; });
При запуске БП передавай callback который вызовется после отработки БП
Примерно так
ProcessModuleUtilities.executeProcess({ "sysProcessName": ProcessName, "parameters": { UsrParam1: paramValue }, "callback": this.greadReloadProcessCallback(), scope: this }
Григорий Чех,
Немного не понимаю где и как указать этот самый callback и как его потом вызвать, буду признателен за пояснение. Не приходилось работать еще с такой процедурой.
Не внимательно прочел ваше предложение, предложил вариант по запуск БП вручную из клиентского модуля.
Посмотри действие процесса Обновить запись в реестре
Второй вариант отправить по вєб сокету сообщение и подписатся в реестре на него и по приходу сообщения обновить реестр.
Третий вариант убрать БП и по изминению поля или добавлению записи в детали пересчитывать в клиентском модуле сумму.
Опишу более подробно 2й варинат
1) в конце БП добавить скрипт таск и в нем
//ваше сообщение string sender = "MyBpFinish"; //Доп. информация string messageText // Публикация сообщения по WebSocket. MsgChannelUtilities.PostMessageToAll(sender, messageText);
2) Создать замещающий клиентский модуль , задав родительский объект схему ClientMessageBridge
define("ClientMessageBridge", ["ConfigurationConstants"], function(ConfigurationConstants) { return { // Сообщения. messages: { //Имя сообщения. "MyBpFinish": { // Тип сообщения — широковещательное, без указания конкретного подписчика. "mode": Terrasoft.MessageMode.BROADCAST, // Направление сообщения — публикация. "direction": Terrasoft.MessageDirectionType.PUBLISH } }, methods: { // Инициализация схемы. init: function() { // Вызов родительского метода. this.callParent(arguments); // Добавление нового конфигурационного объекта в коллекцию конфигурационных объектов. this.addMessageConfig({ // Имя сообщения, получаемого по WebSocket. sender: "MyBpFinish", // Имя сообщения с которым оно будет разослано внутри системы. messageName: "MyBpFinish" }); }, // Метод, выполняемый после публикации сообщения. afterPublishMessage: function( // Имя сообщения с которым оно было разослано внутри системы. sandboxMessageName, // Содержимое сообщения. webSocketBody, // Результат отправки сообщения. result, // Конфигурационный объект рассылки сообщения. publishConfig) { if (sandboxMessageName === "MyBpFinish") { var name = webSocketBody.name; window.console.info("Опубликовано сообщение: " + sandboxMessageName + ". Данные: name: " + name ); } } } }; });
3) Подписаться на получение сообщений MyBpFinish в любой клиентской схеме
define("AccountSectionV2", [], function(BusinessRuleModule, ConfigurationConstants) { return { //entitySchemaName: "Contact", messages: { //Имя сообщения. "MyBpFinish": { "mode": Terrasoft.MessageMode.BROADCAST, "direction": Terrasoft.MessageDirectionType.SUBSCRIBE } }, methods: { // Инициализация схемы. init: function() { this.callParent(arguments); this.sandbox.subscribe("MyBpFinish", this.onMyBpFinish, this); }, // Обработчик события получения сообщения NewUserSet. onMyBpFinish: function(args) { //Обновим грид this.refreshGridData(); } } }; });
Григорий Чех
добрый день! сделал все по вашему совету, коды один в один но почему то деталь не обновляется( что может быть? где искать? в консоле ошибка на