Вопрос

Событие добавления записи на деталь с редактируемым реестром

Всем доброго времени суток.

Версия 7.9 sales.

Ситуация такая: имеется деталь с редактируемым реестром. При добавлении новой записи на деталь необходимо копировать туда часть значений из колонок основной страницы (на которой расположена деталь).

Если у детали есть стандартная страница добавления, то обычно делал такое следующим образом: в карточке объекта детали внутри метода onEntityInitialized делал запрос по объекту связывающей колонки, и вытаскивал нужные мне данные.

У детали с редактируемым реестром onEntityInitialized не срабатывает. render и init - тоже. Как правильно поступить в этом случае?

Важно, чтобы эти данные подставлялись до сохранения записи. То есть нажал "+", появилась новая строка - и чтобы там уже были данные, примерно так.

У меня такой же вопрос

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

Здравствуйте,
Для ред.реестра работает часть логики из схемы страницы(!) детали, а именно вы можете использовать атрибуты одноименные физическим колонкам, и вешать на них триггеры изменения. Тоесть, можно сделать так:

"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

Войдите или зарегистрируйтесь, чтобы комментировать