Здравствуйте, подскажите пожалуйста, возможно ли реализовать деталь в детали в bpm 7.3?
https://community.terrasoft.ru/forum/topic/10157 - Данную тему изучил, но она мне не подходит, т.к. у меня в различных деталях различный набор данных
Примерный вид деталей
деталь
Название | Ед.изм | Количество | нац, % | нац,сумма | Поставщик | Клиент | маржа:% | сумма
Вложенная деталь
Подрядчик | Контакт | Ориентировочная сумма | Объявленная сумма | Исполнитель
Нравится
Здравствуйте, Александр!
Принципиально можно сделать по-разному. Более простой вариант реализации - в виде двух деталей, которые сообщать через 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-…
Должны получится просто две детали, одна под другой (на скриншоте стандартные, но вы выведите свои):
Когда получится это, тогда уже идите по пунктам описанным выше и настраивайте общение между этими двумя деталями. Путем внесения описанных корректировок в схемах деталей. В которых настроите поведение второй детали по отношению к выбранной колонке в первой детали. Если будут возникать точечные вопросы по мере продвижения к решению вашей задачи, спрашивайте.