В AX2009 RU5 появилась возможность простого расширения возможностей отслеживания событий на диалогах классов-наследников RunBase.
Поясню как это использовать (на примере InventBaileeCreateCalc_RU):
1. Добавляем в classDeclaration следующую конструкцию:
X++:
CustAccount custAccount;
DialogField dialogCustAccount;
#define.dialogCustAccount('dialogCustAccount')
Здесь мы вынуждены иметь hardcoded название будущего контрола на форме, но дальше мы увидим как красиво это играет.
2. В метод dialog() добавляем вызов ещё пары методов:
X++:
...
dialog.customFieldName_RU(#dialogCustAccount);
// здесь насильно устанавливаем название создаваемого контрола в форме диалога
dialogCustAccount = dialog.addFieldValue(typeid(CustAccount), custAccount);
...
dialog.allowControlMethodOverload_RU(true);
// а теперь разрешаем инстансу настоящего класса отлавливать события контролов
3. Теперь создаём метод dialogCustAccount_modified(), который позволяет отлавливать события контрола с названием 'dialogCustAccount' (если бы мы не изменяли название контрола, то метод бы назвался Fld1_modified, или Fld3_2 - взависимости от того где и как вы вызываете dialog.addField или dialog.addFieldValue)
Примечание: Поля-массивы (Dimension) будут иметь наименование с суффиксом содержащим номер элемента массива. Пример: dialogDimension_1, dialogDimension_2, ...
Очень важное примечание: поскольку в этом методе вы имеете дело с серверной версией класса Dialog, то для корректной работы нужно не забывать обновлять значения полей "обрамляющим" вызовом методов updateServer() и updateClient())
X++:
protected boolean dialogCustAccount_modified()
{
boolean ret = dialog.curFormControl_RU().modified();
;
dialog.dialogOnClient_RU().updateServer();
dialogContractCode.value('');
dialogContractAccount.value('');
this.dialogActivateFields();
dialog.updateClient(dialog.dialogOnClient_RU());
return ret;
}
Вот собственно и всё!
Таким же точно образом можно отслеживать методы lookup(), validate(), selectionChange() и др...
P.S.
Собственно изначально делал это в AX3, а теперь удалось получить это в рамках RU5. Пользуйтесь на здоровье!