В Аксапте можно указать команду, которая будет выполняться в момент запуска (startup command). В этой статье приводятся команды для Dynamics AX4, которые можно указывать в качестве команды запуска. Кроме того, здесь показано как можно добавлять свои команды запуска. Рекомендуется также познакомиться с старой статьей Команды загрузки (Startup Command), в которой описываются команды запуска в старой версии Axapta3.

Формат команды

КоммандаВОдноСлово[_Параметры]

Команда должна состоять из одного слова. После символа подчеркивания могут идти параметры команды. Надо отметить, что Аксапта при запуске обрабатывает только одну команду. Однако, появилась команда autorun, которая позволяет выполнить целую серию команд за один запуск.

Внимание! в старой версии Axapta 3.0 разделителем служил пробел. В Dynamics AX4 пробелы в качестве разделителя между командой и параметрами недопустимы.

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

Внимание! в текущей версии знаки подчеркивания не заменяются на пробелы, как в старой версии.

Как указать команду запуска

Команду можно указать в конфигурационной утилите в поле Startup command

Команда в конфигурационной утилите

Команду запуска можно указать в командной строке. Например, вот как выглядит та же самая команда в окне Выполнить:

C:\Axapta40\Client\Bin\Ax32.exe -startupCmd=autorun_c:\axapta40\commands.xml

Команда запуска

Тип команды

Команды бывают четырех типов:

Команда типа ApplInit вызывается из метода Application::Startup до инициализации приложения, базы данных, системы infolog и до выполнения проверки валидности базовых таблиц. См. Application::Startup.

Команда типа ApplRun вызывается в самом конце метода Application::Startup.

Команда типа InfoInit вызывается из метода Info::Startup до установки системы документооброта, до обработки параметров пользователя, до обработки CheckList'а. См. Info::Startup.

Команда типа InfoRun вызывается в самом конце метода Info::Startup

Порядок событий при запуске

Список команд

Команда Параметр С версии Тип Необходимо право Автовыход
AOTImport ПолноеИмяФайла 3.0 InfoRun SysDevelopment -
ApplUpgrade   3.0 ApplInit SysDevelopment -
AutoRun Путь к файлу *.xml 3.0 sp6 InfoRun Выполняется всегда Определяется xml файлом
Batch   2.5 InfoRun ButchRun::Add (menuItem) -
CheckBestPractices Путь к файлу xls или xpo 4.0 InfoRun SysDevelopment +
CompileAll   2.5 SP2 InfoRun SysDevelopment +
DrillDown код оповещения 4.0 InfoRun EventContextDrilldown (menuItem) -
Exit   2.5 SP2 InfoRun SysDevelopment +
ImportResources Путь к файлу *.cab 4.0 InfoRun SysDevelopment +
LoadLicense Путь к файлу 3.0 sp6 InfoRun SysDevelopment +
RunTestProject См. описание 4.0 InfoRun SysDevelopment +
SetBuildNo Номер 2.5 ApplInit SysDevelopment +
Synchronize   2.5 ApplInit SysDevelopment +
UpdateBuildNo   2.5 ApplInit SysDevelopment +
ViewAlert код оповещения 4.0 InfoRun EventAlertInbox (menuItem) -
ViewAlertRule код оповещения 4.0 InfoRun EventRule (menuItem) -

В DAX4.0 исчезла команда BMClient, поскольку встроенная подсистема Benchmark была полностью переделана и преобразована во внешнюю утилиту.

Обратите внимание, что в Dynamics AX4 повысились требования к правам пользователя, из-под которых запускается команда. Теперь по-умолчанию у пользователя должны быть полные права на ключ безопасности (securityKey) с названием SysDevelopment.

Описание команд

AOTImport_ПолноеИмяФайла

Существует: с версии 3.0 и выше
Тип: InfoRun

 

Пример использования:

Пример использования команды AOTImport в конфигурационной утилите

или в командной строке:
-startupcmd=AOTImport_AOTimport_c:\axapta40\AOT-objects.xpo

Импортирует объекты в AOT из указанного файла. После импорта компиляция не выполняется. Поэтому если вы изменяете или импортируете типы, макросы или классы, то, возможно, дополнительно нужно будет сделать принудительную перекомпиляцию.

