3.3.9. Экспорт и импорт приложения

Поскольку в Synergy IDE считается, что каждый объект приложения представляет собой отдельный файл или папку с файлами, был изменен подход к экспорту и импорту приложений Synergy.

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

Во-вторых, результатом экспорта является 7z-архив, содержащий полную структуру приложения, аналогичную отображаемой в навигаторе приложения, с точностью до имен файлов и некоторых метаданных отдельных объектов.

Соответственно, в качестве файла для импорта также принимается 7z-архив, содержащий все объекты приложения вне зависимости от того, какие из объектов фактически требуют замены. Причем исключается возможность управления версиями форм, удалением дочерних объектов при замене родительского, правами при замене объектов: в случае замены объекта он заменяется целиком, права на него также заменяются. Если для объекта были указаны права с использованием служебных групп, то эти права склеиваются.

В-третьих, для импорта архива в приложение необходимо, чтобы номер ревизии импортируемого приложения был больше или равен номеру ревизии текущего приложения. Если это не так, разработчик должен предварительно экспортировать текущее приложение и объединить его с импортируемыми изменениями.

Далее все эти изменения рассмотрены более подробно.

3.3.9.1. Экспорт приложения

Экспорт открытого приложения выполняется при выборе пункта меню «Приложения» - «Экспорт…». В случае подтверждения действия будет экспортирован архив, содержащий все объекты приложения. Структура этого архива строго регламентирована:

  1. В корне архива располагается папка application, содержащая файл <код_приложения>.application.json со сведениями о приложении.

  2. Для каждого объекта приложения в папке application создается отдельный файл / папка с файлами:

    • для папки приложения создается папка с таким же наименованием, содержащая файлы/папки входящих в нее объектов приложения;

    • для каждого объекта сущности «Форма» создается отдельная папка с названием <код_формы>.form, содержащая файлы и папки:

      • файл formDefinition.json с описанием структуры формы, связей с другими объектами приложения и значений компонентов по умолчанию;

      • папка formScripts, в которой располагаются файлы скриптов формы;

      • папка conditional_actions, в которой располагаются файлы условных действий;

      • файл шаблона печатного представления формы, если он был загружен;

      • [<код_динтаблицы>.]<код компонента>.js для каждого компонента формы, к которому был добавлен отдельный скрипт; <код_динтаблицы> указывается только в том случае, если компонент располагается в динамической таблице;

    • для каждого объекта сущности «Пользовательский компонент» создается отдельная папка с названием <код_компонента>.userModule, содержащая файлы:

      • description.json со сведениями об объекте;

      • script.js, содержащий код JavaScript;

      • template.html, содержащий код HTML;

    • для каждого объекта сущности «Скрипт интерпретатора» создается отдельная папка с названием <название_скрипта>.interpreterScript, содержащая файлы:

      • description.json со сведениями об объекте;

      • script.js, содержащий код скрипта;

    • для каждого объекта сущности «Пользовательский отчет» создается отдельная папка с названием <код_отчета>.userReport, содержащая файлы:

      • description.json со сведениями об отчете;

      • report.template.jrxml, содержащий шаблон отчета;

    • для каждой корневой группы пользователей создается отдельный файл <код_группы>.userGroup.json, содержащий описание самой корневой группы и ее дочерних групп;

    • для каждой корневой группы реестров, как и для групп пользователей, создается отдельный файл <код_группы>.registryGroup.json, содержащий описание самой корневой группы и ее дочерних групп;

    • для каждого объекта остальных сущностей создаются отдельные файлы json, имена которым присваиваются по правилу <код_объекта>.<имя_сущности>.json. Формат файлов соответствует форматам, используемым для экспорта/импорта конфигурации.

При экспорте может возникнуть ошибка, если в приложении есть объект, в коде которого содержится символ /. В этом случае необходимо изменить код этого объекта и выполнить новую попытку экспорта.

3.3.9.2. Импорт приложения

Импорт в открытое приложение выполняется при выборе пункта меню «Приложения» - «Импорт…», который доступен только при наличии у пользователя права изменения приложения.

Первым шагом при импорте приложения является выбор импортируемого архива:

Рисунок 3.98. Выбор импортируемого архива

Выбор импортируемого архива

