К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как реализовать поиск в 1С: практическое руководство для разработчика

Практическое руководство по реализации поиска в 1С: полнотекстовый поиск, поиск по строке в запросах, динамические списки, программный поиск данных и типичные ошибки разработчика.

Поиск — одна из самых востребованных функций в любой конфигурации 1С. Пользователи хотят быстро находить контрагентов, товары, документы и договоры, не пролистывая длинные списки. Платформа 1С:Предприятие предлагает несколько механизмов поиска: встроенный полнотекстовый поиск по данным, поиск по подстроке в запросах, программный поиск через методы объектов и настройку динамических списков.

Выбор подхода зависит от задачи. Если нужно искать по содержимому текстовых полей и прикреплённых файлов — используйте полнотекстовый поиск. Если нужен поиск контрагента по фрагменту наименования или ИНН — достаточно запроса с оператором ПОДОБНО. Для поиска в формах списка работают стандартные средства управляемых форм: строка поиска, отбор и история поиска.

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

Какие механизмы поиска есть в платформе 1С

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

Полнотекстовый поиск индексирует содержимое текстовых реквизитов, макетов и прикреплённых файлов и позволяет искать по словам с учётом морфологии. Поиск через запрос с ПОДОБНО ищет точное вхождение подстроки в конкретный реквизит. Программный поиск методами НайтиПоНаименованию, НайтиПоКоду, НайтиПоРеквизиту подходит для точного совпадения. Строка поиска в динамических списках даёт пользователю интерактивный поиск без программирования.

Сравнение механизмов поиска

Полнотекстовый поиск

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

Запрос с ПОДОБНО

Подходит для поиска по наименованию, ИНН, артикулу. Не использует индекс при % в начале шаблона — медленно на больших таблицах.

НайтиПоНаименованию / НайтиПоРеквизиту

Точное совпадение, быстро при наличии индекса. Не ищет по части строки.

Строка поиска динамического списка

Готовое решение для форм списков без кода. Ищет только по полям, указанным в настройке.

Как включить и настроить полнотекстовый поиск

Полнотекстовый поиск включается в конфигураторе: меню «Администрирование» — «Полнотекстовый поиск» в режиме предприятия, либо через свойства конфигурации. После включения нужно выполнить первоначальное индексирование — платформа построит индекс по всем объектам, у которых в свойствах метаданных установлено использование полнотекстового поиска.

Для каждого реквизита в конфигураторе есть свойство «Полнотекстовый поиск» со значениями «Использовать» и «Не использовать». Включайте его только для реквизитов, где поиск действительно нужен: наименования, описания, комментарии, текстовые поля. Индексация служебных полей раздувает индекс и замедляет его обновление.

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

Включение полнотекстового поиска
  1. 1
    Откройте конфигуратор и проверьте у нужных реквизитов свойство «Полнотекстовый поиск» — установите «Использовать».
  2. 2
    Обновите конфигурацию базы данных и запустите режим предприятия.
  3. 3
    Откройте «Администрирование» — «Полнотекстовый поиск», включите поиск и запустите индексирование.
  4. 4
    Дождитесь завершения построения индекса и проверьте поиск на тестовой фразе.
  5. 5
    Настройте расписание обновления индекса, чтобы новые данные попадали в результаты.

Как выполнить полнотекстовый поиск программно

Для программного поиска используется менеджер ПолнотекстовыйПоиск. Сначала создаётся список поиска с поисковым выражением, затем выполняется метод, возвращающий порцию результатов. Результаты содержат ссылки на найденные объекты и описания с подсветкой совпадений.

Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() 

= РежимПолнотекстовогоПоиска.Разрешить Тогда

СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, 50);

СписокПоиска.ПерваяЧасть();

Для Каждого Элемент Из СписокПоиска Цикл

Сообщить(Элемент.Ссылка);

КонецЦикла;

КонецЕсли;

Поисковое выражение поддерживает специальный синтаксис: логические операторы И, ИЛИ, НЕ, поиск по точной фразе в кавычках, поиск с учётом морфологии через символ #. Например, выражение #"счет на оплату" найдёт документы с точной фразой, а договор & поставка — объекты, где встречаются оба слова.

Как искать по реквизитам через запрос с ПОДОБНО

Самый частый сценарий — найти контрагента или номенклатуру по фрагменту строки. Для этого в запросе используется оператор ПОДОБНО с шаблоном, где символ % означает любую последовательность символов, а _ — один произвольный символ.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Ссылка

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.Наименование ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");

Результат = Запрос.Выполнить().Выбрать();

Критичный момент — производительность. Если шаблон начинается с %, СУБД не может использовать индекс по наименованию и выполняет полное сканирование таблицы. На справочнике в сотни тысяч записей такой запрос может выполняться заметное время. Смягчить проблему можно ограничением выборки через РАЗЛИЧНЫЕ ПЕРВЫЕ, поиском только по началу строки (шаблон «Строка%») или переходом на полнотекстовый поиск.

Если в строке поиска пользователь может ввести символы %, _, [ или ], их нужно экранировать спецсимволом, иначе запрос вернёт неверные результаты. Для этого в запросе добавляют конструкцию СПЕЦСИМВОЛ.

Как организовать поиск в форме списка

