Задание загрузка. Регламентное задание МиграцияПриложенийЗагрузка.
// Регламентное задание МиграцияПриложенийЗагрузка.
//
Процедура ЗаданиеЗагрузка() Экспорт
// Вызов ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания() не требуется,
// т.к. это регламентное задание может быть только в новой области, в которой не выполнено обновление.
УстановитьПривилегированныйРежим(Истина);
ПроверитьИспользованиеРазделениеСеанса();
СостояниеЗагрузки = РегистрыСведений.МиграцияПриложенийСостояниеЗагрузки.СоздатьМенеджерЗаписи();
СостояниеЗагрузки.Прочитать();
Если Не СостояниеЗагрузки.Выбран() Тогда
Комментарий = НСтр("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
///////////////////////////////////////////////////////////////////////////////////////////////////////
ФоновоеЗаданиеЗагрузкиКлассификатораАдресов (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)