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

К сожалению, обновлятор не имеет полноценного 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" автоматически удаляется.