Обработать очередь извлечения текста. Определяет перечень областей данных, в которых требуется извлечение текста и планирует
// Определяет перечень областей данных, в которых требуется извлечение текста и планирует
// для них его выполнение с использованием очереди заданий.
//
Процедура ОбработатьОчередьИзвлеченияТекста() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ПланированиеИзвлеченияТекстаВМоделиСервиса);
Если НЕ ОбщегоНазначения.РазделениеВключено()
Или Не ОбщегоНазначения.ЭтоWindowsСервер() Тогда
Возврат;
КонецЕсли;
МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
УстановитьПривилегированныйРежим(Истина);
ИмяРазделенногоМетода = "РаботаСФайламиСлужебный.ИзвлечьТекстИзФайлов";
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных,
| ВЫБОР
| КОГДА ЧасовыеПояса.Значение = """"
| ТОГДА НЕОПРЕДЕЛЕНО
| ИНАЧЕ ЕСТЬNULL(ЧасовыеПояса.Значение, НЕОПРЕДЕЛЕНО)
| КОНЕЦ КАК ЧасовойПояс
|ИЗ
| РегистрСведений.ОчередьИзвлеченияТекста КАК ОчередьИзвлеченияТекста
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ЧасовойПоясОбластиДанных КАК ЧасовыеПояса
| ПО ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные = ЧасовыеПояса.ОбластьДанныхВспомогательныеДанные
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОбластиДанных КАК ОбластиДанных
| ПО ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные = ОбластиДанных.ОбластьДанныхВспомогательныеДанные
|ГДЕ
| НЕ ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные В (&ОбрабатываемыеОбластиДанных)
| И ОбластиДанных.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыОбластейДанных.Используется)";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ОбрабатываемыеОбластиДанных", МодульОчередьЗаданий.ПолучитьЗадания(
Новый Структура("ИмяМетода", ИмяРазделенногоМетода)));
Если ТранзакцияАктивна() Тогда
ВызватьИсключение(НСтр("ru = 'Транзакция активна. Выполнение запроса в транзакции невозможно.'"));
КонецЕсли;
КоличествоПопыток = 0;
Результат = Неопределено;
Пока Истина Цикл
Попытка
Результат = Запрос.Выполнить(); // Чтение вне транзакции, возможно появление ошибки.
// Could not continue scan with NOLOCK due to data movement
// в этом случае нужно повторить попытку чтения.
Прервать;
Исключение
КоличествоПопыток = КоличествоПопыток + 1;
Если КоличествоПопыток = 5 Тогда
ВызватьИсключение;
КонецЕсли;
КонецПопытки;
КонецЦикла;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Проверка блокировки области.
Если МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда
// Область заблокирована, перейти к следующей записи.
Продолжить;
КонецЕсли;
НовоеЗадание = Новый Структура();
НовоеЗадание.Вставить("ОбластьДанных", Выборка.ОбластьДанных);
НовоеЗадание.Вставить("ЗапланированныйМоментЗапуска", МестноеВремя(ТекущаяУниверсальнаяДата(), Выборка.ЧасовойПояс));
НовоеЗадание.Вставить("ИмяМетода", ИмяРазделенногоМетода);
МодульОчередьЗаданий.ДобавитьЗадание(НовоеЗадание);
КонецЦикла;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ЗаполнитьОчередьИзвлеченияТекста (БСП)
ОбновитьСостояниеОчередиИзвлеченияТекста (БСП)
ЗаписатьРезультатИзвлеченияТекста (БСП)
ОбработатьОчередьЗаданий (БСП)