В управляемых формах строка поиска доступна из коробки: пользователь нажимает Ctrl+F или вводит текст в поле поиска, и динамический список фильтруется. Разработчику нужно лишь настроить, по каким полям выполняется поиск. Для этого в запросе динамического списка выбираются нужные поля, а в параметрах списка доступна настройка отбора.

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

ГруппаОтбора = Список.Отбор.Элементы.Добавить(

Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));

ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;

ЭлементОтбора.ПравоеЗначение = СтрокаПоиска;

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

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

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

  • Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка", Истина) — поиск по наименованию, второй параметр включает точное соответствие;
  • Справочники.Номенклатура.НайтиПоКоду("000123") — поиск по коду;
  • Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7712345678") — поиск по произвольному реквизиту;
  • Документы.РеализацияТоваров.НайтиПоНомеру(Номер, Дата) — поиск документа по номеру в пределах периода уникальности нумерации.

Все эти методы возвращают пустую ссылку, если объект не найден. Проверяйте результат через Ссылка.Пустая() перед дальнейшей работой — обращение к реквизитам несуществующего объекта приведёт к ошибке.

Типичные ошибки при реализации поиска
01
Поиск при каждом нажатии клавиши без задержки — сотни запросов в секунду перегружают сервер. Добавьте ожидание после ввода или минимальную длину строки.
02
Шаблон «%текст%» на больших таблицах без ограничения выборки — полное сканирование и блокировки.
03
Отсутствие проверки Пустая() после НайтиПоНаименованию — ошибка при обращении к реквизитам ненайденного объекта.
04
Включение полнотекстового поиска без настройки расписания обновления индекса — пользователи не находят свежие документы.
05
Неэкранированные спецсимволы %, _ в пользовательском вводе — неверные результаты и потенциально опасные шаблоны.

Как проверить, что поиск работает правильно

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

Для полнотекстового поиска дополнительно проверьте актуальность индекса: создайте новый объект с уникальным словом, обновите индекс и убедитесь, что объект находится. Если не находится — проверьте расписание обновления и свойство «Полнотекстовый поиск» у соответствующего реквизита.

Контрольные точки

Как проверить результат

Поиск по фрагменту наименования
Норма

Находит объект независимо от регистра ввода

Тревожный признак

Находит только при точном совпадении регистра

Свежие данные в полнотекстовом поиске
Норма

Новый документ находится после обновления индекса

Тревожный признак

Новые объекты не находятся — индекс не обновляется

Скорость поиска на рабочем объёме данных
Норма

Результат за секунды без зависания интерфейса

Тревожный признак

Форма подвисает, в консоли СУБД видны долгие сканирования

Пустой результат
Норма

Корректное сообщение «ничего не найдено»

Тревожный признак

Ошибка обращения к реквизитам пустой ссылки

Итог

Что важно запомнить

Выбирайте механизм под задачу: полнотекстовый поиск — для текстов и файлов, ПОДОБНО — для фрагментов реквизитов, НайтиПоРеквизиту — для точных совпадений, строка поиска динамического списка — для форм без кода. Контролируйте производительность: ограничивайте выборки, не запускайте поиск на каждое нажатие клавиши и следите за обновлением полнотекстового индекса.

Частые вопросы о поиске в 1С

Почему полнотекстовый поиск не находит новые документы?

Индекс полнотекстового поиска обновляется не мгновенно, а по расписанию или вручную. Проверьте в разделе «Администрирование» — «Полнотекстовый поиск», когда выполнялось последнее обновление, и настройте регулярное обновление. Также убедитесь, что у реквизитов объекта в конфигураторе включено свойство полнотекстового поиска.

Как сделать поиск сразу по нескольким полям одной строкой?

В динамическом списке программно добавьте группу отбора с типом «ИЛИ» и включите в неё условия по каждому полю с видом сравнения «Содержит». В запросе используйте несколько условий ПОДОБНО, объединённых оператором ИЛИ. Для больших таблиц эффективнее полнотекстовый поиск по нескольким реквизитам.

Почему поиск с ПОДОБНО работает медленно?

Если шаблон начинается с символа %, СУБД не может использовать индекс и сканирует всю таблицу. Варианты решения: искать только по началу строки, ограничивать выборку, задавать минимальную длину строки поиска или перейти на полнотекстовый поиск, который использует собственный индекс.

Как экранировать спецсимволы в пользовательском вводе?

Символы %, _, [, ], ~ в шаблоне ПОДОБНО имеют служебное значение. Замените их в строке пользователя на экранированные варианты (например, «~%») и добавьте в запрос после шаблона конструкцию СПЕЦСИМВОЛ "~". Без этого ввод «100%» найдёт вообще все строки, начинающиеся со 100.

Можно ли искать по содержимому прикреплённых файлов?

Да, полнотекстовый поиск платформы индексирует текстовое содержимое прикреплённых файлов поддерживаемых форматов, если в конфигурации используется стандартное хранение файлов и включён полнотекстовый поиск. Файлы без текстового слоя, например сканы без распознавания, индексироваться не будут.

Чем отличается НайтиПоНаименованию от поиска через запрос?

НайтиПоНаименованию ищет точное совпадение (или по началу строки при соответствующем параметре) и возвращает одну ссылку. Запрос с ПОДОБНО ищет вхождение подстроки в любом месте и может вернуть множество результатов. Для точного поиска по индексированному полю метод быстрее и проще, для нечёткого поиска нужен запрос или полнотекстовый поиск.