Не так давно потребовалось из класса, отрабатывающего на сервере, запускать форму, отображающую некоторые результаты его работы. Для формы есть пункт меню, запускающий ее на
клиенте. Оказалось, что решение "в лоб" вовсе не обязательно приведет к желаемому эффекту:
X++:
MenuFunction menuFunc = new MenuFunction( menuitemdisplaystr(SomeForm), MenuItemType::Display );
Args args = new Args();
// ...
menuFunc.run( args );
Несмотря на то, что, опять же, в пункте меню явно прописано запускать форму на клиенте, никакого видимого эффекта в результате выполнения этого кода не наблюдалось. Опытным путем было выяснено, что для 3-ки и MenuFunction, и Args должны создаваться на клиенте, иначе форма не откроется. Для 4-ки вроде бы MenuFunction отрабатывает и с сервера, но в любом случае объект Args должен создаваться на клиенте - иначе клиент вообще сваливается. Для 3-ки дополнительные неудобства еще создает то, что конструктор MenuFunction требует передачи параметров, так что через какой-нить classFactory соотв. объект на нужном уровне не создашь; пришлось создавать через infolog:
X++:
MenuFunction menuFunc = infolog.getNode( UtilElementType::DisplayTool, menuitemdisplaystr(SomeForm) );
Args args = classFactory::makeObjectOnClient( classnum(Args) );
// ...
menuFunc.run( args );
Во вложении - небольшой проект для 4-ки с job'ом и пунктом меню для запуска его на сервере, демонстрирующий указанный эффект; в принципе, его можно и на 3-ке загрузить, только надо пункт меню для запуска job'а проверить и при необходимости подправить, чтобы запускался именно job, а не одноименная форма. В job'е в качестве тестовой формы открывается AddressTrans_RU через одноименный пункт меню, поскольку он - один из немногих, где для формы штатно прописано RunOn Client; обычно для форм в пунктах меню стандартного приложения прописано RunOn Called from.
На форуме уже встречалась похожая тема
Проблема с программным открытием форм, но в моем случае вариант "запускать класс на клиенте" был неприемлем.
PS. Axapta 3.0.1951.7669, также проверялось на AX 4.0.2501.116.