Механика заполнения полей, после открытия карточки создания связанной сущности.

С "наскоку" не получается в исходниках найти ту часть кода, который отвечает за реализацию поведения (часто встречающегося в типовых конфигурациях):
Когда при выборе справочного значения в типовом окне справочника, происходит добавление с открытием карточки, или из какого-то пункта меню открывается карточка создания, а по завершению ее редактирования ("Сохранить") карточка закрывается, пользователь возвращается на карточку из которой он инициировал создание, где уже заполняется вновь созданным значением связанное справочное поле.

Подскажите куда копать ?
Я предполагаю что для этого поведения существует "стройный" механизм, выраженный в использовании каких-то специальных методов и т.д.

Нравится

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

Добрый день, Илья.

За функционал открытия новой карточки при добавлении записи в справочное поле отвечает метод actionButtonClick из LookupPageViewModelGenerator. Также Вам стоит посмотреть в метод defaultModeActionButtonClick из того же модуля.

Основная "магия" происходит в момент публикации сообщения PushHistoryState.


А можете помочь, поточнее определить/разобрать "магию".
Каким-то образом ведь должно быть определено что в открываемой карточке, во-первых надо ее закрывать при сохранении (если открыть карточку просто через OpenCardInChain такого не происходит),
во-вторых указать в какое поле искомой карточки - устанавливать значением - вновь созданную запись.

Мне необходимо добиться аналогичного поведения, только не из окна справочника, а по пункту меню "Действия"... например для карточки объекта "У" - пункт меню "Создать X"
Должна открываться карточка "X" и после ее сохранения, необходимо вернуть пользователя "на исходную карточку "Y", где специализированное поле для связи "Связанный объект Х" (Являясь справочным полем для "X") будет заполнено значением только что созданного "X".

"килочасы" отладки, позволили определить наилучшего кандидата, это событие "CardModuleResponse"
(Прямо то что нужно в атрибуты события передаются данные по уже успешно сохраненному объекту)
При условии помещения в "PushHistoryState" текущей карточки с признаком "isInChain: true"
И дальнейшим открытием карточки нового объекта через openCardInChain, "Сохранить" или "Отмена" в открываемой карточке, естественным образом вернут пользователя на страницу помещенную в PushHistoryState. При сохранении карточки обязательно произойдет публикация CardModuleResponse в который будет переданы данные о созданной записи
Казалось бы - проблем нет, подписываемся на событие и счастливы...
но нет....
На событие "CardModuleResponse" подписаться в карточке нельзя, так как в ее контексте на уровне BasePageV2 это событие уже объявлено в направлении "PUBLISH"

Как же можно обойти такое ограничение и все таки подписаться на это событие ?
(В случае с выбором из справочника, подписка происходит в рамках схемы LookupPageViewModelGenerator).
Может быть можно как-то выкрутиться через модуль, в который передавать контекст карточки, а в нем произвести подписку, т.к. там не будет зависимости от BasePageV2 ?

Здравствуйте,
Рекомендую вам написать БП в котором открывать карточку создания нужной вам сущности, после чего, из скрипт-таска послать веб сокет сообщение с id созданной записи в карточку, из которой через действия вы запустите данный процесс:
http://www.community.terrasoft.ru/forum/topic/11784#comment-56699
В карточке услышав данное веб-сокет сообщение вы просто нужное поле, заполните значением по id полученным из процесса.
Информация о том, как запустить из JS процесс есть на академии.

Ну есть же механизм который используется в LookupPageViewModelGenerator
событие CardModuleResponse которое встроено в штатное платформенное поведение.
Неужели его никак нельзя использовать в собственных сценариях ?

"Севостьянов Илья Сергеевич" написал:Неужели его никак нельзя использовать в собственных сценариях ?

если вы хотите его использовать на наследниках BaseEntityPage, то не выйдет - нельзя на одного и то же сообщение подписаться в обе стороны. Вам придется реализовывать собственную пару для передачи сообщения между карточкой и карточкой. В случае со справочником [если я ничего не путаю] - LookupPage служит передатчиком между одной карточкой и другой

ПС. я вижу вы уже пошли по этому пути)

"Андросов Дмитрий" написал:В случае со справочником [если я ничего не путаю] - LookupPage служит передатчиком между одной карточкой и другой

Да и вот идея у меня была, забацать модуль посредник. В другой теме уже по нему выспрашиваю, пока что не очень получается :(
Мне кажется это более архитектурно-верный способ, нежели "обмазываться" событиями каждый раз.

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

Передать значение можно через свойство defaultValues. Свойство defaultValues должно содержать массив объектов вида {name: "", value: ""}. В открывшейся карточке переданные значения можно считать с атрибута DefaultValues.

Возвращать Id сохраняемой записи уже через sandbox заместив BasePageV2.

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