1с текстовый документ найти строку

Обновлено: 02.07.2024

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

Полнотекстовый поиск предоставляет следующие возможности:

  • Есть поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ 7.79-2000). Пример: "русская фраза" = "russkaya fraza".
  • Есть поддержка замещения (написание части символов в русских словах одноклавишными латинскими символами). Пример: "руссrfz фраpf" (окончания каждого слова набраны латиницей, допустим, в результате ошибки оператора).
  • Есть возможность нечеткого поиска (буквы в найденных словах могут отличаться) с указанием порога нечеткости. Пример: указав в строке поиска слово "привет" и нечеткость 17 %, найдем все аналогичные слова с ошибками и без: "привет", "превет", "привед".
  • Есть возможность указать область выполнения поиска по выбранным объектам метаданных.
  • Полнотекстовое индексирование названий стандартных полей ("Код", "Наименование" и т. д.) производится на всех языках конфигурации.
  • Поиск выполняется с учетом синонимов русского, английского и украинского языков.
  • Морфологический словарь русского языка содержит ряд специфических слов, относящихся к областям деятельности, автоматизируемым с помощью системы программ "1С:Предприятие".
  • Стандартно в состав поставляемых словарей включены словарные базы и словари тезауруса и синонимов русского, украинского и английского языков, которые предоставлены компанией "Информатик".
  • Поиск можно осуществлять с использованием подстановочных символов ("*"), а также с указанием поисковых операторов ("И", "ИЛИ", "НЕ", "РЯДОМ") и спецсимволов.

Полнотекстовый поиск можно осуществлять в любой конфигурации на платформе 1С:Предприятие 8

Для того чтобы открыть окно управления полнотекстовым поиском необходимо выполнить следующее:

Обычное приложение - пункт меню Операции - Управление полнотекстовым поиском.


Управляемое приложение - пункт меню Главное меню - Все функции - Стандартные - Управление полнотекстовым поиском.


  • Обновить индекс – Создание индекса/Обновление индекса;
  • Очистить индекс – обнуление индекса(рекомендуется после обновления всех данных);
  • пункт Разрешить слияние индексов – отвечает за слияние основного и дополнительного индекса.


Полнотекстовый поиск осуществляется при помощи полнотекстового индекса. При отсутствии индекса полнотекстовый поиск как таковой не возможен. Для того чтобы поиск имел результат, все необходимые данные должны быть включены в полнотекстовый индекс. Если пользователем введены в базу новые данные, их следует включить в рассматриваемый индекс, иначе они не будут участвовать в поиске. Чтобы этого избежать, необходимо обновлять полнотекстовый индекс. При обновлении система анализирует только определенные типы данных: Строка, Данные ссылочного типа (ссылки на документы, справочники),Число, Дата, ХранилищеЗначения. Если пользователь не имеет прав доступа к определенной информации, то он не сможет увидеть ее в результатах поиска. Следует также помнить и о том, что в свойствах объектов, по которым будет происходить поиск должно быть установлено значение Полнотекстовый Поиск – Использовать, которое задано по умолчанию.

Как вы можете заметить свойство Использовать установлено для всего справочника Контрагенты, но сделать это можно и для каждого его реквизита соответствующего типа.

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

Специальные операторы, допустимые при задании поискового выражения

Механизм полнотекстового поиска допускает написание части символов русского слова одноклавишными латинскими символами. Результат поиска при этом не измениться.


Два оператора РЯДОМ

  • упрощенный. На расстоянии 8 слов друг от друга
  • РЯДОМ/[+/-]n – поиск данных в одном реквизите на расстоянии n-1 слов между ними.

Знак указывает в каком направлении от первого слова будет поиск второго. (+ - после, - до)

Групповой символ «*» может использоваться только в качестве замены конца слова

Программными средствами и средствами 1с: программирование.

Оператор синонимов «!». Позволяет найти слово и его синонимы

Как программно обновить индекс полнотекстового поиска?

Пример полнотекстового поиска данных

Определение переменной СписокПоиска

