ЗаданиеЗагрузка (БСП)

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

Задание загрузка. Регламентное задание МиграцияПриложенийЗагрузка.

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

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

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

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

ФоновоеЗаданиеЗагрузкиКлассификатораАдресов (БСП)

ОтменитьЗагрузку (БСП)

ФоновоеЗаданиеЗагрузкиКлассификатораАдресовССайта (БСП)

Загрузка XML в 1С из FTP

ЗаданиеВыгрузка (БСП)

Задание (БСП)

ЗаданиеНеНайдено (БСП)

УдалитьЗадание (БСП)

1С Менеджер конфигураций