Загрузить установить обновления фоновом режиме. Получение и установка обновлений в файловом варианте.
////////////////////////////////////////////////////////////////////////////////
// Получение и установка обновлений в файловом варианте.
// Выполняется в фоновом задании.
Процедура ЗагрузитьИУстановитьОбновленияВФоновомРежиме(Параметры, АдресРезультата) Экспорт
Если Не ДоступноИспользованиеОбновленияПрограммы(Истина, Ложь) Тогда
ВызватьИсключение НСтр("ru = 'Использование обновления программы недоступно в текущем режиме работы.'");
КонецЕсли;
Контекст = Параметры.КонтекстОбновления;
Если Контекст = Неопределено Тогда
Контекст = ПолучениеОбновленийПрограммыКлиентСервер.НовыйКонтекстПолученияИУстановкиОбновлений(Параметры);
Иначе
// Сброс состояния ошибки.
Контекст.Вставить("ИмяОшибки" , "");
Контекст.Вставить("Сообщение" , "");
Контекст.Вставить("ИнформацияОбОшибке", "");
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ДанныеАутентификации = ИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки();
УстановитьПривилегированныйРежим(Ложь);
Если ДанныеАутентификации = Неопределено Тогда
Контекст.Вставить("ИмяОшибки", "НеЗаполненыДанныеАутентификации");
Контекст.Вставить("Сообщение", НСтр("ru = 'Не заполнены данные аутентификации.'"));
СообщитьСостояние("Ошибка", , Контекст);
Возврат;
КонецЕсли;
ПолученоФайлов = 0;
ОбъемПолученныхФайлов = 0;
// 1) Получение файла обновления платформы.
Если Контекст.ОбновитьПлатформу Тогда
ЗаписатьИнформациюВЖурналРегистрации(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Получение обновления платформы 1С:Предприятие: версия %1; URL: %2'"),
Контекст.ВерсияПлатформы,
Контекст.URLФайлаОбновленияПлатформы));
Если Не ПустаяСтрока(Контекст.КаталогДистрибутиваПлатформы) Тогда
ПолученоФайлов = 1;
ОбъемПолученныхФайлов = ОбъемПолученныхФайлов + Контекст.РазмерОбновленияПлатформы;
ЗаписатьИнформациюВЖурналРегистрации(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Обновление платформы 1С:Предприятие уже было загружено ранее в %1'"),
Контекст.КаталогДистрибутиваПлатформы));
Иначе
КаталогУстановкиПлатформы = ПолучениеОбновленийПрограммыКлиентСервер.КаталогУстановкиПлатформы1СПредприятие(
Контекст.ВерсияПлатформы);
Если КаталогУстановкиПлатформы <> Неопределено Тогда
// Платформа уже установлена.
ПолученоФайлов = 1;
ОбъемПолученныхФайлов = ОбъемПолученныхФайлов + Контекст.РазмерОбновленияПлатформы;
Контекст.Вставить("ОбновлениеПлатформыУстановлено", Истина);
ЗаписатьИнформациюВЖурналРегистрации(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Версия %1 платформы 1С:Предприятие уже установлена на компьютере.'"),
Контекст.ВерсияПлатформы));
Иначе
// Загрузить файл платформы.
Контекст.ТекущееДействие =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Получение файла %1 из %2'"),
Строка(ПолученоФайлов + 1),
Контекст.КоличествоФайлов);
СообщитьСостояние("ПолучениеФайлов", , Контекст);
ЗагрузитьОбновлениеПлатформы(Контекст, Параметры, ДанныеАутентификации);
Если Не ПустаяСтрока(Контекст.ИмяОшибки) Тогда
// Ошибка загрузки платформы.
СообщитьСостояние("Ошибка", , Контекст);
Возврат;
Иначе
ПолученоФайлов = 1;
ОбъемПолученныхФайлов = ОбъемПолученныхФайлов + Контекст.РазмерОбновленияПлатформы;
Контекст.Прогресс = 75 * (ОбъемПолученныхФайлов / Контекст.ОбъемФайлов);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// 2) Получение файлов обновления конфигурации.
Для Каждого ТекОбновление Из Контекст.ОбновленияКонфигурации Цикл
ЗаписатьИнформациюВЖурналРегистрации(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Получение обновления конфигурации.
|URL: %1;
|Размер: %2;
|Формат файла обновления: %3;
|Контрольная сумма файла обновления: %4;
|Каталог дистрибутива: %5;
|Выполнить обработчики обновления: %6;
|Имя файла обновления (cfu): %7.'"),
ТекОбновление.URLФайлаОбновления,
ТекОбновление.РазмерФайла,
ТекОбновление.ФорматФайлаОбновления,
ТекОбновление.КонтрольнаяСумма,
ТекОбновление.КаталогДистрибутива,
ТекОбновление.ПрименитьОбработчикиОбновления,
ТекОбновление.ОтносительныйПутьCFUФайла));
Контекст.ТекущееДействие =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Получение файла %1 из %2'"),
Строка(ПолученоФайлов + 1),
Контекст.КоличествоФайлов);
Контекст.Прогресс = 75 * (ОбъемПолученныхФайлов / Контекст.ОбъемФайлов);
СообщитьСостояние("ПолучениеФайлов", , Контекст);
Если Не ПолучениеОбновленийПрограммыКлиентСервер.ОбновлениеКонфигурацииПолучено(ТекОбновление, Контекст) Тогда
ЗагрузитьОбновлениеКонфигурации(ТекОбновление, Контекст, Параметры, ДанныеАутентификации);
Если Не ПустаяСтрока(Контекст.ИмяОшибки) Тогда
СообщитьСостояние("Ошибка", , Контекст);
Возврат;
КонецЕсли;
Иначе
ЗаписатьИнформациюВЖурналРегистрации(
НСтр("ru = 'Обновление конфигурации уже было получено ранее.'"));
КонецЕсли;
ПолученоФайлов = ПолученоФайлов + 1;
ОбъемПолученныхФайлов = ОбъемПолученныхФайлов + ТекОбновление.РазмерФайла;
КонецЦикла;
// 3) Получение файлов исправлений.
Для Каждого ТекИсправление Из Контекст.Исправления Цикл
ЗаписатьИнформациюВЖурналРегистрации(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Получение файла исправления (патча).
|URL: %1;
|Идентификатор: %2;
|Размер: %3;
|Локальный файл: %4.'"),
ТекИсправление.URLФайла,
ТекИсправление.Идентификатор,
ТекИсправление.Размер,
ТекИсправление.ИмяПолученногоФайла));
Контекст.ТекущееДействие =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Получение файла %1 из %2'"),
Строка(ПолученоФайлов + 1),
Контекст.КоличествоФайлов);
Контекст.Прогресс = 75 * (ОбъемПолученныхФайлов / Контекст.ОбъемФайлов);
СообщитьСостояние("ПолучениеФайлов", , Контекст);
Если Не ТекИсправление.Получено Тогда
РезультатПолучения = ЗагрузитьФайлИсправления(ТекИсправление.URLФайла, ТекИсправление.Идентификатор, ДанныеАутентификации);
Если РезультатПолучения.Ошибка Тогда
СообщениеЖурнала =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка при получении файла исправления (патча) (%1). %2'"),
ТекИсправление.URLФайла,
РезультатПолучения.ПодробноеОписаниеОшибки);
ЗаписатьОшибкуВЖурналРегистрации(СообщениеЖурнала);
Контекст.ИмяОшибки = "PatchFileDownloadError";
Контекст.ИнформацияОбОшибке = СообщениеЖурнала;
Контекст.Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка при получении файла исправления (патча). %1'"),
РезультатПолучения.КраткоеОписаниеОшибки);
СообщитьСостояние("Ошибка", , Контекст);
Возврат;
Иначе
Попытка
РезультатПолучения.Содержимое.Записать(ТекИсправление.ИмяПолученногоФайла);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
СообщениеЖурнала =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка при получении файла исправления (патча) (%1).
|Не удалось сохранить файл в локальном каталоге.
|%2'"),
ТекИсправление.URLФайла,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
ЗаписатьОшибкуВЖурналРегистрации(СообщениеЖурнала);
Контекст.ИмяОшибки = "FileSystemError";
Контекст.ИнформацияОбОшибке = СообщениеЖурнала;
Контекст.Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка при получении файла исправления (патча). %1'"),
КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
СообщитьСостояние("Ошибка", , Контекст);
Возврат;
КонецПопытки;
ТекИсправление.Получено = Истина;
ЗаписатьИнформациюВЖурналРегистрации(НСтр("ru = 'Файл исправления (патча) успешно получен.'"));
КонецЕсли;
Иначе
ЗаписатьИнформациюВЖурналРегистрации(
НСтр("ru = 'Исправление (патч) уже было получено ранее.'"));
КонецЕсли;
ПолученоФайлов = ПолученоФайлов + 1;
ОбъемПолученныхФайлов = ОбъемПолученныхФайлов + ТекИсправление.Размер;
КонецЦикла;
Контекст.ФайлыОбновленияПолучены = Истина;
// 4) Установка/удаление исправлений.
Если Контекст.ОбновленияКонфигурации.Количество() = 0
И (Контекст.Исправления.Количество() > 0
Или Контекст.ОтозванныеИсправления.Количество() > 0) Тогда
// Установить/удалить исправления сразу, если
// исправления для текущей версии конфигурации.
Контекст.Прогресс = 80;
Контекст.ТекущееДействие = НСтр("ru = 'Установка исправлений (патчей)'");
СообщитьСостояние("УстановкаИсправлений", , Контекст);
РезультатУстановки = УстановкаИУдалениеИсправлений(Контекст.Исправления, Контекст.ОтозванныеИсправления, , Истина);
Если РезультатУстановки.Ошибка Тогда
Контекст.Вставить("ИмяОшибки", "ОшибкаУстановкиИсправлений");
Контекст.Вставить("Сообщение", РезультатУстановки.Сообщение);
СообщитьСостояние("Ошибка", , Контекст, РезультатУстановки.ИнформацияОбОшибке);
Возврат;
КонецЕсли;
КонецЕсли;
// 5) Установка платформы.
Если Контекст.ОбновитьПлатформу И Не Контекст.ОбновлениеПлатформыУстановлено Тогда
Контекст.Прогресс = 85;
Контекст.ТекущееДействие = НСтр("ru = 'Установка платформы 1С:Предприятие'");
СообщитьСостояние("УстановкаПлатформы", , Контекст);
УстановкаОтменена = Ложь;
УстановитьОбновлениеПлатформы(Контекст, Параметры, УстановкаОтменена);
Если УстановкаОтменена Тогда
СообщитьСостояние("УстановкаПлатформыОтменена", , Контекст);
Возврат;
ИначеЕсли Не ПустаяСтрока(Контекст.ИмяОшибки) Тогда
// Ошибка установки платформы.
СообщитьСостояние("Ошибка", , Контекст);
Возврат;
Иначе
Контекст.ОбновлениеПлатформыУстановлено = Истина;
КонецЕсли;
КонецЕсли;
Контекст.Прогресс = 100;
Контекст.Завершено = Истина;
СообщитьСостояние("Завершено", , Контекст);
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ПроверитьНаличиеОбновленияВФоновомРежиме (БСП)
НачатьПроверкуНаличияОбновления (БСП)
ИнтерактивноеОбновлениеКлассификаторовИзСервиса (БСП)
ИнтерактивноеОбновлениеКлассификаторовИзФайла (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)