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