Кроме этого в процедуре обработки события ПриОткрыии формы определим, что эта переменная будет содержать список полнотекстового поиска, с помощью которого мы и будем осуществлять поиск в данных

Теперь для события нажатия на кнопку Найти напишем код, который позволит нам выполнять поиск в соответствии с тем выражением, которое задано в поле ПоисковоеВыражение

Создадим в модуле формы процедуру с таким именем и напишем в ней код,

В заключение передаем управление в процедуру ДоступностьКнопок() для того, чтобы сделать доступными или, наоборот, запретить доступ к кнопкам Предыдущая порция и Следующая порция (в зависимости от того, какая порция полученных результатов отображена). Текст этой процедуры представлен в Коде

Теперь необходимо создать обработчики событий нажатия на кнопки ПредыдущаяПорция() и СледующаяПорция().

Заключительным «штрихом» будет создание обработчика события onclick поля HTML-документа, расположенного в форме. Дело в том, что результат полнотекстового поиска, представленный в виде HTML-текста, содержит гиперссылки на номера элементов списка поиска. И нам хотелось бы, чтобы при переходе пользователя на эту ссылку система открывала бы форму того объекта, который содержится в этом элементе списка. Для этого мы будем перехватывать событие onclick HTML-документа, содержащегося в поле HTML-документа, получать номер элемента списка из гиперссылки и открывать форму соответствующего объекта. Текст обработчика события onclick поля HTML-документа представлен в коде

Использован релиз 3.0.104

В программе "1С:Бухгалтерия 8" (ред. 3.0) реализован механизм полнотекстового поиска во всех полях любого справочника, документа, списка и др.:

  1. Сочетание клавиш "Ctrl" и "F" автоматически устанавливает курсор в поле "Поиск". Начните набирать текст и поиск будет запущен автоматически.
  2. По кнопке со значком лупы (или сочетанием клавиш "Alt" и "F") можно выбрать "Расширенный поиск" и установить параметры поиска (рис. 1).


Если работа поиска по каким-то причинам нарушена, либо осуществляется медленно, рекомендуется очистить индексы и затем обновить их (рис. 2). Эти действия доступны только пользователям с правами "Администратор".

Внимание! При работе через облачные технологии операции по очистке и обновлению индексов выполняются автоматически.


Для автоматического обновления индексов, быстрой и корректной работы поиска должно быть настроено выполнение двух регламентных заданий – "Обновление индекса ППД" и "Слияние индекса ППД". Обычно эти регламентные задания настроены по умолчанию и выполняются в программе ежедневно по расписанию в автоматическом режиме (например, каждый день с 8.00 каждый час).

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

  1. Раздел: Администрирование – Обслуживание.
  2. Раскройте подраздел "Регламентные операции" и перейдите по ссылке "Регламентные и фоновые задания".
  3. В сформированном списке установите флажки у заданий "Обновление индекса ППД" и "Слияние индекса ППД".
  4. Поочередно двойным щелчком мыши откройте каждое задание, перейдите по ссылке "Расписание".
  5. В форме "Расписание" на закладке "Общее" указываются дата начала и завершения задания и режим повтора.
  6. На закладке "Дневное" укажите время начала задания и время повтора.
  7. На закладке "Недельное" и "Месячное" проверьте установку флажков по дням недели и по месяцам.
  8. Кнопка "ОК", затем кнопка "Записать и закрыть".


Смотрите также

Поиск в коллекциях значений

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк (*) рекомендуется:

  • Индексировать колонки, по которым выполняется поиск;
  • Но только те из них, которые обладают хорошей селективностью (т.е. каждому значению этой колонки должно соответствовать небольшое количество строк). В противном случае, индексирование не даст эффекта, либо он будет отрицательным (потрачено лишнее время на индексирование).

* Примечание: следует ориентироваться на 1000 строк и более, а также учитывать не только размер таблицы, в которой выполняется поиск, но и сколько раз он выполняется. Например, даже если таблица относительно небольшая в 100 строк, но поиск по ней выполняется 100 раз, ее тоже имеет смысл индексировать. В то же время, нет смысла индексировать таблицу из-за только одной единственной операции поиска.

