Событие добавления записи на деталь с редактируемым реестром
Всем доброго времени суток.
Версия 7.9 sales.
Ситуация такая: имеется деталь с редактируемым реестром. При добавлении новой записи на деталь необходимо копировать туда часть значений из колонок основной страницы (на которой расположена деталь).
Если у детали есть стандартная страница добавления, то обычно делал такое следующим образом: в карточке объекта детали внутри метода onEntityInitialized делал запрос по объекту связывающей колонки, и вытаскивал нужные мне данные.
У детали с редактируемым реестром onEntityInitialized не срабатывает. render и init - тоже. Как правильно поступить в этом случае?
Важно, чтобы эти данные подставлялись до сохранения записи. То есть нажал "+", появилась новая строка - и чтобы там уже были данные, примерно так.
Нравится
Здравствуйте,
Для ред.реестра работает часть логики из схемы страницы(!) детали, а именно вы можете использовать атрибуты одноименные физическим колонкам, и вешать на них триггеры изменения. Тоесть, можно сделать так:
"UsrProduct": { lookupListConfig: { columns: ["Price", "Currency"] }, dependencies: [ { columns: ["UsrProduct"], methodName: "setProductPrice" } ] },
Таким образом, при изменении Продукта, будет вызван метод setProductPrice в котором вы можете делать this.set любых других колонок, и эти изменения вы увидите до сохранения строки.
Так же всегда есть колонка, которая изменяется наверняка, это колонка связи с разделом где размещена детали, она всегда заполняется при добавлении новой строки, можете тригериться на её изменения.
Максим, здравствуйте.
Попробовал воспользоваться Вашим методом - сама деталь расположена на странице Счёта (фактически - это замена детали Продукт в счёте), соответственно для связи используется колонка Invoice объекта InvoiceProduct. В схеме InvoiceProductPageV2 добавил атрибут
"Invoice":{ dependencies: [ { columns: ["Invoice"], methodName: "setCurrency" } ] },
Метод не срабатывает. Как я понимаю, эта колонка Invoice заполнена по умолчанию, и её изменения не происходит.
Для сравнения, методы, которые добавлены через атрибуты на колонки валюты, продукта - работают, при изменении значений все функции срабатывают.
Вам подойдет паттерн с событием-запросом и событием-ответом,
1)В основной карточке объявляете событие-запрос (подписку), событие-ответ (публикация) и осуществляете подписку на событие-запрос, в обработчике которого генерируете событие ответ передавая туда все необходимые поля и данные из текущего контекста.
2)В схеме детали, наборот: событие-запрос (публикация), событие-ответ (подписка) и осуществляете подписку на событие-ответ, в обработчике которого реализуете Вашу логику.
(Если вам необходимо прервать асинхронный процесс, то можете его заместить его в вашей схеме, где в chain вызвать функцию событием, и this.callParent)
3)По событию сохранения из детали публикуете событие запрос.
Как-то так...
На бумаге выглядит замысловато, но по факту очень лаконично.
Илья, здравствуйте.
Можете немного подробнее пояснить?
Например, в карточке детали UsrInvoiceProductDetail я добавляю публикацию сообщения, переопределив для этого метод addRecord. По идее это именно то, что надо, осталось только передать это куда-то...
На это сообщение я могу, например, подписаться из общей карточки страницы InvoicePageV2, на которой размещена деталь. А как подписаться на него же внутри InvoiceProductPageV2 - карточки объекта, на основе которого создана деталь? init не работает.
Примерно представляю вариант с подпиской на сообщение из общей карточки страницы InvoicePageV2. И далее записывать нужный параметр напрямую в объект InvoiceProduct запросом. Других вариантов точно нет?
"Смородинов Денис" написал:- карточки объекта, на основе которого создана деталь? init не работает.
В данном случае трюк сработает только если пользователь "прошел" через карточку объекта в карточку на которой размещена деталь.
(В таком случае схема InvoiceProductPageV2 будет предварительно загружена, подписчики объявлены и событие будет поймано).
Если же пользователь может попасть в карточку с деталью минуя загрузку страницы объекта. - У вас остается только один способ манипуляции с данными - это работа с базой через ESQ.
Илья, а других способов, как я понимаю, нет?
Так, чтобы в InvoiceProductPageV2 отловить момент добавления новой строки, аналог onEntityInitialized для детали с редактируемым реестром.
"Смородинов Денис" написал:Илья, а других способов, как я понимаю, нет?
В пейдже нет. В схеме детали, да, так как по сути деталь и работает, а от страницы работает только часть логики, так что можете общатся между деталью и пейджей по sandbox.
Так... я немного потерял суть:
InvoiceProductPageV2 - это схема
UsrInvoiceProductDetail - это деталь с реестром на ней
так ?
Вам при добавлении записи в деталь необходимо получать некие значения из карточки (InvoiceProductPageV2) ?
Да. Колонки ему необходимо заполнить. Сделать это можно в InvoiceProductPageV2, но событие добавления новой строки можно словить в UsrInvoiceProductDetail, вот и выходит что писать код нужно и там и там, в UsrInvoiceProductDetail ловить событие добавление записи, пушить сообщение, в InvoiceProductPageV2 слушать это сообщение, деать esq к объекту карточки, и заполнять колонки через this.set(...
"Севостьянов Илья Сергеевич" написал:Вам при добавлении записи в деталь необходимо получать некие значения из карточки (InvoiceProductPageV2) ?
Да, всё верно. Вопрос в том, как в этом случае
"Максим Шевченко" написал:в InvoiceProductPageV2 слушать это сообщение
Обычно подписывались через init, который здесь не срабатывает.
"Смородинов Денис" написал:Обычно подписывались через init, который здесь не срабатывает.
Все логично, карточка при РР сейчас не проходит через весь свой жизненный цикл.
То есть подписаться на такое сообщение в InvoiceProductPageV2 в случае детали с РР нельзя?
И добавление происходит без открытия страницы или миникарточки ?
"Севостьянов Илья Сергеевич" написал:И добавление происходит без открытия страницы или миникарточки ?
Да, это деталь с редактируемым реестром.
Есть в типовой поставке пример такой детали ? Чего-то с наскока не найти.
Детали с редактируемым реестром, как раз зачастую, при добавлении записи - открывают карточку ("например Продукты в Счетах" или "Адреса" в "Контрагентах") или миникарточку (например "Контакты контрагента" в "Контрагенты"), это РЕДАКТИРУЮТСЯ уже добавленные записи без открытия карточек, так чтобы совсем без карточки я что-то не найду просто примера даже.
Если есть пример я быстро отдебажу событийную модель, и скажу ченго куда пихать.
Илья, сейчас попробую найти, по моему, были.
Речь идёт вот о такой детали: https://academy.terrasoft.ru/documents/technic-sdk/7-8/sozdanie-detali-…
В принципе, уже не критично - решили сделать немного по другому. Но хотелось бы уж разобраться, возможно ли вообще такое.
Для примера - хотя бы добавление пункта в типовой справочник.
Вот например, справочник Типы договоров - жмём "Добавить", появилась строчка. Это конечно не совсем то, но близко.
"Смородинов Денис" написал:то конечно не совсем то, но близко.
Визуально - да, по факту - совсем не то.
Ну если у вас есть схема с реализацией Вашей детали - дайте MD файл и редакцию на которой разрабатываете.
"Смородинов Денис" написал:Но хотелось бы уж разобраться, возможно ли вообще такое.
Мне тоже интересно, давайте разберемся.
"Севостьянов Илья Сергеевич" написал:Ну если у вас есть схема с реализацией Вашей детали - дайте MD файл и редакцию на которой разрабатываете.
Сделайте любую деталь, мастером детали, разместите в любом разделе, и после внесите следующие доработки:
- Добавить зависимости от модулей ConfigurationGrid (Конфигурационный реестр), ConfigurationGridGenerator, ConfigurationGridUtilities;
- Подключить "миксин" ConfigurationGridUtilites;
- Установить атрибут IsEditable в значение true;
- Базовому реестру указать свойства:
className: "Terrasoft.ConfigurationGrid",
generator: "ConfigurationGridGenerator.generatePartial",
generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
changeRow: {bindTo: "changeRow"},
unSelectRow: {bindTo: "unSelectRow"},
onGridClick: {bindTo: "onGridClick"},
initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
для добавления действий активной записи добавить:
activeRowActions: [...],
activeRowAction: {bindTo: "onActiveRowAction"}
Итоговый код простейшей редактируемой детали будет выглядеть следующим образом:
define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"], function() { return { entitySchemaName: "Contact", attributes: { "IsEditable": { dataValueType: Terrasoft.DataValueType.BOOLEAN, type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, value: true } }, details: {}, diff: [ { "operation": "merge", "name": "DataGrid", "values": { "className": "Terrasoft.ConfigurationGrid", "generator": "ConfigurationGridGenerator.generatePartial", "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"}, "changeRow": {"bindTo": "changeRow"}, "unSelectRow": {"bindTo": "unSelectRow"}, "onGridClick": {"bindTo": "onGridClick"}, "activeRowActions": [ { "className": "Terrasoft.Button", "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT, "tag": "save", "markerValue": "save", "imageConfig": {"bindTo": "Resources.Images.SaveIcon"} }, { "className": "Terrasoft.Button", "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT, "tag": "cancel", "markerValue": "cancel", "imageConfig": {"bindTo": "Resources.Images.CancelIcon"} }, { "className": "Terrasoft.Button", "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT, "tag": "remove", "markerValue": "remove", "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"} } ], "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"}, "activeRowAction": {"bindTo": "onActiveRowAction"}, "multiSelect": false } } ], mixins: { ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities" }, methods: {} }; });
Почистить кеш, перезайти, и все, деталь редактируемая.
Дальше можете эксперементировать со страницей редактирования, которая конечно открыватся не будет. Но часть логики с нее работать будет ;) О чем я писал выше.
Здравствуйте!
Подскажите, пожалуйста, в итоге мы можем заполнить поля объекта детали с редактируемым реестром значениями полей записи,в которой расположена деталь?
почитала здесь обсуждение и не поняла, к чему в итоге пришли :smile:
у меня есть объект UsrObj, его деталь UsrUsrObjDetail на странице продаж, его страница UsrUsrObj1Page1. деталь с ред. реестром. я добавляла публикацию сообщения в UsrUsrObjDetail на addRecord и подписку UsrUsrObj1Page1 в методе initEntity. но initEntity срабатывает позже, чем addRecord и у меня выходила след.ошибка в консоли
UnsupportedTypeException: Message addRecordOOP cannot be subscribed in DetailModuleV2 (CardModuleV2_66ac4481-f753-41fd-bd33-80df01c99ed1_OpportunityPageV2_detail_UsrUsrObjDetailcb3382b4ICLIndButch), message direction set as publish