# Повторное использование существующего приложения

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

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

В пользу повторного использования говорят три аргумента:

* `--appId APP_ID` — Укажите идентификатор приложения напрямую.
* `--appIdFile PATH` — Считать идентификатор приложения из первой строки текстового файла.
* `--reuseAppId` — Считать идентификатор приложения из `cloud/cloud_state.json` в подпапке проекта. Этот файл записывается автоматически после каждого развертывания.

Файл `cloud/cloud_state.json` хранится в подпапке проекта (например, `<outputDir>/Sales/cloud/cloud_state.json`). В файле фиксируются идентификатор приложения, хеш медиафайла, сопоставление идентификаторов листов, путь к исходному файлу и Метка времени. Флаг `--reuseAppId` считывает этот файл автоматически, поэтому последующие запуски обновляют то же приложение без необходимости ручного ввода ID приложения. В пакетном режиме `--reuseAppId` работает для каждого проекта отдельно — каждый проект считывает `cloud_state.json` из собственной выходной подпапки.

## Сопоставление идентификаторов листов

Каждый документ QlikView идентифицирует листы по внутренним именам, таким как `Document\SH01`, `Document\SH02` и так далее. Qlik Sense использует UUID для идентификации листов. Когда QV2QS впервые развертывает приложение, каждый преобразованный лист получает новый UUID. QV2QS сохраняет сопоставление между именем листа QlikView и UUID Qlik Sense внутри целевого приложения, чтобы эта связь сохранялась между развертываниями.

При последующих развертываниях в то же приложение QV2QS считывает сохраненное сопоставление и присваивает исходные UUID Qlik Sense соответствующим преобразованным листам. Сопоставление предотвращает появление дубликатов листов в приложении и сохраняет закладки, избранное и прямые ссылки, ссылающиеся на определенный идентификатор листа.

Сопоставление хранится в двух местах:

* Внутри приложения Qlik Cloud — специальный объект в приложении содержит сопоставление. Сопоставление перемещается вместе с приложением, если приложение перемещено в другое пространство или экспортировано как QVF.
* В локальной папке проекта — файл `cloud/cloud_state.json` содержит копию того же сопоставления. Флаг `--reuseAppId` считывает идентификатор приложения и сопоставление из этого файла.

QV2QS всегда считывает сопоставление из приложения в облаке (а не из локального файла) при подготовке к повторному развертыванию. Локальный файл предназначен для удобства поиска идентификатора приложения с помощью флага `--reuseAppId`.

### Оптимизация хеша медиафайлов

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

### Проверка сопоставления

Перед подготовкой листов к замене QV2QS сверяет сохраненное сопоставление с активным приложением. Если между развертываниями лист был удален вручную из приложения Qlik Cloud, QV2QS обнаруживает, что лист больше не существует, удаляет устаревшую запись из сопоставления и при следующей сборке обрабатывает соответствующий лист QlikView как новый. Обновленное сопоставление записывается обратно в приложение после завершения сборки.

### Листы, добавленные или удаленные в источнике QlikView

Когда лист добавляется в источник QlikView после первоначального развертывания, QV2QS присваивает листу новый UUID и добавляет запись в сопоставление. Если лист удаляется из источника QlikView, он больше не присутствует в результатах сборки и удаляется из приложения Qlik Cloud во время сборки. Запись сопоставления для удаленного листа не переносится.

## Сопоставление папки проекта

QV2QS записывает файл-маркер `.qv2qs_source` в каждую выходную папку проекта после первой конвертации. Маркер записывает полный путь к исходному файлу QVW. При последующих запусках QV2QS использует маркер для поиска нужной папки проекта для заданного файла QVW, даже если несколько папок имеют одинаковое базовое имя (например, `Sales/`, `Sales_2/`, `Sales_3/`).

Маркер гарантирует, что каждый файл QVW сопоставляется ровно с одной выходной папкой. При преобразовании файла QVW, который ранее уже был преобразован, QV2QS ищет в корневой папке вывода вложенную папку, маркер которой совпадает с исходным путем. Если найдено совпадение, QV2QS повторно использует эту папку и считывает `cloud_state.json` внутри нее. Если совпадение не найдено, QV2QS создает новую подпапку с числовым суффиксом.

В мастере применяется та же логика сопоставления. Когда включен параметр Повторно использовать существующее приложение, мастер проверяет выходную папку на наличие подходящего проекта и автоматически заполняет поле AppId из предыдущего развертывания. Если предыдущее развертывание не найдено, поле остается пустым и принимает ручной ввод или выбор с помощью средства обзора.

Примечание к информации