Необходимо выбрать архив в формате 7z.

3.3.9.2.1. Предварительная валидация архива

После выбора архива выполняется его предварительная валидация. На этом этапе могут возникнуть ошибки:

  • Некорректный формат файла path/to/file.json: %текст_ошибки%

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

  • Не совпадает номер ревизии в сведениях о приложении в архиве и в среде импорта.

  • *Эта ошибка возникает в том случае, если в описании приложения в импортируемом архиве указан номер ревизии меньший, чем текущий номер ревизии этого приложения.

  • Неизвестный шаблон имени элемента path/to/object

    Ошибка возникает в случае, когда имя файла или папки в архиве не соответствует известным шаблонам (например, templateN.html вместо template.html для html-кода пользовательского компонента, или файл script.js без родительской папки)

  • Невозможно выполнить преобразование имени в код для элемента path/to/object: код, указанный в свойствах объекта, не соответствует имени элемента.

    Ошибка возникает в случае, когда код объекта, который содержится в файле json, не соответствует имени этого файла/ имени папки с учетом шаблонов именования.

  • Невозможно выполнить преобразование имени в код для элемента path/to/object: код объекта не соответствует правилам валидации для своей сущности

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

    • код 123 form некорректен для любой сущности, поскольку содержит пробел и начинается с цифры;

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

  • Невозможно выполнить преобразование имени в код для элемента path/to/object: данный код уже используется

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

  • Некорректно указаны обязательные параметры для объекта в файле path/to/file.json

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

3.3.9.2.2. Выбор импортируемых объектов

После предварительной проверки архива отображается дерево выбора объектов, которые необходимо импортировать:

Рисунок 3.99. Импорт объектов приложения

Импорт объектов приложения

В этом дереве:

  1. заблокированы объекты, состояние которых одинаково в приложении и в импортируемом архиве;

  2. выделены все объекты, которые необходимо добавить, обновить или переместить в другую папку этого приложения;

  3. не выделены, но доступны все объекты, которые есть в приложении, но которых нет в импортируемом архиве.

Диалоговое окно содержит новый флаг «Включать автоматически зависимые объекты», включенный по умолчанию. Если он включен, то при импорте объекта будут также импортированы все объекты, от которых он зависит. Если флаг отключен, то можно будет импортировать объекты независимо друг от друга, что позволяет избегать непреднамеренного перезаписывания объектов, которые изменяли разные разработчики.

3.3.9.2.3. Проверка целостности приложения

После выбора всех нужных объектов требуется выполнить проверку целостности конфигурации, которая будет получена в случае импорта. Для этого нужно нажать на кнопку «Проверить».

На этом этапе проверяется, что для всех объектов определены объекты, от которых они зависят. Возможные ошибки:

  • %Имя_сущности% %код_объекта% содержит объявления несуществующих или не выбранных объектов:%имя_сущности_отсутствующего_объекта1% с кодом %код_отсутствующего_объекта1%, …,%имя_сущности_отсутствующего_объектаN% с кодом %код_отсутствующего_объектаN%

Ошибка возникает в случае, если для какого-либо объекта был указан объект, от которого он зависит, но архив или приложение не содержат этого объекта:

  • в реестре указана некорректная ссылка на форму;

  • в карточках пользователей/должностей/подразделений указана некорректная ссылка на форму;

  • в действиях по сотрудникам/резерву указана некорректная ссылка на реестр;

  • в журнале - ссылка на шаблон номера;

  • в типе документа - ссылка на журнал;

  • в шаблоне документа - ссылка на тип документа.

Отсутствие остальных ссылок на несуществующие объекты не критично и не останавливает импорт.

  • %Имя_сущности% %код_объекта% содержит ссылки на объекты, которые будут удалены в результате импорта: %имя_сущности_удаляемого_объекта1% с кодом %код_удаляемого_объекта1%, …, %имя_сущности_удаляемого_объектаN% с кодом %код_удаляемого_объектаN%

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

Если валидация была завершена успешно, можно вернуться к выбору импортируемых объектов для того, чтобы выбрать что-то дополнительно или, наоборот, снять выделение с объекта и снова проверить целостность приложения. Также можно начать непосредственно импорт выбранных объектов, нажав на кнопку «Импортировать».