2. Для поиска значений предусмотрены два метода объекта ТаблицаЗначений :

При поиске значения в одной колонке таблицы значений оба метода одинаково эффективно используют индекс, если он был задан (см. п.1).
Однако при поиске значения сразу по нескольким (или по всем) колонкам необходимо учитывать следующие ограничения.

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

ТЗ.Индексы.Добавить("Колонка1");
ТЗ.Индексы.Добавить("Колонка2");
. = ТЗ.Найти("найдется все", "Колонка1, Колонка2"); // Индекс НЕ используется!

В этом примере, несмотря на наличие индекса для колонок Колонка1 и Колонка2 , поиск все равно будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).

2.2. При использовании метода НайтиСтроки в таблицах значений с большим количеством строк следует обеспечить, чтобы список полей индекса был точно таким же, как он задан в структуре поиска (порядок полей не важен). В противном случае, индекс не будет задействован, и поиск будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
Например:

ТЗ.Индексы.Добавить("Колонка1"); // Индекс1
ТЗ.Индексы.Добавить("Колонка2"); // Индекс2

. = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2 ", "Ищу1","Ищу2")); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1") ); // OK - используется Индекс1
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2") ); // OK - используется Индекс2

. = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2", "Ищу1","Ищу2")); // OK - индекс используется
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2, Колонка1", "Ищу2","Ищу1")); // OK - индекс используется
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1") ); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2") ); // Индекс НЕ используется!

2.3. Аналогичное ограничение действует и для метода Скопировать таблицы значений при вызове с параметром ПараметрыОтбора ( Структура ).

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

  • В тех случаях, когда требуется сортировка по наименованию – сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе;
  • В остальных случаях – сортировать «по ссылке», а не по представлению. Для этого в методе Сортировать следует использовать объект СравнениеЗначений :

ОбъектСравнения = Новый СравнениеЗначений;
ТаблицаДокументов.Сортировать("Дата,Ссылка", ОбъектСравнения);

Особенно это важно для таблиц с большим количеством (несколько сотен и тысяч) строк, в алгоритмах критических ко времени исполнения.

3.1. При поиске в объекте Массив с большим количеством элементов(*) следует отказаться от массива в пользу:

  • объекта Соответствие , если не важен порядок элементов;
  • индексированной ТаблицаЗначений , если порядок элементов значим.

Это обусловлено тем, что в указанных случаях поиск занимает в большинстве случаев константное время, а в массиве поиск выполняется перебором и поэтому пропорционален количеству элементов.

* Примечание: следует ориентироваться на 1000 элементов и более, а также учитывать не только размер массива, но и сколько раз выполняется поиск. Например, если поиск выполняется многократно, в частности, в цикле, то эта рекомендация также действительна для массивов меньшего размера (до 1000 элементов). Особого внимания требуют универсальные механизмы, которые могут применяться на сколь угодно больших объемах данных.

3.2. При необходимости обеспечить уникальность элементов в большом массиве следует однократно в конце алгоритма вызвать функцию СвернутьМассив или процедуру ДополнитьМассив с параметром ТолькоУникальныеЗначения = Истина (модуль ОбщегоНазначения Библиотеки стандартных подсистем).

4. Аналогичный недостаток существует и у объекта ДеревоЗначений , в котором не предусмотрено индексов и поиск выполняется перебором (как в массиве). В указанных выше случаях объект ДеревоЗначений следует заменять индексированным объектом ТаблицаЗначений .


Для работы с текстовыми файлами в 1С предназначен объект ТекстовыйДокумент:

Для добавления строк в конец текстового документа используется метод ДобавитьСтроку. Параметром нужно передать добавляемую строку:

Для записи текстового документа в файл на диск нужно вызвать метод НачатьЗапись и вторым параметром указать путь к файлу:

Пример записи текстового файла с тремя строками:

В результате будет получен следующий файл:


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

ПослеЗаписи = Новый ОписаниеОповещения ( "ПослеЗаписи" , ЭтотОбъект ) ; Процедура ПослеЗаписи ( Результат , ДопПараметры ) Экспорт

