ОбновитьВнешниеКомпоненты (БСП)

Автор: 1С
ОбщийМодуль.ВнешниеКомпонентыСервер
БСП

Обновить внешние компоненты. Выполняет обновление внешних компонент.

// Выполняет обновление внешних компонент.
//
// Параметры:
//  ДанныеВнешнихКомпонент - ТаблицаЗначений - таблица обновляемых компонент.
//    ** Идентификатор - Строка - идентификатор.
//    ** Версия - Строка - версия.
//    ** ДатаВерсии - Строка - дата версии.
//    ** Наименование - Строка - наименование.
//    ** ИмяФайла - Строка - имя файла.
//    ** АдресФайла - Строка - адрес файла.
//    ** КодОшибки - Строка - код ошибки.
//  АдресРезультата - Строка - (необязательный) адрес временного хранилища.
//      Если указан, в него будет помещено описание результата операции.
//
Процедура ОбновитьВнешниеКомпоненты(ДанныеВнешнихКомпонент, АдресРезультата = Неопределено) Экспорт
	
	Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеВнешнихКомпонент") Тогда
	
		Результат = "";
		
		Запрос = Новый Запрос;
		Запрос.Текст =
			"ВЫБРАТЬ
			|	ВнешниеКомпоненты.Ссылка КАК Ссылка,
			|	ВнешниеКомпоненты.Идентификатор КАК Идентификатор
			|ИЗ
			|	Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты
			|ГДЕ
			|	ВнешниеКомпоненты.Идентификатор В(&Идентификаторы)";
		
		Запрос.УстановитьПараметр("Идентификаторы", ДанныеВнешнихКомпонент.ВыгрузитьКолонку("Идентификатор"));
		
		РезультатЗапроса = Запрос.Выполнить();
		Выборка = РезультатЗапроса.Выбрать();
		
		// Обход результата запроса.
		Для каждого СтрокаРезультата Из ДанныеВнешнихКомпонент Цикл
			
			ПредставлениеКомпоненты = ВнешниеКомпонентыСлужебный.ПредставлениеКомпоненты(
				СтрокаРезультата.Идентификатор, 
				СтрокаРезультата.Версия);
			
			КодОшибки = СтрокаРезультата.КодОшибки;
			
			Если ЗначениеЗаполнено(КодОшибки) Тогда
				
				Если КодОшибки = "АктуальнаяВерсия" Тогда
					Результат = Результат + ПредставлениеКомпоненты + " - " + НСтр("ru = 'Актуальная версия.'") + Символы.ПС;
					Продолжить;
				КонецЕсли;
				
				ИнформацияОбОшибке = "";
				Если КодОшибки = "ОтсутствуетКомпонента" Тогда 
					ИнформацияОбОшибке = НСтр("ru = 'В сервисе внешних компонент не обнаружена внешняя компонента'");
				ИначеЕсли КодОшибки = "ФайлНеЗагружен" Тогда 
					ИнформацияОбОшибке = НСтр("ru = 'При попытке загрузить файл внешней компоненты из сервиса, возникла ошибка'");
				КонецЕсли;
				
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'При загрузке внешней компоненты %1 возникала ошибка:
					           |%2'"),
					ПредставлениеКомпоненты,
					ИнформацияОбОшибке);
				
				Результат = Результат + ПредставлениеКомпоненты + " - " + ИнформацияОбОшибке + Символы.ПС;
				
				ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'",
					ОбщегоНазначения.КодОсновногоЯзыка()),
					УровеньЖурналаРегистрации.Ошибка,,,
					ТекстОшибки);
				
				Продолжить;
			КонецЕсли;
			
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(СтрокаРезультата.АдресФайла);
			Информация = ВнешниеКомпонентыСлужебный.ИнформацияОКомпонентеИзФайла(ДвоичныеДанные, Ложь);
			
			Если Не Информация.Разобрано Тогда 
				
				Результат = Результат + ПредставлениеКомпоненты + " - " + Информация.ОписаниеОшибки + Символы.ПС;
				
				ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'",
					ОбщегоНазначения.КодОсновногоЯзыка()),
					УровеньЖурналаРегистрации.Ошибка,,, Информация.ОписаниеОшибки);
					
				Продолжить;
			КонецЕсли;
			
			// Поиск ссылки.
			Отбор = Новый Структура("Идентификатор", СтрокаРезультата.Идентификатор);
			Если Выборка.НайтиСледующий(Отбор) Тогда 
				
				Объект = Выборка.Ссылка.ПолучитьОбъект();
				
				// Когда уже загружена компонента по дате более свежая, чем на Портале 1С:ИТС, обновление не следует выполнять.
				Если Объект.ДатаВерсии > СтрокаРезультата.ДатаВерсии Тогда 
					Продолжить;
				КонецЕсли;
				
				ЗаполнитьЗначенияСвойств(Объект, Информация.Реквизиты); // По данным манифеста.
				ЗаполнитьЗначенияСвойств(Объект, СтрокаРезультата);     // По данным с сайта.
				
				Объект.ДополнительныеСвойства.Вставить("ДвоичныеДанныеКомпоненты", Информация.ДвоичныеДанные);
				
				Объект.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Загружена с Портала 1С:ИТС. %1.'"),
					ТекущаяДатаСеанса());
				
				Попытка
					Объект.Записать();
					Результат = Результат 
						+ ПредставлениеКомпоненты + " - " + НСтр("ru = 'Успешно обновлена.'") + Символы.ПС;
				Исключение
					Результат = Результат 
						+ ПредставлениеКомпоненты + " - " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС;
					ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'",
							ОбщегоНазначения.КодОсновногоЯзыка()),
						УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
				КонецПопытки;
				
			КонецЕсли;
			
		КонецЦикла;
		
		Если ЗначениеЗаполнено(АдресРезультата) Тогда 
			ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
		КонецЕсли;
		
	Иначе
		ВызватьИсключение 
			НСтр("ru = 'Ожидается существование подсистемы ""ИнтернетПоддержкаПользователей.ПолучениеВнешнихКомпонент""'");
	КонецЕсли;
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

ОбновитьОбщуюКомпоненту (БСП)

ОбновитьНастройкиПолучениеВнешнихКомпонент (БСП)

ОбновитьКомпонентыСПортала (БСП)

ОбновитьКомпонентыСПорталаПриФормированииРезультата (БСП)

ИнформацияОКомпоненте (БСП)

СвойстваВнешнейКомпоненты (БСП)

АктуальныеВерсииВнешнихКомпонент (БСП)

ВерсииВнешнихКомпонент (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз