# Как можно интегрировать обновлятор с другими программными комплексами?

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

## Программное добавление новых баз

Вы можете импортировать (и удалять) новые базы в обновлятор, передавая их описание в JSON формате. Эта возможность подробно описана в папке установленного обновлятора Resources\Import. Но сразу скажу, что свойства баз, которые можно задать для такого импорта крайне ограничены. Поэтому настройте значения по умолчанию для новых баз.
Это делается в обновляторе следующим образом:

- закладка "Настройки программы"
- кнопка "Дополнительные настройки"
- закладка "События"
- закладка "При добавлении новой базы"

Здесь выберите базы-образцы из которых будут копироваться настройки при создании новых баз.

## Запуск операций через командную строку

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

## Одновременный запуск нескольких обновляторов

При запуске нескольких обновляторов через командную строку вы не получите ожидаемой параллельной работы. Обновляторы выстроятся в очередь и всё-равно будут выполнять операции по очереди, то есть в один момент сможет выполняться только один экземпляр.
Если нужно именно параллельное выполнение - размножьте экземпляры обновлятора, установив их в разные папки в режиме Portable (выбирается в установщике). Тогда они не будут мешать друг другу. Но только проследите, если будете копировать настройки (папка Data/Settings), чтобы содержимое файла Data\Settings\Guid.Dat было у каждого экземпляра уникальным.
Также можно использовать один установленный обновлятор и иметь множество папок Data (где хранятся все настройки и папки с данными). Тогда при вызове обновлятора через командную строку необходимо передавать параметр AppData в командной строке с путём до нужной папки Data (этот же внутрнний механизм используется обновлятором для запуска множества потоков), например: Updater1C.exe -AppData "x:\work\data01" ...

## Получение результатов операции

Вызов обновлятора через командую строку всегда возвращает 0, если в операции не было ошибок и не 0, если были (или вызов обновлятора завершился аварийно).
Более подробные результаты операции обновлятор записывает в папку Data/Reports.
Предположим, что мы запустили операцию архивации 2 баз. Тогда обновлятор запишет общий отчёт в формате html, включающий операции по обеим базам, в файл в папке Data/Reports/_all_/yyyy/MM/dd/HH-mm-ss.html.
Индивидуальные отчёты по каждой из баз будут записаны в файлы Data/Reports/path_to_base/yyyy/MM/dd/HH-mm-ss.html. При этом path_to_base - это путь к базе, в котором символы, запрещённые к использованию в имени папки (например двоеточие и слеш) заменены на пробел.
Внимание! Теперь обновлятор сохраняет структурированную информацию о результатах операции в формате JSON в отдельном файле рядом с индивидуальным отчётом по базе. Файл имеет то же имя, что и HTML-отчёт, но с расширением '.json'. Например, если HTML-отчёт называется 'HH-mm-ss.html', то JSON-файл будет называться 'HH-mm-ss.json'.
Таким образом вы можете получать структурированную информацию в формате JSON из индивидуальных отчётов по базам для программной обработки.
В качестве примера, вот как может выглядеть содержимое JSON-файла:

        {
          "NameOfBase": "Горизонт",
          "PathOfBase": "X:\\Bases\\Горизонт",
          "KindOfOperation": "Update",
          "StartOfOperation": "2023-02-27T10:22:58Z",
          "NameOfOperation": "обновление баз",
          "StatusOfOperation": " [обновлена до 3.0.110.29]",
          "Skipped": false,
          "WereErrors": false,
          "WereWarnings": false,
          "CreatedBackups": [
            {
              "PathOfBackup": "X:\\Backups\\Горизонт {X Bases Горизонт}\\Горизонт 2023-02-27 (20-23-07) {8.3.22.1704, 3.0.108.36} [перед обновлением].7z",
              "CloudIdentifiers": []
            }
          ],
          "ErrorMessage": "",
          "InstalledUpdates": [
            {
              "Path": "x:\\Templates1C\\1C\\Accounting\\3_0_110_29\\1cv8.cfu",
              "ConfigVersion": "3.0.110.29",
              "VendorName": "Фирма \"1С\"",
              "ConfigName": "БухгалтерияПредприятия"
            }
          ],
          "InstalledPatches": [
            {
              "Name": "EF_00_00460969",
              "Description": "Отсутсвует проверка перед открытием",
              "ModifiedMetadata": "Документ.ЭлектронныйДокументИсходящийЭДО.Форма.ФормаПросмотра.АдресДанныхСертификата\nДокумент.ЭлектронныйДокументИсходящийЭДО.Форма.ФормаПросмотра.ОткрытьСертификат"
            },
            {
              "Name": "EF_10238701",
              "Description": "В универсальном отчете статистики(Статистика: Прочие формы) исправлена выгрузка периода за который сдается отчет",
              "ModifiedMetadata": "Отчет.РегламентированныйОтчетСтатистикаПрочиеФормы.Форма.ФормаОтчета.ДобавитьСправочникВТаблицу"
            }
          ],
          "RevokedPatches": [],
          "PlainStatusOfOperation": "обновлена до 3.0.110.29"
        }

Вот описание класса на C#, который представляет JSON файл:

        class ReportData
        {
            string NameOfBase; // имя базы
            string PathOfBase; // путь к базе
            BaseOperation KindOfOperation; // вид операции, см. возможные варианты ниже
            DateTime StartOfOperation; // дата и время начала выполнения операции
            string NameOfOperation; // название операции
            string StatusOfOperation; // конечный статус выполнения операции (представление результата) в формате html
            bool Skipped; // было ли пропущено выполнение операции
            bool WereErrors; // были ли ошибки при выполнении операции
            bool WereWarnings; // были ли предупреждения при выполнении операции
            List<CreatedBackup> CreatedBackups; // созданные резервные копии, см. опиание ниже
            string ErrorMessage; // сообщение с ошибкой, если WereErrors = true
            List<UpdateInfo> InstalledUpdates; // успешно установленные обновления, см. описание ниже
            List<PatchInfo> InstalledPatches; // успешно установленные патчи, см. описание ниже
            List<PatchInfo> RevokedPatches; // удалённые из базы патчи из-за того, что они отозваны
            string PlainStatusOfOperation; // конечный статус выполнения операции, очищенный от тегов html
            enum BaseOperation
            {
                None,
                Script, // выполнение скрипта
                CheckSettings, // проверка настроек
                Backup, // архивация
                FindUpdates, // поиск обновлений
                DownloadUpdates, // скачивание обновлений
                Update, // обновление
                CollectReports, // сбор отчётов по операциям за период
                CleanTempFiles, // очистка временных файлов
                DownloadTestUpdates // скачивание ознакомительных обновлений
            }
            class CreatedBackup
            {
                string PathOfBackup; // путь к резервной копии
                List<string> CloudIdentifiers; // внутренние идентификаторы облаков, на закачку в которые поставлена резервная копия
            }
            class UpdateInfo
            {
                string Path; // путь к файлу с обновлением (cfu или cf)
                string ConfigVersion; // версия конфигурации обновления
                string VendorName; // имя разрабтчика обновления
                string ConfigName; // имя конфигурации обновления
            }
            class PatchInfo
            {
                string Name; // название патча
                string Description; // описание патча
                string ModifiedMetadata; // какие метаданные меняет патч
            }
        }

## Проверка состояния загрузки файлов в облака

При каждом запуске обновлятор проверяет, есть ли в очереди на загрузку в облака файлы, не загруженные более 48 часов. Если такие файлы обнаруживаются, то помимо того, что эта информация выводится пользователю в интерфейсе программы и попадает в отчёт по операции, в папке Data создаётся файл "CloudsProblem" (без расширения). Это позволяет внешнему ПО понять, что возникли проблемы с загрузкой в облака. Если впоследствии обновлятор обнаруживает, что не осталось файлов, ожидающих загрузку свыше 48 часов, файл "CloudsProblem" автоматически удаляется.