Файл-маркер `.qv2qs_source` создается автоматически. Не редактируйте и не удаляйте файл. Удаление маркера приводит к тому, что при следующем запуске QV2QS создает новую подпапку проекта вместо повторного использования существующей.

## Поведение при повторном развертывании

QV2QS использует `qlik app build`, чтобы развернуть в целевом приложении. Команда сборки выполняет полную замену объектной модели приложения. Все объекты, определенные в выходных данных сборки, записываются в приложение. Объекты, отсутствующие в выходных данных сборки, удаляются.

Перед запуском сборки QV2QS подготавливает существующие листы к замене. QV2QS проверяет сопоставление листов с активным приложением (см. [Сопоставление идентификаторов листов](https://help.qlik.com/ru-RU/migration/Content/Qv2qsMigration/deploying-to-qlik-cloud/reusing-an-existing-app.htm#sheet-id-mapping)), фиксирует состояние публикации и ранг каждого листа и удаляет старые листы из приложения в облаке. Результат локальной сборки пропатчивается исходными идентификаторами листов Qlik Sense, чтобы закладки и ссылки, ссылающиеся на эти идентификаторы, продолжали работать после сборки.

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

Примечание к предупреждению

Созданный пользователем контент в целевом приложении (добавленные вручную листы, закладки, истории или настраиваемые объекты, созданные после предыдущего развертывания) не сохраняется при повторном развертывании. Команда `qlik app build` заменяет содержимое приложения результатом сборки. Создайте резервную копию или опубликуйте приложение перед повторным развертыванием, если были внесены изменения вручную.

## Резервная копия перед развертыванием

При повторном использовании существующего приложения QV2QS автоматически экспортирует резервную копию QVF без данных перед изменением приложения. Резервная копия сохраняет структуру приложения (листы, объекты, Скрипт загрузки и метаданные) без данных, поэтому экспорт выполняется быстро, а файл имеет небольшой размер.

Резервные копии сохраняются в `cloud/backups/` внутри выходной папки проекта. Каждый файл резервной копии называется `<AppName>_<shortId>_<timestamp>_nodata.qvf`. Например, `Sales_a1b2c3d4_20260226-143025_nodata.qvf`.

Если экспорт резервной копии завершается ошибкой (например, из-за прерывания сетевого соединения или недостаточных прав доступа), QV2QS записывает предупреждение в журнал и продолжает развертывание. Сбой не блокирует конвертацию.

Чтобы пропустить автоматическое резервное копирование, передайте `--noBackup` в командной строке или включите параметр Пропустить резервное копирование перед развертыванием в мастере. Пропуск резервного копирования полезен в конвейерах CI/CD, где резервные копии управляются извне.

## Сохранение Скрипта загрузки целевого приложения

По умолчанию QV2QS заменяет Скрипт загрузки в целевом приложении на преобразованный Скрипт загрузки из источника QlikView. Используйте `--preserveTargetAppScript`, чтобы сохранить существующий Скрипт загрузки в целевом приложении без изменений. Преобразованный Скрипт загрузки записывается в локальный файл `build/script.qvs`, но не применяется к облачному приложению.

Для этого параметра требуется `--appId` или `--reuseAppId`, поскольку он применяется только при выборе существующего приложения в качестве целевого. Его можно комбинировать с `--reload` для выполнения существующего скрипта после обновления пользовательского интерфейса, что полезно, когда целевое приложение уже имеет работающие подключения к данным Qlik Cloud. Его также можно комбинировать с `--autoBinary` для временной загрузки данных из исходного файла QVW, сохраняя целевой скрипт без изменений.

## Сохранение переменных целевого приложения

По умолчанию QV2QS заменяет переменные в целевом приложении преобразованными переменными из источника QlikView. Используйте `--preserveTargetAppVariables`, чтобы сохранить существующие переменные в целевом приложении без изменений. Преобразованные переменные записываются в локальный файл `variables.json`, но не применяются к облачному приложению.

Для этого параметра требуется `--appId` или `--reuseAppId`, поскольку он применяется только при выборе существующего приложения в качестве целевого. Его можно сочетать с `--preserveTargetAppScript`, чтобы сохранить в неизменном виде как Скрипт загрузки, так и переменные целевого приложения.

## Подробнее

* [Сборка и развертывание](https://help.qlik.com/ru-RU/migration/Content/Qv2qsMigration/deploying-to-qlik-cloud/build-and-deployment.htm)
* [Данные и перезагрузка](https://help.qlik.com/ru-RU/migration/Content/Qv2qsMigration/deploying-to-qlik-cloud/data-and-reload.htm)
* [Пакетная конвертация](https://help.qlik.com/ru-RU/migration/Content/Qv2qsMigration/batch-conversion/index.htm)