новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Извлечение текста. Пример использования

  • Добавить свою публикацию
  • для этого требуется регистрация

Задача

Необходимо написать небольшую конфигурацию, в которой должен быть функционал по прикреплению документов (doc, xls, txt и т.д.). При этом текст документов в дальнейшем используется в полнотекстовом поиске, с помощью которого пользователи находят необходимые им документы. Чтобы не усложнять пример, прикрепляемые файлы будут храниться непосредственно в реквизите элемента справочника, как и извлеченный текст.

Изображение

Поиск по содержимому документов реализуем с помощью отдельной обработки, где пользователь вводит строку поиска. В результате обработка показывает все документы, в которых содержится набранная строка.

Изображение

Для начала реализуем функционал прикрепления документов и извлечения из них текста.

Прикрепляем, извлекаем

Создадим справочкик "СохраненныеДокументы" с двумя реквизитами:

  1. "ДокументХранилище" - двоичные данные сохраняемого файла документа.
  2. "ИзвлеченныйТекст" - неограниченная строка с извлеченным текстом документа.
При открытии элемента справочника, для удобства отладки, будем отображать извлеченный текст. 
 
Функционал по прикреплению файла реализован в форме элемента справочника. По команде "ПрикрепитьФайл" вызывается диалог выбора файла. Когда файл выбрать, его двоичные данные помещаются в реквизит "ДокументХранилище", а извлеченный текст в реквизит "ИзвлеченныйТекст". Извлечение текста происходит с помощью общего объекта "ИзвлечениеТекста". На следующем листинге показан код описанной команды:
&НаКлиенте
Процедура ПрикрепитьФайл(Команда)  
	// Файл может быть прикреплен только для уже записанного элемента справочника
	Если Параметры.Ключ.Пустая() Тогда
		Сообщить("Сначала нужно записать элемент!");
		Возврат;
	КонецЕсли;
	// Выбираем файл на диске 
	Режим = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	ДиалогОткрытияФайла.ПолноеИмяФайла = "";
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок = "Выберите файл";
	Если ДиалогОткрытияФайла.Выбрать() Тогда
		ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
		// Формируем данные для записи 
		ПараметрыЗаписи = Новый Структура;
		// Двоичные данные файла
		ПараметрыЗаписи.Вставить("Файл", 	Новый ДвоичныеДанные(ПутьКФайлу)); 
		ИзвлеченныйТекст = Новый ИзвлечениеТекста(ПутьКФайлу);
		// Получаем текст документа
		ПараметрыЗаписи.Вставить("Текст", 	ИзвлеченныйТекст.ПолучитьТекст()); 
		// Получаем имя файла без пути
		ПараметрыЗаписи.Вставить("ИмяФайла",СтрЗаменить(ДиалогОткрытияФайла.ПолноеИмяФайла, ДиалогОткрытияФайла.Каталог, ""));
		ЗаписатьДанные(ПараметрыЗаписи);
	Иначе
		Текст = "ru = ""Файл не выбран!""; en = ""File not selected!""";
		Предупреждение(НСтр(Текст));
	КонецЕсли;       	
КонецПроцедуры     
&НаСервере
Процедура ЗаписатьДанные(ПараметрыЗаписи)
	// Конвертируем объект формы в объект справочника
	ОбъектЭлемент = РеквизитФормыВЗначение("Объект");
	// Записываем двоичные данные в хранилище значения
	ОбъектЭлемент.ДокументХранилище = Новый ХранилищеЗначения(ПараметрыЗаписи.Файл);
	// Записываем извлеченный текст
	ОбъектЭлемент.ИзвлеченныйТекст = ПараметрыЗаписи.Текст;
	// Внаименование записываем имя файла
	ОбъектЭлемент.Наименование = ПараметрыЗаписи.ИмяФайла;
	ОбъектЭлемент.Записать();	// Записываем элемент и возвращаем его в объект формы
	ЗначениеВРеквизитФормы(ОбъектЭлемент, "Объект");	
КонецПроцедуры

 У объекта "ИзвлечениеТекста" есть несколько методов:

  1. "ПолучитьТекст" - получает текст из файла, на основе которого создан экземпляр объекта.
  2. "Записать" - записывает полученный текст в файл.
Мы используем первый метод. Извлеченный текст из документа помещаем в строковой реквизит неограниченной длины. В результате в базе данных мы можем осуществлять поиск по содержимому этого реквизита с помощью механизма полнотекстового поиска.
 
В форме элемента справочника также содержится команда "Открыть файл", извлекающая двоичные и записывающие в файл на диске. После команда запускает приложение для открытия файла, установленное поумолчанию в ОС. Листинг программного кода этой команды приведен на следующем листинге:
&НаКлиенте
Процедура ОткрытьФайл(Команда)
	// Получаем путь к временному файлу
	ПутьФайл = ПолучитьИмяВременногоФайла(Объект.Наименование);
	// Извлекаем двоичные данные из элемента справочника
	Данные = ПолучитьДанные();
	// Записываем файл на диск
	Данные.Записать(ПутьФайл);
	// Открываем файл с помощью приложения, назначенного поумолчанию в операционной системе
	ЗапуститьПриложение(ПутьФайл);                                                         	
КонецПроцедуры
&НаСервере
Функция ПолучитьДанные()   	
	ОбъектЭлемент = РеквизитФормыВЗначение("Объект");
	Возврат ОбъектЭлемент.ДокументХранилище.Получить(); 	
КонецФункции

 Перейдем к реализации поиска по содержимому прикрепленных файлов.

Найти!

Подробнее о механизме полнотекстового поиска Вы можете прочитать здесь. Рассматривать тонкости реализации поиска не будем, приведу лишь программный код, выполняющий поиск:

// СтрокаПоиска - строка, которую необходимо найти в содержимом документов
// Второй паарметр - размер одной порции найденных данных
РезультатыПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, 10);

В тестовой конфигурации, ссылка на которую приведена в конце статьи, Вы можете  посмотреть реализацию обработки полнотекстового поиска. 

Заключение

Пример построен не самым оптимальным образом, то принцип работы должен быть понятен. В типовых конфигурациях существует похожий механизм. В той же "Библиотеке стандартных подсистем" извлечение текста из файла позволяет искать прикрепленные файлы по их содержимому.

 

Скачать тестовую конфигурацию с примером из статьи.

 
0
Читайте также
Культура программирования
1С программистам-пишите любые программы корректно (даже мелкие обработки)
Излишняя выгрузка в таблицу значений
Разработка для работы с информацией после выгрузки значений в таблицу
Разработки
Программа для фрилансеров
В программе много отчетов, которые позволяют отслеживать состояние текущих дел
Обработка оборудования для печати чеков. Розница, редакция 1
"Обработка для печати ценников нефискальных"
Выгрузка прайса загрузка заказа
Обработка для выгрузки прайса и создания закада УТ 10.3
Еще от автора
≡ к списку статей