С выходом облачной версии системы Microsoft Dynamics NAV 365 Business наступил тот момент, которого так боялись все разработчики, последние 20 лет считающие, что основное преимущество Dynamics NAV как платформы – возможность её быстрой и простой модификации. Потому что уже совсем скоро модифицировать стандартный функционал будет нельзя, во всяком случае, в привычном понимании – и все изменения вносить в систему будет можно только посредством дополнительных инструментов, например, так называемых Расширений (Extensions).
Сейчас в сообществе активно обсуждается будущее разработчика Dynamics NAV – многие опасаются, что эта профессия находится под угрозой. Я так не считаю. Возможно, значимость разработчика NAV несколько снизится, потому что более востребованным станет хороший консультант, который сможет рассказать, как стандартный функционал натянуть на бизнес-процесс клиента. Однако, без модификаций всё равно не обойтись, и разработчику будет необходимо перестроить свой подход, своё мышление под новую архитектуру разработки. Несмотря на то, что версия on-premise существует – буквально пару недель назад стала доступна для скачивания новая версия Dynamics NAV 2017 – и в road-map Майкрософта версия on-premise всё ещё присутствует – вот несмотря на это вот всё настоятельно рекомендуется уже сейчас, на ваших текущих on-premise версиях, применять модификации посредством Extensions, или хотя бы задумываться, а как вашу модификацию сделать посредством этой новой разработческой архитектуры. Иначе, ваша профессия действительно перестанет быть востребованной.
В этой статье я постараюсь максимально простым языком рассказать о том, что такое Расширения и как теперь работает архитектура системы с точки зрения разработчика. Чтобы не изобретать велосипед, я позаимствовал структуру изложения у Eric Wauters (Waldo), который очень доходчиво рассказывал по теме на недавно прошедшем Directions EMEA 2016 в Праге.
Итак, Расширения (Extensions) – это дополнительные объекты функциональности, устанавливаемые в стандартную систему Microsoft Dynamics NAV, распространяемые в виде преднастроенного пакета (.navx файл), и созданные таким образом, что они не изменяют непосредственно стандартный функционал.
Ранее вы создавали кастомизации в разработческой среде, модифицируя непосредственно сами объекты, и выгружали эти модифицированные объекты. Далее, вы загружали эти объекты в рабочую базу и разрешали конфликты мёрджа при импорте объектов. Сейчас процесс немного изменился – необходимо выгружать разницу (delta) между старыми и новыми объектами, и это как раз и будет являться пакетом Расширений, который «легко и непринуждённо» можно будет далее загрузить.
Пакет Расширений может содержать один или несколько объектов (txt), дополнения к текущим объектам, т.е. дельта (delta, разница) между новыми и старыми объектами, и наборы разрешений (permission sets). Пакет может быть подписан, и обычно (если вы всё делаете правильно) содержит манифест с описанием, автором и номером версии. Встраиваться в стандартный код можно будет через События (Events), - поэтому сейчас главная задача сообщества вытребовать от Майкрософт как можно больше правильных и нужных Событий, доступных для разработчиков.
Наверное, вас сейчас мучает вопрос, а для чего вообще это всё было сделано. В основном, вот для чего:
- Чтобы иметь стандартную облачную коробку и предоставлять её клиентам на условиях SaaS без модификаций основного функционала, но с возможностью дорабатывать её «сбоку» под конкретного клиента. Это - repeatability, о которой много говорит Майкрософт.
- Чтобы легко распространять кастомизации. Поскольку Расширения – это самодостаточные контейнеры, описывающие разницу между объектами, их использование исключает конфликты при мёрдже.
- Просто производить апгрейды и накатывать кумулятивные обновления, потому что Расширения лежат «сбоку» и не требуют дополнительных анализов объектов для мёрджа.
- Использование событий (Events) позволяет изменять поведение функционала без изменения исходного кода.
- Расширения можно использовать в разрезе тенантов (per tenant), разрабатывая разную функциональность под разные требования клиентов.
Для Расширений:- Следующие типы объектов могут использоваться: ◦Таблицы (Tables)
- Страницы (Pages)
- Отчёты (Reports)
- XML-порты (XML Ports)
- Запросы (Queries)
- Шаблоны отчётов (Custom Reports Templates)
- Поддержка Веб-сервисов (Web Services)
- Бэкапирование и восстановление данных:
- NAVAPP.RESTOREARCHIVEDATA
- NAVAPP.DELETEARCHIVEDATA
- Обновлённый PowerShell для загрузки Расширений, в т.ч. загрузка в базу SQL на Azure
- Поддержка .NET Framework Add-Ins
- Мультиязыковые кэпшены (Multilanguage captions)
Как это работает:- Разработчик разрабатывает новую функциональность в отдельной "песочнице"
- Разработчик выгружает пакет Расширений
- Администратор базы публикует этот пакет Расширений
- Администратор базы инсталлирует этот пакет Расширений
Основные команды (CmdLets) PowerShell для Расширений:- Get-NAVAppInfo – Получить информацию о NAV App на основании указанного файла пакета или указанного Microsoft Dynamics NAV Server Instance
- Get-NAVAppTenant – Позволяет получить информацию о тенанте, на котором NAV App установлен
- Install-NAVApp – Установить опубликованный NAV App для тенанта
- Publish-NAVApp – Опубликовать NAV App для каталога приложений, указанных для Microsoft Dynamics NAV Server Instance
- Repair-NAVApp – Попытка исправить NAV App путём рекомпилирования в текущем приложении
- Uninstall-NAVApp – де-инсталлирует NAV App для тенанта
- Unpublish-NAVApp – отмена публикования NAV App для каталога приложений, указанных для Microsoft Dynamics NAV Server Instance
- Export-NAVAppPermissionSet – Выгрузить указанный набор разрешений из базы данных в файл
- Get-NAVAppManifest – Получить манифест для NAV App из внешнего источника
- New-NAVAppManifest – Создать новый виртуальный (in-memory) объект манифеста с указанными метаданными NAV App
- New-NAVAppManifestFile – Создать файл с метаданными для пакета NAV App
- New-NAVAppPackage – Создать файл .navx пакета Расширений по указанному пути и с указанным манифестом
- Set-NAVAppManifest – Установить одно или несколько свойств на виртуальный (in-memory) манифест
Что происходит на стороне разработчика:
(https://msdn.microsoft.com/en-us/lib...v=nav.90).aspx)
Получение / Создание / Модификация Манифеста (Get/Create/Update Manifest):
- New-NAVAppManifest
- Set-NAVAppManifest
- Get-NAVAppManifest
- New-NAVAppManifestFile
- Get-NAVAppInfo
Выгрузка метаданных приложения (NAVApp Metadata Export):
- Export-NAVAppPermissionSet
- Export-NAVAppReportLayout
- Export-NAVAppTableData
- Export-NAVAppTenantWebService
Создание пакета Расширений .navx:
Что происходит на стороне администратора:
(https://msdn.microsoft.com/en-us/lib...v=nav.90).aspx)
Публикация пакета Расширений:
- Publish-NAVApp
- Unpublish-NAVApp
Установка пакета Расширений:
- Install-NAVApp
- Uninstall-NAVApp
Управление пакетом Расширений:
- Get-NAVAppInfo
- Get-NAVAppTenant
- Repair-NAVApp
Что содержится в Манифесте:
(https://msdn.microsoft.com/en-us/lib...v=nav.90).aspx)
Элемент Приложения (App Element):
- AppID
- Name
- Publisher
- Description
- Version (Major.Minor.Build.Revision)
- CompatibilityID (Major.Minor.Build.Revision)
Элемент Возможностей (Capabilities Element):
- UIChanges / UIAdds / SchemaChanges / SchemaAdds / CodeAdds / PermissionSets)
Элемент Условия (Prerequisites Element)
- Опционально; IDшники специфических объектов
Элемент Зависимости (Dependences Element)
Когда пакет Расширений публикуется (Publish-NAVApp), происходит примерно следующее:- Читается файл .navx
- Проверяются Условия (Prerequisites) и Зависимости (Dependences) (объекты и другие Расширения)
- Создаётся «песочница» (Sandbox) – копирование приложения во временную новую базу:
- Установка объектов на основании дельты в пакете Расширений в базу «песочницы»
- Компилирование изменённых объектов
- Копирование изменённых объектов обратно в базу приложения
- Удаление «песочницы»
- Добавляются записи с информацией о манифесте и содержанием файла .navx в таблицу, содержащую информацию о Расширениях
Когда пакет Расширений устанавливается (Install-NAVApp), происходит примерно следующее:- Искомое Расширение находится в таблице, хранящей информацию о расширении
- Производится проверка на то, что все зависимости (dependences) установлены для этого тенанта
- Добавляется запись с этим NAV App в тенант приложения
- Добавляется запись с этим NAV App в установленное приложение
- Пересинхронизируется схема базы данных при необходимости
- Вызывается процедура апгрейда/инициализации кода внутри самого приложения:
- OnNAVAppUpgradePerDatabase
- OnNavAppUpgradePerCompany
Если Вы хотите изменить Расширение, которое уже было установлено, Вам нужно сначала удалить ранее загруженное Расширение, а потом – установить новую редакцию:
- Де-инсталляция:
- Удаление Расширения
- Удаление объектов, таблиц
- Сохранение _данных_ в архив (!)
- Новая установка:
- Выполнение установки пакета Расширений
- Восстановление сохранённых данных из архива (!)
Вот коротко, что будет происходить с разработкой в будущем. Я настоятельно рекомендую прямо сейчас это попробовать, потому что, хотим мы того или нет, это будет одним из тех немногих вариантов, которые нам останутся. Awara IT Solutions уже распробовали :-)