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