Обновление реестра детали с использованием механизма сообщений.

Добрый день!

Согласно Т.З. необходимо реализовать следующие пункты...

У нас есть раздел "Заказ на выполнение работ", а в нем реализована деталь "Перечень работ". При создании нового "Заказа на выполнение работ" с помощью бизнес-процесса в деталь "Перечень работ" добавляется 5 записей. Для обновления реестра детали необходимо использовать механизм отправки сообщений с серверной на клиентскую сторону, содержимое детали должно автоматически обновляться после завершения работы действия.

БП создан и правильно добавляет записи в деталь. А что дальше делать? Как и куда что вставлять? Статей по механизму сообщений и Sandbox прочитал не мало, а в кучу собрать информацию для реализации своего задания не получается...

Нравится

8 комментариев
Лучший ответ

Посмотрите данную статью, там есть пример https://academy.terrasoft.ru/docs/developer/front-end_development/webso…

 

Для обновления детали подойдет метод 

this.updateDetail({detail: "UsrDetail23d2c003", realoadAll: true})

Его запускать со страницы редактирования, где расположена нужная деталь.

Посмотрите данную статью, там есть пример https://academy.terrasoft.ru/docs/developer/front-end_development/webso…

 

Для обновления детали подойдет метод 

this.updateDetail({detail: "UsrDetail23d2c003", realoadAll: true})

Его запускать со страницы редактирования, где расположена нужная деталь.

Трефилов Павел Сергеевич,

Часть задания вроде бы как удалось сделать. А именно… Повторил в соответствии с примером применительно к своему заданию.

В объекте детали «Перечень работ» создал событийный подпроцесс, который срабатывает при добавлении записи в деталь, и передает Id новой записи детали. Сделал рассылку в созданном замещающем клиентском модуле с родителем ClientMessageBridge . Сделал подписку на сообщение в странице редактирования «Заказ на выполнение работ». Все работает, как и в примере.

Пока не получается обновить реестр детали. Делаю это следующим образом… В странице редактирования «Заказ на выполнение работ» в функции обработчике события полученного сообщения просто пишу this.reloadDetail("UsrListWorks"); (UsrListWorks – название объекта детали).

Что я делаю неправильно?

Pavel Litvinovich,

нужно писать не название объекта, а название делали в коде страницы. Смотрите блок details и там будет название детали. Пример:

		details: /**SCHEMA_DETAILS*/{
			"UsrMaterialDetail23d2c003": {
				"schemaName": "UsrMaterialDetail",
				"entitySchemaName": "UsrMaterial",
				"filter": {
					"detailColumn": "UsrParentMaterial",
					"masterColumn": "Id"
				}
			}
		}/**SCHEMA_DETAILS*/,

И еще я посмотрел как в последнем проекте делал обновление детали, вот такой код использовал, id записи передавал из процесса, в вашем варианте можно убрать проверку на id, т.к. будут обновляться детали на всех открытых страницах с подпиской:

        messages: {
            "RefreshMaterial": {
                "mode": Terrasoft.MessageMode.BROADCAST,
                "direction": Terrasoft.MessageDirectionType.SUBSCRIBE
            }
        },

 

			onEntityInitialized: function() {
				this.callParent(arguments);
				this.sandbox.subscribe("RefreshMaterial", this.reloadFromProcess, this);
			},
 
			reloadFromProcess: function(args) {
				if(args === this.get("Id")) {
					this.updateDetail({detail: "UsrMaterialDetail23d2c003", realoadAll: true});
				}
			},

 

Трефилов Павел Сергеевич,

А что использовать init или onEntityInitialized? В примере используют init. А у меня в methods уже был onEntityInitialized, для реализации другого функционала.

И как проверить работает оно или нет (я имею ввиду обновление реестра с использованием механизма отправки сообщений)? Записи в деталь с помощью только лишь БП и так нормально добавлялись.

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

Если смотреть пример, то там есть строка 

window.console.info("текст");

Для отладки тоже можете в методе добавить подобное, если после запуска процесса в консоле появился текст, то значит пришел сигнал из бп. Если нет, то где-то ошибка. Либо лучше научиться отладки js, ставить точку останова и т.п.

 

А обновление реестра работает или нет, чисто визуально определить. У вас же БП что-то делает, то значит после выполнения бп данные должны обновиться без перезагрузки страницы.

Трефилов Павел Сергеевич,

Дело в том, что БП отрабатывает после создания новой записи в разделе "Заказ на выполнение работ" (а именно добавляет записи на деталь этой страницы). А при нажатии кнопки Сохранить страница автоматически закрывается. И получается что страница при последующем открытии в любом случае будет перезагружена. Хотя если присмотреться, за долю секунды то до того как страница закроется, на детали появляются записи. Походу, получается, работает правильно.

Обнаружил другую более существенную проблему. Если добавлять вручную записи в деталь нажимая на +, т.к. деталь с редактируемым реестром (при работе БП все хорошо), то появляется ошибка: Violation of PRIMARY KEY constraint 'PKOqfXc3lnQVBYwkElsuKFom04KY'. Cannot insert duplicate key in object 'dbo.UsrListWorks'. The duplicate key value is (9d4ea319-42ee-41b3-81ec-f556e4dc4517). The statement has been terminated. Не понятно почему, т.к. если посмотреть в базе данных, то детали с таким Id еще нет.

Pavel Litvinovich,

Тогда не совсем понятно зачем обновлять деталь после создания записи.  Но можно попробовать немного поломать логику, которая работает во время сохранения новой записи:

onSaved: function(response, config) {
if(this.isNew) {
config.isSilent;
}
this.callParent(arguments);
}
код не проверял на практике, но должен работать

По поду второй ошибки сложно судить, может где-то ошибка в коде детали

Трефилов Павел Сергеевич,

Спасибо за помощь!

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