В методе SysStartupCmdAOTImport::infoRun() есть закомментированные строки. Если их раскомментировать, то можно заставить эту команду импортировать метки, испортировать идентификаторы, а также управлять некоторыми другими параметрами импорта.

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


ApplUpgrade

Существует: с версии 3.0 и выше
Тип: ApplInit

Пример использования:

Пример использования команды ApplUpgrade в конфигурационной утилите

или в командной строке
-startupcmd=ApplUpgrade

Эта команда информирует систему, что апгрейд завершен. В результате, система при запуске не переходит в режим конфигурирования и не открывает Upgrade CheckList.


AutoRun_xmlFile[,BasePath]

Существует: с версии 3.0 SP6 и выше. Детальное описание команды приведено здесь AutoRun.
Тип: ApplInit

Пример использования:

Пример использования команды AutoRun в конфигурационной утилите

или в командной строке
-startupcmd=autorun_c:\axapta40\Commands.xml,c:\xmlCommands\

Является, на мой взгляд, самой интересной командой. Она позволяет выполнить последовательность действий описанных в xml файле, таких как: выполнение X++ кода, запуск меню-айтемов, синхронизация с БД, запуск других startup команд и многое другое. Последовательность действий выполняется только в том случае, если у пользователя, из-под которого запущена экземпляр Dynamics AX, есть права на правку ключа безопасности (security key) Администрирование\Настройки (AdminSetup).

По сути, команда запускает класс SysAutoRun и передает туда указанный в параметрах xml-файл и, если указан второй параметр, каталог, относительно которого будут задаваться пути к файлам внутри xml-файла. Параметры и действия, которые «умеет» выполнять класс SysAutoRun, описаны в отдельном совете AutoRun. Кроме того, краткое описание и пример построения командного файла xml можно найти в MSDN: SysAutoRun или в документации разработчика.


Batch

Существует: с версии 2.5 и выше
Тип: InfoRun

Пример использования:

Пример использования команды Batch в конфигурационной утилите

или в командной строке
-startupcmd=Batch

Команда запускает Аксапту в режиме сервера и исполняет Batch-пакеты.

Команда эквивалентна пункту меню Основное \ Периодические операции \ Пакет \ Обработка (в Dynamics AX4.0), Основное \ Периодические операции \ Пакет \ Режим сервера (Axapta 3.0) или Разное \ Пакет \ Режим сервера (Аксапта 2.5).

В версии Dynamics AX4.0 добавлена проверка - имеет ли право пользователь, который запустил Аксапту, выполнять этот пункт меню. Если пользователь не имеет права, то Dynamics AX4.0 просто выходит, не переходя в режим пакетного сервера.


CheckBestPractices[_Проект.xpo|Шаблон.xls]

Существует: с версии 4.0 и выше
Тип: InfoRun

Осуществляет проверку элементов в AOT или во внешнем файле на соответствие рекомендациям BestPractices. Есть 2 варианта использования этой команды:

1. Проверка внешнего *.xpo файла.

Пример использования:

Пример использования команды CheckBestPractices в конфигурационной утилите

или в командной строке
-startupcmd=CheckBestPractices_c:\axapta40\MyFile.xpo

Осуществляется проверка файла «MyFile.xpo», результат проверки сохраняется в виде html и сохраняется в файл %Client%\Log\AxCompileAll.html.

2. Компиляция и проверка всего AOT.

Пример использования:

Пример использования команды CheckBestPractices в конфигурационной утилите с указание чды-afqkf

или в командной строке
-startupcmd=CheckBestPractices
-startupcmd=CheckBestPractices_c:\axapta40\MyFile.xls

В этом случае параметр может быть пропущен, либо в качестве параметра команды должен быть указан уже существующий excel файл, в котором будет представлен некий шаблон (структура его пока не ясна), в который система автоматически запишет результат проверки. Если параметр пропущен, то excel файл не записывается. Кроме этого, как и в первом случае, система создаст файл %Client%\Log\AxCompileAll.html.


CompileAll[_ОбновлятьПерекрестныеСсылки+-]

Существует: с версии 2.5 SP2 и выше
Тип: InfoRun

Пример использования:

Пример использования команды compileAll в конфигурационной утилите

