Здравствуйте, подскажите пожалуйста, возможно ли реализовать деталь в детали в bpm 7.3?

https://community.terrasoft.ru/forum/topic/10157 - Данную тему изучил, но она мне не подходит, т.к. у меня в различных деталях различный набор данных

Примерный вид деталей
деталь
Название | Ед.изм | Количество | нац, % | нац,сумма | Поставщик | Клиент | маржа:% | сумма

Вложенная деталь
Подрядчик | Контакт | Ориентировочная сумма | Объявленная сумма | Исполнитель

Нравится

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

Здравствуйте, Александр!
Принципиально можно сделать по-разному. Более простой вариант реализации - в виде двух деталей, которые сообщать через sandbox.
Более сложный - добавлять второй грид на одну делать. посмотрите реализацию "BaseGridDetailV2". В прицнипе, никто на мешает Вам добавить еще один элемент с типом Terrasoft.ViewItemType.GRID. Нужно просто реализовать все необходимые методы подгрузки данных в него.
Конкретных примеров дать не могу, но подскажу по точечным вопросам, которые будут возникать в ходе реализации.

Здравствуйте!
Можете описать примерный порядок действий для двух деталей, которые сообщаются через sandbox.?

Добрый день, Александр!

1. На странице главной детали с помощью операции "merge" в блоке "diff" добавить для реестра подписку на событие выделения записи "selectRow". Примерно так:

{
"operation": "merge",
					"name": "DataGrid",
					"values": {
						"selectRow": { "bindTo": "rowSelected" }
					}
}

Здесь rowSelected - это метод-обработчик события, который принимает одни аргумент - Id выделенной записи.
2. На этой же странице добавить PTP-сообщение для публикации (PUBLISH) в объект "messages". В методе rowSelected отправлять это сообщение (sanbox.publish).
3. На странице подчиненной детали добавить это же сообщение, но для подписки (SUBSCRIBE) и с помощью sandbox.subscribe подписаться на получение этого сообщения в методе "init" или "subscribeSandboxEvents"(вызывается в init страницы "BaseDetailV2"). В методе-обработчике накладывать фильтрацию и перезагружать реестр детали.
Вроде бы все.
Если будут возникать вопросы по ходу - обращайтесь.

"Андрей Каспаревич" написал:

Добрый день, Александр!

1. На странице главной детали с помощью операции "merge" в блоке "diff" добавить для реестра подписку на событие выделения записи "selectRow". Примерно так:

{

"operation": "merge",

                                        "name": "DataGrid",

                                        "values": {

                                                "selectRow": { "bindTo": "rowSelected" }

                                        }

}

Здесь rowSelected - это метод-обработчик события, который принимает одни аргумент - Id выделенной записи.

2. На этой же странице добавить PTP-сообщение для публикации (PUBLISH) в объект "messages". В методе rowSelected отправлять это сообщение (sanbox.publish).

3. На странице подчиненной детали добавить это же сообщение, но для подписки (SUBSCRIBE) и с помощью sandbox.subscribe подписаться на получение этого сообщения в методе "init" или "subscribeSandboxEvents"(вызывается в init страницы "BaseDetailV2"). В методе-обработчике накладывать фильтрацию и перезагружать реестр детали.

Вроде бы все.

Если будут возникать вопросы по ходу - обращайтесь.


Здравствуйте, Андрей. Я недавно тут и поэтому простите за глупые вопросы) .
Есть деталь, при раскрытии этой детали необходимо чтобы в ней была ещё 1 деталь.
То что вы описали, как я понял, реализует именно то, что мне нужно, но мне многое не понятно. (
1-2 пункт. На странице схемы детали или странице карточки схемы детали добавлять. Я добавил в схеме детали:

define("UsrSchema12DetailV2", [], function() {
	return {
		entitySchemaName: "UsrInsuranceCase",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
		{
			"operation": "merge",
			"name": "DataGrid",
			"values": {
				"selectRow": { "bindTo": "rowSelected" }
			}
		}
		]/**SCHEMA_DIFF*/,
		methods: {},
		messages: {
    	"rowSelected": {
	        mode: this.Terrasoft.MessageMode.PTP,
	        direction: this.Terrasoft.MessageDirectionType.PUBLISH
	    }
}
	};
});

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

