Перехват обработчиков форм в WindowContainer

Есть форма редактирования продажи.

На неё вынесены в виде закладок окна детализации (из "подвала").

Ну вот поставлена такая задача!

И сразу возникла проблема перехвата и замены функционала кнопки "Добавить".

Необходимо предварительно выполнить заполнение формы дефолтовыми значениями, а потом вызвать родительский обработчик. Кнопка "Создать договор" как раз и выполняет эту задачу, но родительская кнопка "Добавить" как бельмо на глазу. В идеале необходимо подменить родительский обработчик новым, но как вариант можно и кнопку спрятать.

Может кто уже сталкивался с подобной задачей?

Нравится

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

Как спрятать разобрался:

     var btnAdd = wndContracts.Window.ComponentsByName('btnAdd');
     btnAdd.IsVisible = false;
     btnAdd.IsEnabled = false;

Теперь ещё бы метод перехвата обработчика придумать...

Здравствуйте, Сергей!

Перехватить обработчик не получится, т.к. он вызывается в ядре и связан механизмом наследования окон.

В данном случае решением будет скрыть панель вообще, либо только кнопку. Сделать это можно на OnPrepare карточки следующим программным кодом:

Self.ComponentsByName('WindowContainer').Window.ComponentsByName('frmButtons').IsVisible = false;

Где Self - окно карточки, 'WindowContainer' - название компонента на визуальных, который ссылается на нужный грид, 'frmButtons' - компонент фрейм с кнопками, который мы скрываем.

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

Спасибо. Как спрятать визуальные элементы я уже сам догадался полазив 10 минут в отладчике.
Перекрытие обработчика более естественное и корректное решение, но увы.

Тогда единственный способ - редактировать базовую форму wnd_BaseDBEdit.

Там в обработчике нажатия нужно проверять, если атрибут NotifyObject = нашему окну (контейнеру), тогда return

Можно попробовать подписаться на событие OnClick кнопки.
"Копайте" в сторону функции scr_Common.SetObjectEventDispatcher, пример использования можно найти в стандартных скриптах

Валерий, прекрасная идея, благодарю!

Подробнее можно прочесть в следующей теме: Назначить обработчик динамич.-созданному компоненту

Всё не совсем то. Задача такова:

Необходимо перехватить обработчик окна в контейнере и заменить/перекрыть своим.
Сложность как раз в замене обработчика слабо связанного окна.

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

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

По поводу заполнения значений по умолчанию, не подойдёт ли тут использование DefaultValues?

Отвечаю Александру Кудряшову.

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

Отвечаю Звереву Александру.

Именно по этому пути сейчас и иду. Приходится модифицировать базовые классы.
Например: wndContracts - wnd_ContractsDetailGridArea - wnd_BaseGridArea.
Пока экспериментирую на уровне wnd_ContractsDetailGridArea. Что-то типа:

function wnd_ContractsDetailGridAreaOnPrepare(Window) {
    // Отлавливаем вызов из нужного контейнера
    if (Window.ParentContainer.ParentComponent.Name == 'pgContracts') { 
debugger; 
       [Тут реализация функционала] 
    };
    wnd_BaseGridAreaOnPrepare(Window);
}

"Никиреев Сергей" написал:
[Тут реализация функционала]
}

Window.ComponentsByName('frmButtons').IsVisible = false;
Window.ComponentsByName('frmButtons').IsEnabled = false;

Всем спасибо. Тему можно считать пока закрытой.
Решение оказалось не такое "лобовое" как хотелось сначала, но задача выполнена.
Для решения задачи было создано новое окно-наследник от wnd_ContractsDetailGridArea и в наследнике перекрыта функция btnAddOnClick. Некоторые параметры передаются через атрибуты окна (например: SetAttribute(OpportunityEdit.ContractsWindow, 'ParentDataset',ParentDataset);). Для ООП решение типичное.

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