Импорт увеличивает номер ревизии приложения, а в мониторинге будет добавлено новое событие конфигуратора «Импорт приложения».

3.3.9.2.4. Правила замены объектов приложения

В результате импорта могут быть изменены свойства объекта, его состояние (активный/скрытый), и могут быть добавлены новые объекты или удалены существующие:

Среда импорта Импортируемый архив Результат
Есть активный объект Есть активный объект Активный объект из архива
Есть скрытый объект Есть активный объект Активный объект из архива
Есть активный объект Есть скрытый объект Скрытый объект из архива
Есть скрытый объект Нет объекта Скрытый объект из среды импорта
Есть активный объект, допустимо его удаление Нет объекта Объект удаляется из среды импорта (с учетом проверки целостности)
Есть активный объект, допустимо его скрытие Нет объекта Объект в среде импорта скрывается
Нет объекта Есть объект Добавляется объект из приложения (с учетом проверки целостности)

Папки, не содержащие объектов (кроме других папок), не импортируются.

3.3.9.3. Методы API для экспорта и импорта приложения

3.3.9.3.1. API экспорта приложения

URL метода: rest/api/app/export

Тип метода: GET

Метод принимает один параметр: app_code - код экспортируемого архива.

В случае успеха возвращает архив 7z со всеми объектами приложения.

В случае ошибки возвращается json со следующими полями:

  • errorCode - код выполнения (не равный 0);

  • errorMessage - сообщение о результате выполнения (только неуспешном).

Альтернативный поток 1. Не найдено приложение с кодом <app_code>. Сервер возвращает ошибку 400 с сообщением:


   {
        "errorCode": 904, 
        "errorMessage": "Не найдено приложение <app_code>"
    }

Альтернативный поток 2. Пользователь не авторизован, или у авторизованного пользователя недостаточно прав для экспорта. Сервер возвращает ошибку 403 с сообщением:


   {
        "errorCode": 2, 
        "errorMessage": "Пользователь не авторизован, или у пользователя недостаточно прав для экспорта"
    }

Альтернативный поток 3. Экспорт приложения завершен с ошибками. Сервер возвращает ошибку 400 с сообщением:


   {
        "errorCode": 3, 
        "errorMessage": "%текст_первой_полученной_ошибки%"
    }
3.3.9.3.2. API импорта приложения

URL метода: rest/api/app/import

Тип метода: POST

Параметры:

  • data - файл, который необходимо импортировать (обязательный);

  • locale - код локали (не обязательный, при отсутствии параметра используется язык системы по умолчанию).

Метод возвращает json со следующими полями:

  • errorCode - код выполнения, 0 - успешно, иначе - ошибка;

  • errorMessage - сообщение о результате выполнения (успешном либо неуспешном).

  • messages - архив логов импорта с элементами:

    • type - тип сообщения, возможные значения: error или info;

    • messages - текст сообщения;

    • added - время на сервере в момент возникновения сообщения.

Код приложения для импорта выделяется из архива data. Если экземпляр Synergy не содержит приложения с таким кодом, то в случае успешного импорта оно будет создано.

Альтернативный поток 1. Не передан параметр data. Сервер возвращает ошибку 400 с сообщением:


   {
        "errorCode": 3, 
        "errorMessage": "Не передан параметр data"
    }

Альтернативный поток 2. Передан невалидный параметр data. Сервер возвращает ошибку 400 с сообщением:


   {
        "errorCode": 3, 
        "errorMessage": "Ошибка при чтении архива data"
    }

Альтернативный поток 3. Пользователь не авторизован, или у авторизованного пользователя недостаточно прав для импорта.Сервер возвращает ошибку 403 с сообщением:


   {
        "errorCode": 2, 
        "errorMessage": "Пользователь не авторизован, или у пользователя недостаточно прав для импорта"
    }

Альтернативный поток 4. Валидация архива завершена с ошибками. Сервер возвращает ошибку 400 с сообщением:


   {
        "errorCode": 3, 
        "errorMessage": "Чтение архива произошло с ошибками"
        "messages": [
            /*логи импорта*/
        ]
    }

Альтернативный поток 5. В случае других ошибок сервер возвращает ошибку HTTP 500.