Процедура одноименного регламентного задания.
// Процедура одноименного регламентного задания. // Находит все области данных со статусами, требующими обработки // прикладным приложением, и при необходимости планирует запуск ФЗ // по их обслуживанию. // Процедура ОбслуживаниеОбластейДанных() Экспорт Если НЕ РазделениеВключено() Тогда Возврат; КонецЕсли; ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОбслуживаниеОбластейДанных); МаксимальноеКоличествоПовторов = 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 ///////////////////////////////////////////////////////////////////////////////////////////////////////
// Процедура одноименного регламентного задания.
// Находит все области данных со статусами, требующими обработки
// прикладным приложением, и при необходимости планирует запуск ФЗ
// по их обслуживанию.
//
Процедура ОбслуживаниеОбластейДанных() Экспорт
Если НЕ РазделениеВключено() Тогда
Возврат;
КонецЕсли;
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОбслуживаниеОбластейДанных);
МаксимальноеКоличествоПовторов = 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
///////////////////////////////////////////////////////////////////////////////////////////////////////