Files
2019-04-26 01:06:00 +03:00

251 lines
17 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
////////////////////////////////////////////////////////////////////////////////
// Извлечение текста
// Добавляет и удаляет записи в регистр сведений ОчередьИзвлеченияТекста при изменении
// состояние извлечения текста версий файлов.
//
// Параметры:
// ИсточникТекста - СправочникСсылка.ВерсииФайлов, СправочникСсылка.*ПрисоединенныеФайлы,
// файл, у которого изменилось состояние извлечения текста.
// СостояниеИзвлеченияТекста - ПеречислениеСсылка.СтатусыИзвлеченияТекстаФайлов, новый
// статус извлечения текста у файла.
//
Процедура ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста) Экспорт
УстановитьПривилегированныйРежим(Истина);
НаборЗаписей = РегистрыСведений.ОчередьИзвлеченияТекста.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ОбластьДанныхВспомогательныеДанные.Установить(РаботаВМоделиСервиса.ЗначениеРазделителяСеанса());
НаборЗаписей.Отбор.ИсточникТекста.Установить(ИсточникТекста);
Если СостояниеИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен
ИЛИ СостояниеИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.ПустаяСсылка() Тогда
Запись = НаборЗаписей.Добавить();
Запись.ОбластьДанныхВспомогательныеДанные = РаботаВМоделиСервиса.ЗначениеРазделителяСеанса();
Запись.ИсточникТекста = ИсточникТекста.Ссылка;
КонецЕсли;
НаборЗаписей.Записать();
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.
// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков.
Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
СоответствиеИменПсевдонимам.Вставить("РаботаСФайламиСлужебный.ИзвлечьТекстИзФайлов");
СоответствиеИменПсевдонимам.Вставить("РаботаСФайламиСлужебный.ОчиститьНенужныеФайлы");
СоответствиеИменПсевдонимам.Вставить("РаботаСФайламиСлужебный.РегламентнаяСинхронизацияФайловWebdav");
КонецЕсли;
КонецПроцедуры
// См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий.
Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт
НоваяСтрока = ТаблицаИспользования.Добавить();
НоваяСтрока.РегламентноеЗадание = "ПланированиеИзвлеченияТекстаВМоделиСервиса";
НоваяСтрока.Использование = ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск");
КонецПроцедуры
// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.
Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт
ШаблоныЗаданий.Добавить("ОчисткаНенужныхФайлов");
ШаблоныЗаданий.Добавить("СинхронизацияФайлов");
КонецПроцедуры
// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.
Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт
Типы.Добавить(Метаданные.РегистрыСведений.ОчередьИзвлеченияТекста);
КонецПроцедуры
// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "2.1.2.4";
Обработчик.Процедура = "ФайловыеФункцииСлужебныйВМоделиСервиса.ЗаполнитьОчередьИзвлеченияТекста";
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "2.1.3.19";
Обработчик.Процедура = "ФайловыеФункцииСлужебныйВМоделиСервиса.ПеренестиОчередьИзвлеченияТекстаВоВспомогательныеДанные";
Обработчик.ОбщиеДанные = Истина;
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "2.4.3.89";
Обработчик.ОбщиеДанные = Истина;
Обработчик.Процедура = "ФайловыеФункцииСлужебныйВМоделиСервиса.ОчиститьРегистрСведенийУдалитьОчередьИзвлеченияТекста";
Обработчик.РежимВыполнения = "Оперативно";
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
////////////////////////////////////////////////////////////////////////////////
// Извлечение текста
// Определяет перечень областей данных, в которых требуется извлечение текста и планирует
// для них его выполнение с использованием очереди заданий.
//
Процедура ОбработатьОчередьИзвлеченияТекста() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ПланированиеИзвлеченияТекстаВМоделиСервиса);
Если НЕ РаботаВМоделиСервиса.РазделениеВключено()
Или Не ОбщегоНазначения.ЭтоWindowsСервер() Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ИмяРазделенногоМетода = "РаботаСФайламиСлужебный.ИзвлечьТекстИзФайлов";
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных,
| ВЫБОР
| КОГДА ЧасовыеПояса.Значение = """"
| ТОГДА НЕОПРЕДЕЛЕНО
| ИНАЧЕ ЕСТЬNULL(ЧасовыеПояса.Значение, НЕОПРЕДЕЛЕНО)
| КОНЕЦ КАК ЧасовойПояс
|ИЗ
| РегистрСведений.ОчередьИзвлеченияТекста КАК ОчередьИзвлеченияТекста
| ЛЕВОЕ СОЕДИНЕНИЕ Константа.ЧасовойПоясОбластиДанных КАК ЧасовыеПояса
| ПО ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные = ЧасовыеПояса.ОбластьДанныхВспомогательныеДанные
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОбластиДанных КАК ОбластиДанных
| ПО ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные = ОбластиДанных.ОбластьДанныхВспомогательныеДанные
|ГДЕ
| НЕ ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные В (&ОбрабатываемыеОбластиДанных)
| И ОбластиДанных.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыОбластейДанных.Используется)";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ОбрабатываемыеОбластиДанных", ОчередьЗаданий.ПолучитьЗадания(
Новый Структура("ИмяМетода", ИмяРазделенногоМетода)));
Выборка = РаботаВМоделиСервиса.ВыполнитьЗапросВнеТранзакции(Запрос).Выбрать();
Пока Выборка.Следующий() Цикл
// Проверка блокировки области.
Если РаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда
// Область заблокирована, перейти к следующей записи.
Продолжить;
КонецЕсли;
НовоеЗадание = Новый Структура();
НовоеЗадание.Вставить("ОбластьДанных", Выборка.ОбластьДанных);
НовоеЗадание.Вставить("ЗапланированныйМоментЗапуска", МестноеВремя(ТекущаяУниверсальнаяДата(), Выборка.ЧасовойПояс));
НовоеЗадание.Вставить("ИмяМетода", ИмяРазделенногоМетода);
ОчередьЗаданий.ДобавитьЗадание(НовоеЗадание);
КонецЦикла;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы.
// Заполняет очередь извлечения текста для текущей области данных. Используется для начального заполнения при
// обновлении.
Процедура ЗаполнитьОчередьИзвлеченияТекста() Экспорт
Если Не РаботаВМоделиСервисаПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = РаботаСФайламиСлужебный.ТекстЗапросаДляИзвлеченияТекста(Истина);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбновитьСостояниеОчередиИзвлеченияТекста(Выборка.Ссылка,
Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен);
КонецЦикла;
КонецПроцедуры
// Переносит флаг необходимости выполнения извлечения текста в областях
// данных из РС УдалитьОчередьИзвлеченияТекста в РС ОчередьИзвлеченияТекста.
//
Процедура ПеренестиОчередьИзвлеченияТекстаВоВспомогательныеДанные() Экспорт
Если Не РаботаВМоделиСервиса.РазделениеВключено() Тогда
Возврат;
КонецЕсли;
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных();
Блокировка.Добавить("РегистрСведений.ОчередьИзвлеченияТекста");
Блокировка.Заблокировать();
ТекстЗапроса =
"ВЫБРАТЬ
| ЕСТЬNULL(ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные, УдалитьОчередьИзвлеченияТекста.ОбластьДанных) КАК ОбластьДанныхВспомогательныеДанные,
| ЕСТЬNULL(ОчередьИзвлеченияТекста.ИсточникТекста, УдалитьОчередьИзвлеченияТекста.ИсточникТекста) КАК ИсточникТекста
|ИЗ
| РегистрСведений.УдалитьОчередьИзвлеченияТекста КАК УдалитьОчередьИзвлеченияТекста
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОчередьИзвлеченияТекста КАК ОчередьИзвлеченияТекста
| ПО УдалитьОчередьИзвлеченияТекста.ОбластьДанных = ОчередьИзвлеченияТекста.ОбластьДанныхВспомогательныеДанные
| И УдалитьОчередьИзвлеченияТекста.ИсточникТекста = ОчередьИзвлеченияТекста.ИсточникТекста";
Запрос = Новый Запрос(ТекстЗапроса);
Набор = РегистрыСведений.ОчередьИзвлеченияТекста.СоздатьНаборЗаписей();
Набор.Загрузить(Запрос.Выполнить().Выгрузить());
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
// Удаляет записи из регистра сведений УдалитьОчередьИзвлеченияТекста, если они там есть.
//
Процедура ОчиститьРегистрСведенийУдалитьОчередьИзвлеченияТекста() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| УдалитьОчередьИзвлеченияТекста.ОбластьДанных
|ИЗ
| РегистрСведений.УдалитьОчередьИзвлеченияТекста КАК УдалитьОчередьИзвлеченияТекста";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НаборЗаписей = РегистрыСведений.УдалитьОчередьИзвлеченияТекста.СоздатьНаборЗаписей();
ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей);
КонецЦикла;
КонецПроцедуры
#КонецОбласти