Есть аналогичный асинхронный метод ЗаписатьАсинх, который использует асинхронность через обещания:

Для записи текстового файла на сервере используется синхронный метод Записать:

С помощью метода УстановитьТекст можно сразу установить весь текст:

Кодировка текстового файла

По умолчанию текстовый файл записывается в кодировке UTF-8. При необходимости кодировку можно изменить, указав в методе НачатьЗапись третий параметр:

ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "UTF-16LE" ) ; ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "UTF-16BE" ) ; ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , "windows-1251" ) ;

Если нужно записать в кодировке UCS-2LE или UCS-2BE, то нужно указать UTF-16LE или UTF-16BE. Это почти что одно и то же.

Список всех возможных кодировок можно посмотреть в синтакс-помощнике.

Кодировку текста можно указать не только строкой, но и с помощью системного перечисления КодировкаТекста:

ТекстДок . НачатьЗапись ( ПослеЗаписи , ПутьКФайлу , КодировкаТекста . Системная ) ;

Возможные значения перечисления:

Чтение текстового файла

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

Для получения текста нужно вызвать метод ПолучитьТекст, который прочитает текстовый файл в одну строку. Так как метод НачатьЧтение является асинхронным, то получать текст нужно в процедуре из описания оповещения. Для этого объект ТекстовыйДокумент передается через параметр описания оповещения:

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

Кодировка текста определяется автоматически из файла. Если кодировку не получится определить, то будет использоваться кодировка UTF-8. При необходимости можно указать требуемую кодировку третьим параметром:

ТекстДок . НачатьЧтение ( ПослеЧтения , ПутьКФайлу , "UTF-8" ) ;

Есть аналогичный асинхронный метод ПрочитатьАсинх, который вместо описания оповещения использует обещание:

При чтении файла на сервере можно воспользоваться синхронным методом Прочитать:

С помощью метода КоличествоСтрок можно узнать количество строк текстового файла, а методом ПолучитьСтроку, вызываемом в цикле, можно прочитать файл построчно:

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

Работа со строками текстового документа

В результате будет получен такой текстовый файл:


Если первым параметром указать номер строки, которой еще не существует в текстовом документе, то строка будет просто вставлена в конец документа.


С помощью метода УдалитьСтроку можно удалить строку из текстового документа. Параметром нужно указать номер удаляемой строки:

Методом Очистить можно полностью очистить текстовый документ:

Интерактивное редактирование текстового файла

После чтения текстового файла можно открыть его для интерактивного редактирования. Для этого используется метод Показать:

ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ТекстДок ) ;

В результате в 1С будет открыт редактор текстового документа:


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

//передаем тектовый документ и имя файла через доп. параметры ПослеЧтения = Новый ОписаниеОповещения ( "ПослеЧтения" , ЭтотОбъект , ДопПараметры ) ;

В результате после редактирования текстового документа будет предложено сохранить его:


Если согласиться, то изменения автоматически будут записаны в тот файл, который был указан вторым параметром.

Разделитель строк

При записи текстового документа средствами платформы 1С символ LF преобразуется в символы CR и LF. При чтении выполняется обратное преобразование CR и LF в LF.

При необходимости преобразования можно переопределить в методах НачатьЗапись и НачатьЧтение:

ТекстДок . НачатьЧтение ( ПослеЧтения , ПутьКФайлу , , Разделитель ) ;

То есть в методе НачатьЗапись указывается символ, в который будет выполнено преобразование символа LF. А в методе НачатьЧтение указывается символ, который нужно преобразовать в символ LF.

Можно указывать только следующие символы:

Если нужно использовать CR и LF, то параметр можно не указывать.

Последовательный доступ к файлу

Объект Текстовый документ при чтении загружает весь текстовый файл в память компьютера. Если файл большой, то памяти может не хватить.

Для решения данной проблемы можно использовать объекты последовательного доступа к текстовым файлам: ЗаписьТекста и ЧтениеТекста. Данные объекты загружают в память только определенный фрагмент текста, с которым в данный момент идет работа.

Читайте также: