ОбслуживаниеОбластейДанных

Автор: 1С
ОбщийМодуль.РаботаВМоделиСервиса
БСП

Процедура одноименного регламентного задания.

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

			ПараметрыМетода = Новый Массив;
			ПараметрыМетода.Добавить(Выборка.ОбластьДанных);
			
			Если Выборка.Статус = Перечисления.СтатусыОбластейДанных.Новая Тогда
				
				ПараметрыМетода.Добавить(Выборка.ИдентификаторВыгрузки);
				Если ЗначениеЗаполнено(Выборка.Вариант) Тогда
					ПараметрыМетода.Добавить(Выборка.Вариант);
				КонецЕсли;
			КонецЕсли;
			
			ПараметрыЗадания = Новый Структура;
			ПараметрыЗадания.Вставить("ИмяМетода"    , ИмяМетода);
			ПараметрыЗадания.Вставить("Параметры"    , ПараметрыМетода);
			ПараметрыЗадания.Вставить("Ключ"         , "1");
			ПараметрыЗадания.Вставить("ОбластьДанных", Выборка.ОбластьДанных);
			ПараметрыЗадания.Вставить("ЭксклюзивноеВыполнение", Истина);
			
			ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания);
			
			РазблокироватьДанныеДляРедактирования(Ключ);
		Иначе
			
			СменитьСтатусОбластиИУведомитьМенеджер(Менеджер, ?(Менеджер.Статус = Перечисления.СтатусыОбластейДанных.Новая,
				"ФатальнаяОшибка", "ОшибкаУдаления"), НСтр("ru = 'Исчерпано количество попыток обработки области'"));
			
			РазблокироватьДанныеДляРедактирования(Ключ);
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

КлючОбластиДанных (БСП)

ПрикрепитьОбластьДанных (БСП)

ОбработатьПолученныеДанныеОбласти (БСП)

СтатусОбластиДанных (БСП)