Показать сообщение отдельно
Старый 27.11.2016, 01:31   #1  
Александр Ермаков is offline
Александр Ермаков
Участник
Аватар для Александр Ермаков
Most Valuable Professional
 
43 / 35 (2) +++
Регистрация: 25.11.2016
Адрес: Россия
Post Расширения (Extensions) для Microsoft Dynamics NAV 2017 «на пальцах», или один из немногих оставшихся вариантов разработки в Dynamics NAV в будущем
С выходом облачной версии системы 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:
  • New-NAVAppPackage

Что происходит на стороне администратора:
(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)
  • Другие NAV Apps

Когда пакет Расширений публикуется (Publish-NAVApp), происходит примерно следующее:
  • Читается файл .navx
  • Проверяются Условия (Prerequisites) и Зависимости (Dependences) (объекты и другие Расширения)
  • Создаётся «песочница» (Sandbox) – копирование приложения во временную новую базу:
  • Установка объектов на основании дельты в пакете Расширений в базу «песочницы»
  • Компилирование изменённых объектов
  • Копирование изменённых объектов обратно в базу приложения
  • Удаление «песочницы»
  • Добавляются записи с информацией о манифесте и содержанием файла .navx в таблицу, содержащую информацию о Расширениях


Когда пакет Расширений устанавливается (Install-NAVApp), происходит примерно следующее:
  • Искомое Расширение находится в таблице, хранящей информацию о расширении
  • Производится проверка на то, что все зависимости (dependences) установлены для этого тенанта
  • Добавляется запись с этим NAV App в тенант приложения
  • Добавляется запись с этим NAV App в установленное приложение
  • Пересинхронизируется схема базы данных при необходимости
  • Вызывается процедура апгрейда/инициализации кода внутри самого приложения:
  • OnNAVAppUpgradePerDatabase
  • OnNavAppUpgradePerCompany

Если Вы хотите изменить Расширение, которое уже было установлено, Вам нужно сначала удалить ранее загруженное Расширение, а потом – установить новую редакцию:
  • Де-инсталляция:
  • Удаление Расширения
  • Удаление объектов, таблиц
  • Сохранение _данных_ в архив (!)
  • Новая установка:
  • Выполнение установки пакета Расширений
  • Восстановление сохранённых данных из архива (!)


Вот коротко, что будет происходить с разработкой в будущем. Я настоятельно рекомендую прямо сейчас это попробовать, потому что, хотим мы того или нет, это будет одним из тех немногих вариантов, которые нам останутся. Awara IT Solutions уже распробовали :-)