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

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

Как сделать строку поиска в 1С

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

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

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

Ниже разобраны оба подхода: от включения штатных механизмов до написания собственного обработчика поиска с примерами кода на встроенном языке 1С. Материал подходит для управляемых форм (такси), в которых работают современные конфигурации.

Как работает встроенная строка поиска в формах списков

В управляемых формах платформа 1С автоматически добавляет панель поиска ко всем динамическим спискам. Пользователь открывает её кнопкой «Найти» на панели команд, сочетанием клавиш Ctrl+F или начинает просто печатать текст — в зависимости от настроек формы. Поиск выполняется по тем колонкам, которые отображаются в списке и индексируются.

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

Второе важное свойство — «ОтображениеСтрокиПоиска»: «Авто», «Всегда» или «ПриВводе». Если выбрать «Всегда», строка поиска будет постоянно видна на форме, что удобно для справочников с большим количеством элементов, к которым пользователи обращаются через поиск чаще, чем через прокрутку.

Настройка строки поиска без программирования

Чтобы вывести постоянно видимую строку поиска на форму списка, выполните настройку в конфигураторе. Откройте нужную форму списка, найдите в дереве реквизитов основной динамический список (обычно он называется «Список») и установите свойства: ПоложениеСтрокиПоиска — «Верх» или «КоманднаяПанель», ОтображениеСтрокиПоиска — «Всегда».

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

Включить видимую строку поиска в форме списка
  1. 1
    Откройте конфигуратор, найдите нужный справочник или документ и откройте его форму списка
  2. 2
    Выделите реквизит динамического списка (обычно «Список») и откройте палитру свойств
  3. 3
    Установите ПоложениеСтрокиПоиска = «Верх» и ОтображениеСтрокиПоиска = «Всегда»
  4. 4
    При необходимости настройте СпособПоискаСтрокиПриВводе: «ПоНачалу» — быстрее, «ПоЛюбойЧасти» — удобнее для пользователя
  5. 5
    Обновите конфигурацию базы данных и проверьте форму в режиме предприятия

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

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

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

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

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

Когда штатных возможностей недостаточно, строку поиска реализуют вручную. Типовой сценарий: на форме списка или подбора добавляется реквизит формы «СтрокаПоиска» (тип Строка), на форму выводится поле ввода, а в обработчике события «ПриИзменении» (или «АвтоПодбор» / «ИзменениеТекстаРедактирования» для поиска по мере ввода) накладывается отбор на динамический список.

Пример обработчика, который фильтрует список по наименованию:

&НаКлиенте

Процедура СтрокаПоискаПриИзменении(Элемент)

УстановитьОтборПоСтроке(СтрокаПоиска);

КонецПроцедуры

&НаСервере

Процедура УстановитьОтборПоСтроке(Строка)

ЭлементыОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;

ЭлементыОтбора.Очистить();

Если Не ПустаяСтрока(Строка) Тогда

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

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

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

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

ЭлементОтбора.Использование = Истина;

КонецЕсли;

КонецПроцедуры

Для поиска по мере ввода без нажатия Enter используйте событие «ИзменениеТекстаРедактирования» у поля ввода. В нём текст доступен через параметр «Текст», а не через значение реквизита. Чтобы не выполнять отбор на каждое нажатие клавиши, добавьте задержку через ПодключитьОбработчикОжидания на 0,3–0,5 секунды — это стандартная практика для «живого» поиска.

1c
&НаКлиенте
Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
    ОтключитьОбработчикОжидания("ВыполнитьПоиск");
    ТекстПоиска = Текст;
    ПодключитьОбработчикОжидания("ВыполнитьПоиск", 0.4, Истина);
КонецПроцедуры

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

Для поиска одновременно по наименованию, артикулу и коду используйте группу отборов с условием «ИЛИ» в компоновке данных либо прямой запрос. Вариант с группой: добавьте в отбор элемент типа «ГруппаЭлементовОтбораКомпоновкиДанных» с ТипГруппы = ИЛИ, а внутрь — по одному условию «Содержит» на каждое поле.

Если данные выводятся не динамическим списком, а собственной таблицей значений, отбор накладывается запросом с оператором ПОДОБНО:

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка,

| Номенклатура.Наименование,

| Номенклатура.Артикул

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Наименование ПОДОБНО &Строка

| ИЛИ Номенклатура.Артикул ПОДОБНО &Строка";

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

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

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

Проверка результата и ограничения

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

Измерьте время отклика на реальном объёме данных. Если список содержит сотни тысяч записей, а отбор «Содержит» выполняется дольше 2–3 секунд, пересмотрите подход: ограничьте поиск полями с индексом, переключите способ поиска на «ПоНачалу» или переведите задачу на полнотекстовый поиск, который строит индекс заранее и не сканирует таблицы при каждом запросе.

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

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

Ввод части слова из середины наименования
Норма

Список фильтруется, нужные записи найдены

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

Записи не находятся — проверьте вид сравнения и колонки списка

Очистка строки поиска
Норма

Список возвращается к полному виду, пользовательские отборы сохранены

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

Сбрасываются все отборы или список остаётся отфильтрованным

Поиск на большом объёме данных
Норма

Отклик в пределах 1–3 секунд

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

Форма подвисает — нужен индекс, отбор «ПоНачалу» или полнотекстовый поиск

Часто задаваемые вопросы

Как открыть строку поиска в уже работающей программе 1С без конфигуратора?

Нажмите Ctrl+F на открытой форме списка или кнопку «Найти» в командной панели. В интерфейсе «Такси» также работает глобальный поиск по строке в верхней части окна, если включён полнотекстовый поиск.

Почему поиск не находит значение, которое точно есть в базе?

Чаще всего дело в том, что поиск ведётся только по отображаемым колонкам списка, а нужное поле не выведено. Также проверьте способ поиска: при «ПоНачалу» значение ищется только с первого символа, а не по подстроке в середине.

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

В динамических списках сравнение «Содержит» обычно регистронезависимо на уровне СУБД. В запросах с ПОДОБНО поведение зависит от настроек базы данных; надёжный способ — приводить обе стороны к одному регистру функцией ВРЕГ() или НРЕГ() в тексте запроса.

Чем отличается строка поиска от полнотекстового поиска?

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

Можно ли сделать поиск с выпадающими подсказками при вводе?

Да. У поля ввода включите свойства «АвтоПодбор» и «БыстрыйВыбор», а в обработчике «АвтоПодбор» программно сформируйте СписокЗначений с подходящими вариантами через запрос с ПОДОБНО и ограничением «ПЕРВЫЕ 10», чтобы не перегружать выпадающий список.

Почему после обновления конфигурации пропала кнопка поиска в списке?

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