или в командной строке
-startupcmd=compileAll_-

Команда запускает Аксапту, делает полную перекомпиляцию и закрывает Аксапту.

В Dynamics AX4.0 перекомпиляция выполняется с 4ым уровнем предупреждений. После перекомпиляции выполняется экспорт лога копиляции в файл %Client%\Log\AxCompileAll.html.

Для команды можно задать необязательный параметр, который определяет, будут ли обновляться перекрестные ссылки при компиляции. Возможные значения параметра + или -:

compileAll_+ система будет обновлять перекрестные ссылки при компиляции
compileAll_- система НЕ будет обновлять перекрестные ссылки при компиляции
compileAll

обновление перекрестных ссылок зависит от текущих параметров пользователя. См. скриншот:

Обновлять перекрестные ссылки при компиляции


DrillDown_КодОповещения[?navigationMark]

Существует: с версии 4.0 и выше
Тип: InfoRun

Пример использования:

Пример использования команды DrillDown в конфигурационной утилите

или в командной строке
-startupcmd=DrillDown_100?0

Команда относится к группе команд, которые работают с оповещениями (ViewAlert, ViewAlertRule, DrillDown). Данная команда открывает форму-источник оповещения и позиционирет курсор на запись-источник, которая вызвала оповещение.

В текущей реализации Аксапты параметр navigationMark либо должен быть пустым, либо его значение должно совпадать со значением поля "Цель поисково-аналитической работы" в параметрах Оповещения (см. скриншот). Скорее всего, данный параметр сделан для повышения надежности и безопасности. Хотя очень странный параметр.

Microsoft Dynamics AX4: Параметры оповещения

Команда выполняется только в том случае, если у пользователя, который запустил Аксапту, есть право выполнения пункта меню \Menu Items\Display\EventAlertInbox. С точки зрения консультанта, это меню можно найти следующим образом: Главное меню \ Настройки \ Оповещения \ Управление правилами генерации оповещений \ Кнопка Просмотр оповещения \ Кнопка Источник оповещения.


Exit

Существует: с версии 2.5 SP2 и выше
Тип: InfoRun

Пример использования:

Пример использования команды Exit в конфигурационной утилите

или в командной строке
-startupcmd=Exit

Команда закрывает Аксапту после исполнения всех загрузочных процедур. Т.е. сначала выполняются все проверки и инициализации запуска, затем команда закрывает Аксапту.

Я не очень понимаю зачем нужна эта команда.

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

Эта команда была бы полезна, если бы можно было бы указывать несколько команд подряд. Сейчас несколько команд можно выполнить при помощи одной команды autoRun.


ImportResources_CabФайл

Существует: с версии 4.0 и выше
Тип: InfoRun

Пример использования:

Пример использования команды ImportResourses в конфигурационной утилите

или в командной строке
-startupcmd=ImportResources_c:\axapta40\myWebPart.cab

Команда позволяет импортировать вэб-части в AOT в ветку \Web\Web Files\Web Parts.

Какая-то на редкость бестолковая команда.


LoadLicense_ПолноеИмяФайла

Существует: с версии Dynamics AX3 SP6 и выше
Тип: InfoRun

Пример использования:

Пример использования команды AOTImport в конфигурационной утилите

или в командной строке:
-startupcmd=loadlicense_c:\axapta40\AxCodes.6516222.txt

Загружает в систему новый лицензионный файл. После загрузки синхронизация с БД не выполняется. После загрузки новой лицензии, приложение закрывается без синхронизации таблиц.


RunTestProject_suiteName[@ListenerName[@parm]]

Существует: с версии AX4.0 и выше
Тип: InfoRun

Пример использования:

Пример использования команды AOTImport в конфигурационной утилите

или в командной строке:
-startupcmd=RunTestProject_RNR-test01@xml

Команда запускает проект юнит-тестирования. Параметры команды: suiteName – имя проекта-тестирования, ListenerName – имя класса «слушателя», parm – параметр, необходимый при конструировании объекта класса-слуштеля (используется не всегда). Если слушатель не указан, то используется XML.

ListenerName Куда записываются результаты parm (default) Коммантарий
DB Таблица SysTestLineLog    
File Файл FileName
(%Client%\Log\Test.log)
 
