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