Здравствуйте, Павел.

"Гончаров Павел Ильич" написал:Есть деталь, при раскрытии этой детали необходимо, чтобы в ней была ещё 1 деталь.

Не совсем так, насколько я понял, вам предложили сделать 2 детали. Каждая в своем модуле (в своей схеме). Вывести одну под другой на карточке редактирования.
Первая будет главной, вторая ведомой.
В первой вы по событию нажатия на строку, генерируете событие для второй.
Во второй это событие ловите, и манипулируете данными, так как хотите.
К примеру, в первой выбираете страну.
А во второй в это время включаете фильтр по выбранной стране и отображаете только ее города.
Пример работы с песочницей для генерации и подписки на событие напишу ниже, в нем я генерирую событие активной строки в детали "AccountBillingInfoDetailV2", и слушаю его в детали "AccountAddressDetailV2".

define("AccountBillingInfoDetailV2", [], function() {
	return {
		entitySchemaName: "AccountBillingInfo",
		details: /**SCHEMA_DETAILS*/{
 
		}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"selectRow": {
						"bindTo": "rowSelected"
					}
				}
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			rowSelected: function() {
				this.sandbox.publish("RowSelectedInFirstDetail", { test: "param anything" }, [this.sandbox.id]);
				console.log("rowSelected in first detail...");
			}
		},
		messages: {
			"RowSelectedInFirstDetail": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		}
	};
});
define("AccountAddressDetailV2", [], function() {
	return {
		entitySchemaName: "AccountAddress",
		details: /**SCHEMA_DETAILS*/{
 
		}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			init: function() {
				this.sandbox.subscribe("RowSelectedInFirstDetail", function(arg) {
					console.log("test " + arg.test);
				}, this, [this.getSenderSandboxId()]);
			},
			getSenderSandboxId: function() {
				return this.sandbox.id.replace("_AccountAddress", "_AccountBillingInfo");
			}
		},
		messages: {
			"RowSelectedInFirstDetail": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		}
	};
});

Суть здесь в том, что бы сообщения формировались и слушались по одному и тому же sandbox.id. Проверить это можно поставив точки останова на методах публикации и подписки на событие, и смотреть значение третьего параметра для публикации, и четвертого для подписки.

Подробнее про модули и песочницу:
http://academy.terrasoft.ua/documents/docs/technic/SDK/7.4.1/ModuleDeve…

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

Максим, спасибо за ответ и то что поправили меня. Да, я видать не в ту сторону начал смотреть. Мне нужно просто деталь вложенная в деталь, но у меня все равно ничего не вышло. Мои действия: создал обе детали, в родительской детале в схеме карточки детали добавляю в раздел details связь по каким полям, в diff вставляю эту деталь, но её все равно нет. Когда открываю редактор родительской детали, то деталь которую я вставил отображается каким то блоком. В define подключил GeneralDetails и в функцию передаю параметром.

Вам не нужно делать деталь в детали. Создайте две разные детали, обычными мастерами деталей, а потом в мастере раздела выведите обе детали на страницу редактирования. В этом нет ничего сложного, а подробнее про мастера можете почитать на академии, или посмотреть видео на канале:
https://www.youtube.com/watch?v=djefWQslz2U&feature=youtu.be&list=PLDp-…
Должны получится просто две детали, одна под другой (на скриншоте стандартные, но вы выведите свои):

Когда получится это, тогда уже идите по пунктам описанным выше и настраивайте общение между этими двумя деталями. Путем внесения описанных корректировок в схемах деталей. В которых настроите поведение второй детали по отношению к выбранной колонке в первой детали. Если будут возникать точечные вопросы по мере продвижения к решению вашей задачи, спрашивайте.

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