СоставитьПланОтложенногоОбновления (БСП)

Автор: 1С
ОбщийМодуль.ОбновлениеИнформационнойБазыСлужебный
1С БСП

Составить план отложенного обновления.

Процедура СоставитьПланОтложенногоОбновления(СведенияОбОбновленииИБ, ПовторноеФормирование = Ложь) Экспорт
	
	ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
	ЭтоПодчиненныйУзелРИБСФильтром = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБСФильтром();
	
	ДеревоОбработчиков = СведенияОбОбновленииИБ.ДеревоОбработчиков;
	ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем();
	
	// Инициализация параметров.
	ПланОбновления = Новый Массив;
	ЕстьОбработчикиТолькоГлавногоУзла = Ложь;
	
	СведенияОБлокируемыхОбъектах = НовыеСведенияОБлокируемыхОбъектах();
	Для Каждого Подсистема Из ОписанияПодсистем.Порядок Цикл
		
		ОписаниеПодсистемы = ОписанияПодсистем.ПоИменам[Подсистема];
		РежимВыполнения    = ОписаниеПодсистемы.РежимВыполненияОтложенныхОбработчиков;
		ПараллельноСВерсии = ОписаниеПодсистемы.ПараллельноеОтложенноеОбновлениеСВерсии;
		
		ДеревоОбработчиковБиблиотека = ДеревоОбработчиков.Строки.Найти(Подсистема, "ИмяБиблиотеки");
		Если ДеревоОбработчиковБиблиотека = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		ТаблицаОбработчиков = Новый ТаблицаЗначений;
		ТаблицаОбработчиков.Колонки.Добавить("Обработчик", Новый ОписаниеТипов("Строка"));
		ТаблицаОбработчиков.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор"));
		ТаблицаОбработчиков.Колонки.Добавить("Очередь", Новый ОписаниеТипов("Число"));
		
		Итерация = 1;
		СоздаватьНовуюИтерацию = Истина;
		ПропуститьПроверку     = Ложь;
		Для Каждого ДеревоОбработчиковВерсия Из ДеревоОбработчиковБиблиотека.Строки Цикл
			Если Не ПовторноеФормирование Тогда
				ЗаполнитьБлокируемыеОбъекты(ДеревоОбработчиковВерсия, СведенияОбОбновленииИБ, СведенияОБлокируемыхОбъектах);
			КонецЕсли;
			
			Если СоздаватьНовуюИтерацию Тогда
				ИтерацияОбновления = Новый Структура;
				ИтерацияОбновления.Вставить("Режим", "");
				ИтерацияОбновления.Вставить("ЗависитОтПредыдущего", Ложь);
				ИтерацияОбновления.Вставить("Обработчики");
			КонецЕсли;
			
			Если РежимВыполнения = "Последовательно" Тогда
				ИтерацияОбновления.Режим = РежимВыполнения;
				ИтерацияОбновления.ЗависитОтПредыдущего = ?(Итерация = 1, Ложь, Истина);
				ИтерацияОбновления.Обработчики = Новый Массив;
			ИначеЕсли РежимВыполнения = "Параллельно" И Не ЗначениеЗаполнено(ПараллельноСВерсии) И Итерация = 1 Тогда
				ИтерацияОбновления.Режим = РежимВыполнения;
				ИтерацияОбновления.Обработчики = ТаблицаОбработчиков.Скопировать();
				СоздаватьНовуюИтерацию = Ложь;
			ИначеЕсли РежимВыполнения = "Параллельно" И ЗначениеЗаполнено(ПараллельноСВерсии) И Не ПропуститьПроверку Тогда
				НомерВерсии = ДеревоОбработчиковВерсия.НомерВерсии;
				Если НомерВерсии = "*" Тогда
					Результат = -1;
				Иначе
					Результат = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(НомерВерсии, ПараллельноСВерсии);
				КонецЕсли;
				
				Если Результат < 0 Тогда
					ИтерацияОбновления.Режим = "Последовательно";
					ИтерацияОбновления.ЗависитОтПредыдущего = (Итерация <> 1);
					ИтерацияОбновления.Обработчики = Новый Массив;
				Иначе
					ИтерацияОбновления.Режим = РежимВыполнения;
					ИтерацияОбновления.ЗависитОтПредыдущего = (Итерация <> 1);
					ИтерацияОбновления.Обработчики = ТаблицаОбработчиков.Скопировать();
					ПропуститьПроверку = Истина;
					СоздаватьНовуюИтерацию = Ложь;
				КонецЕсли;
			КонецЕсли;
			
			Для Каждого Обработчик Из ДеревоОбработчиковВерсия.Строки Цикл
				Если ПовторноеФормирование И Обработчик.Статус = "Выполнено" Тогда
					Продолжить;
				КонецЕсли;
				
				Если ИтерацияОбновления.Режим = "Параллельно" И Не ЭтоПодчиненныйУзелРИБ
					И Обработчик.ЗапускатьТолькоВГлавномУзле = Истина Тогда
					ЕстьОбработчикиТолькоГлавногоУзла = Истина;
				КонецЕсли;
				
				Если ИтерацияОбновления.Режим = "Параллельно" И ЭтоПодчиненныйУзелРИБСФильтром
					И Не Обработчик.ЗапускатьИВПодчиненномУзлеРИБСФильтрами Тогда
					ЕстьОбработчикиТолькоГлавногоУзла = Истина;
					Продолжить;
				КонецЕсли;
				
				Если ИтерацияОбновления.Режим = "Параллельно" Тогда
					СтрокаОбработчик = ИтерацияОбновления.Обработчики.Добавить();
					СтрокаОбработчик.Обработчик    = Обработчик.ИмяОбработчика;
					СтрокаОбработчик.Идентификатор = Обработчик.Идентификатор;
					СтрокаОбработчик.Очередь       = Обработчик.ОчередьОтложеннойОбработки;
				Иначе
					ОписаниеОбработчика = Новый Структура;
					ОписаниеОбработчика.Вставить("ИмяОбработчика", Обработчик.ИмяОбработчика);
					ОписаниеОбработчика.Вставить("Идентификатор", Обработчик.Идентификатор);
					ОписаниеОбработчика.Вставить("Итерация", 0);
					
					ИтерацияОбновления.Обработчики.Добавить(ОписаниеОбработчика);
				КонецЕсли;
				
			КонецЦикла;
			
			// В параллельном режиме в РИБ с фильтрами в подчиненном узле выполняются только обработчики
			// с признаком ЗапускатьИВПодчиненномУзлеРИБСФильтрами = Истина.
			Если ЭтоПодчиненныйУзелРИБСФильтром И ИтерацияОбновления.Режим = "Параллельно" Тогда
				ПараметрыОтбора = Новый Структура;
				ПараметрыОтбора.Вставить("ЗапускатьИВПодчиненномУзлеРИБСФильтрами", Ложь);
				ОбработчикиТолькоГлавногоУзла = ДеревоОбработчиковВерсия.Строки.НайтиСтроки(ПараметрыОтбора);
				Для Каждого ОбработчикГлавногоУзла Из ОбработчикиТолькоГлавногоУзла Цикл
					ДеревоОбработчиковВерсия.Строки.Удалить(ОбработчикГлавногоУзла);
				КонецЦикла;
			КонецЕсли;
			
			Если СоздаватьНовуюИтерацию Тогда
				ПланОбновления.Добавить(ИтерацияОбновления);
			КонецЕсли;
			
			Итерация = Итерация + 1 ;
			
		КонецЦикла;
		
		Если Не СоздаватьНовуюИтерацию Тогда
			ПланОбновления.Добавить(ИтерацияОбновления);
		КонецЕсли;
	КонецЦикла;
	
	Если Не ПовторноеФормирование Тогда
		ЗаписатьСведенияОБлокируемыхОбъектах(СведенияОБлокируемыхОбъектах);
		Константы.ОтложенноеОбновлениеВГлавномУзлеЗавершеноУспешно.Установить(Не ЕстьОбработчикиТолькоГлавногоУзла);
	КонецЕсли;
	
	ОписаниеОбработчика = Новый Структура;
	ОписаниеОбработчика.Вставить("ИмяОбработчика", "");
	ОписаниеОбработчика.Вставить("Итерация", 0);
	
	// Конвертация формата хранения обработчиков.
	Для Каждого ЦиклОбновления Из ПланОбновления Цикл
		Если ТипЗнч(ЦиклОбновления.Обработчики) = Тип("Массив") Тогда
			Продолжить;
		КонецЕсли;
		ТаблицаОбработчиков = ЦиклОбновления.Обработчики.Скопировать();
		ТаблицаОбработчиков.Сортировать("Очередь Возр");
		
		ЦиклОбновления.Обработчики = Новый Массив;
		Для Каждого Элемент Из ТаблицаОбработчиков Цикл
			ОписаниеОбработчика = Новый Структура;
			ОписаниеОбработчика.Вставить("ИмяОбработчика", Элемент.Обработчик);
			ОписаниеОбработчика.Вставить("Идентификатор", Элемент.Идентификатор);
			ОписаниеОбработчика.Вставить("Итерация", 0);
			
			ЦиклОбновления.Обработчики.Добавить(ОписаниеОбработчика);
		КонецЦикла;
		
		ЦиклОбновления.Вставить("ОчередьОбработчиков", ТаблицаОбработчиков);
	КонецЦикла;
	
	СведенияОбОбновленииИБ.ПланОтложенногоОбновления = ПланОбновления;
	
КонецПроцедуры

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

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

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

ОтметитьРегистрациюОтложенныхОбработчиковОбновления (БСП)

ПеререгистрироватьДанныеДляОтложенногоОбновления (БСП)

СтатусОтложенногоОбновления (БСП)

ПриВключенииОтложенногоОбновления (БСП)

ПроверитьСтатусОтложенногоОбновления (БСП)

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

ВыполнитьОтложенноеОбновлениеСейчас (БСП)

ПараметрыОтложенногоОбработчикаОбновления (БСП)

ЗаписатьПараметрыОтложенногоОбработчикаОбновления (БСП)

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