Infolog Инфолог    
InfologVerbose Инфолог   Выводятся только ошибки.
Memory Список из строк List(Types::String)   В данном контексте использовать этот слушатель бесполезно, поскольку во время тестирования результаты не показываются, а после окончания получить список никак не получится.
MessageWindow Окно сообщений    
Print Окно вывода команды print   Окно будет закрыто после окончания тестирования.
ProgressBar Окно с ProgressBar    
Toolbar Еще один вариант вывода в память FormProgressControl
(null)
Предполагается, что этот позволяет выполнить интеграцию с панелью инструментов. Но в данном контексте этого не получится.
WTT xml-файл в специальном формате для Windows Test Tool   В данном контексте использовать этот слушатель бесполезно, поскольку данный слушатель требует два параметра. А механизм запуска через командную строку позволяет передать только один.
XML xml-файл FileName
(%Client%\Log\Unit.xml)
 

Внимание! из-за некорректно написанного кода проверки, система пропустит значение Data, InformationProvider и Null в качестве значения для параметра ListenerName. Мало того, система даже попытается что-то выполнить. Однако классы SysTestListenerData и SysTestListenerInformationProvider не являются потомками класса SysTestListener, а класс SysTestListenerDataNull является абстрактным. Поэтому эти имена приведут к run-time ошибке. Программист! Никогда не рассчитывай на имя объекта, используй SysDictClass.isExtending. И никогда не инстанцируй абстрактные классы.

К сожалению, класс отвечающий за выполнение команды, нужно «подпилить». В методе SysStartupCmdRunTestProject.infoRun добавить вызов метода this.split(parm); Если этого не сделать, то команда не будет правильно принимать имя слушателя и параметр. Следовательно можно будет использовать только первый параметр - имя юнит-теста (в этом случае результаты будут выводится в XML-файл по умолчанию).

Код запуска команды RunTestProject


SetBuildNo_BuildNo[,Email]

Существует: с версии 2.5 и выше
Тип: ApplInit

Пример использования:

Пример использования команды SetBuildNo в конфигурационной утилите

или в командной строке
"-startupcmd=SetBuildNo_4.0.2501.122.RNR4.07,mazzy@mazzy.ru"

Команда работает только, если текущим слоем является SYS, SYP, GLS, GLP. В остальных слоях команда в стандартной версии ничего не делает. Если вы добавляете код в свой слой в классе ApplicationVersion, то необходимо внести изменения и в класс-обработчик данной команды.

Команда изменяет текст, который соответствует номеру версии, и записывает информацию о изменении в log. Номер версии можно посмотреть при помощи пункта меню Справка \ О программе Microsoft Dynamics AX.

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

Окно О программе Microsoft Dynamics AX с номером версии.

После выполнения команды Аксапта закрывается.


Synchronize

Существует: с версии 2.5 и выше
Тип: ApplInit

Пример использования:

Пример использования команды Synchronize в конфигурационной утилите

или в командной строке
-startupcmd=Synchronize

Выполняет синхронизацию таблиц, после чего Аксапта закрывается.


UpdateBuildNo

Существует: с версии 2.5 и выше
Тип: ApplInit

Пример использования:

Пример использования команды UpdateBuildNo в конфигурационной утилите

или в командной строке
-startupcmd=UpdateBuildNo

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

Как создать свою команду загрузки (startup command)

О том как создавать свои команды загрузки, немного сказано в руководстве разработчика на странице "Executing commands on startup".

Суть сводится к тому, что необходимо создать класс, который наследует SysStartupCmd. В вашем классе необходимо перекрыть метод applInit, applRun, infoInit или infoRun в зависимости от того, какой тип вы выберете для вашей команды. В принципе, можно перекрыть все методы.

Кроме того, надо изменить конструктор SysStartupCmd::construct() и добавить в switch разбор вашей команды.

Все, команда создана.

Есть еще один способ - перекрыть методы Application::StartupPost() и/или Info::StartupPost(). Но этот способ считается устаревшим. Не используйте этот способ - он может привести к проблемам при апгрейдах.



earlionak@rabota-na-rezultat.ru, Орлёнок Евгений
mazzy@mazzy.ru, Мазуркин Сергей