ЗагрузитьИУстановитьОбновленияВФоновомРежиме (БСП)

Автор: 1С
ОбщийМодуль.ПолучениеОбновленийПрограммы
БСП

Загрузить установить обновления фоновом режиме. Получение и установка обновлений в файловом варианте.

////////////////////////////////////////////////////////////////////////////////
// Получение и установка обновлений в файловом варианте.
// Выполняется в фоновом задании.

Процедура ЗагрузитьИУстановитьОбновленияВФоновомРежиме(Параметры, АдресРезультата) Экспорт
	
	Если Не ДоступноИспользованиеОбновленияПрограммы(Истина, Ложь) Тогда
		ВызватьИсключение НСтр("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
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ПроверитьНаличиеОбновленияВФоновомРежиме (БСП)

НачатьПроверкуНаличияОбновления (БСП)

ИнтерактивноеОбновлениеКлассификаторовИзСервиса (БСП)

ИнтерактивноеОбновлениеКлассификаторовИзФайла (БСП)

ПриОпределенииРежимаОбновленияДанных (БСП)

ОбновитьПрограмму (БСП)

ЗапуститьОбновлениеДоступаНаУровнеЗаписей (БСП)

TurboConf ИР адаптер 2.63