Разработка и Конфигурация · 10 мин
Как сделать строку поиска в 1С
Как добавить строку поиска в 1С: использование стандартной строки поиска в динамических списках, полнотекстовый поиск и программная реализация с примерами кода.
Строка поиска в 1С бывает двух принципиально разных видов. Первый — встроенная строка поиска, которая автоматически появляется в динамических списках форм (справочниках, документах, регистрах) и позволяет пользователю искать записи без какой-либо доработки конфигурации. Второй — программно реализованный поиск: поле ввода на форме, обработчик события изменения текста и запрос к данным с отбором по подстроке.
В большинстве случаев задача «сделать строку поиска» решается без единой строки кода: достаточно правильно настроить динамический список и включить полнотекстовый поиск в базе. Программная реализация нужна, когда требуется нестандартное поведение: поиск сразу по нескольким полям, поиск по связанным данным, автоподстановка при вводе или поиск вне стандартных форм списков.
Ниже разобраны оба подхода: от включения штатных механизмов до написания собственного обработчика поиска с примерами кода на встроенном языке 1С. Материал подходит для управляемых форм (такси), в которых работают современные конфигурации.
Как работает встроенная строка поиска в формах списков
В управляемых формах платформа 1С автоматически добавляет панель поиска ко всем динамическим спискам. Пользователь открывает её кнопкой «Найти» на панели команд, сочетанием клавиш Ctrl+F или начинает просто печатать текст — в зависимости от настроек формы. Поиск выполняется по тем колонкам, которые отображаются в списке и индексируются.
Разработчик управляет этим поведением через свойства динамического списка. В конфигураторе откройте форму списка, выделите реквизит списка и посмотрите свойство «ПоложениеСтрокиПоиска»: доступны значения «Авто», «Нет», «Верх», «Низ», «КоманднаяПанель». Значение «Авто» подходит для большинства случаев — платформа сама разместит строку в командной панели.
Второе важное свойство — «ОтображениеСтрокиПоиска»: «Авто», «Всегда» или «ПриВводе». Если выбрать «Всегда», строка поиска будет постоянно видна на форме, что удобно для справочников с большим количеством элементов, к которым пользователи обращаются через поиск чаще, чем через прокрутку.
Настройка строки поиска без программирования
Чтобы вывести постоянно видимую строку поиска на форму списка, выполните настройку в конфигураторе. Откройте нужную форму списка, найдите в дереве реквизитов основной динамический список (обычно он называется «Список») и установите свойства: ПоложениеСтрокиПоиска — «Верх» или «КоманднаяПанель», ОтображениеСтрокиПоиска — «Всегда».
Дополнительно проверьте свойство «ИсторияПоискаПриВводе» — оно включает сохранение последних введённых строк для быстрого повторного выбора. Для больших списков полезно свойство «СпособПоискаСтрокиПриВводе»: значение «ПоНачалу» ускоряет поиск, так как использует индекс, а «ПоЛюбойЧасти» ищет подстроку в любом месте значения, но работает медленнее на больших таблицах.
- 1Откройте конфигуратор, найдите нужный справочник или документ и откройте его форму списка
- 2Выделите реквизит динамического списка (обычно «Список») и откройте палитру свойств
- 3Установите ПоложениеСтрокиПоиска = «Верх» и ОтображениеСтрокиПоиска = «Всегда»
- 4При необходимости настройте СпособПоискаСтрокиПриВводе: «ПоНачалу» — быстрее, «ПоЛюбойЧасти» — удобнее для пользователя
- 5Обновите конфигурацию базы данных и проверьте форму в режиме предприятия
Полнотекстовый поиск по всей базе
Если задача — дать пользователю единую строку поиска по всем данным информационной базы (по документам, справочникам, комментариям), используется механизм полнотекстового поиска. Он строит отдельный индекс и ищет по словам с учётом морфологии русского языка, а не по точному совпадению подстроки.
Включается механизм в конфигураторе: меню «Администрирование» → «Полнотекстовый поиск» → установить флаг «Разрешить полнотекстовый поиск» и обновить индекс. Далее в свойствах каждого объекта метаданных (справочника, документа) и его реквизитов указывается свойство «ПолнотекстовыйПоиск»: «Использовать» или «НеИспользовать». По умолчанию большинство строковых реквизитов уже включены в индекс.
В пользовательском режиме полнотекстовый поиск вызывается через стандартную команду «Найти» в разделе «Все функции» или через программный интерфейс объекта ПолнотекстовыйПоиск. Учтите, что индекс нужно периодически обновлять — иначе новые данные не будут находиться. В файловых базах обновление выполняется вручную или по расписанию, в клиент-серверных можно настроить автоматическое слияние индекса.
Программная строка поиска на управляемой форме
Когда штатных возможностей недостаточно, строку поиска реализуют вручную. Типовой сценарий: на форме списка или подбора добавляется реквизит формы «СтрокаПоиска» (тип Строка), на форму выводится поле ввода, а в обработчике события «ПриИзменении» (или «АвтоПодбор» / «ИзменениеТекстаРедактирования» для поиска по мере ввода) накладывается отбор на динамический список.
Пример обработчика, который фильтрует список по наименованию:
&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
УстановитьОтборПоСтроке(СтрокаПоиска);
КонецПроцедуры
&НаСервере
Процедура УстановитьОтборПоСтроке(Строка)
ЭлементыОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
ЭлементыОтбора.Очистить();
Если Не ПустаяСтрока(Строка) Тогда
ЭлементОтбора = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбора.ПравоеЗначение = Строка;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Для поиска по мере ввода без нажатия Enter используйте событие «ИзменениеТекстаРедактирования» у поля ввода. В нём текст доступен через параметр «Текст», а не через значение реквизита. Чтобы не выполнять отбор на каждое нажатие клавиши, добавьте задержку через ПодключитьОбработчикОжидания на 0,3–0,5 секунды — это стандартная практика для «живого» поиска.
&НаКлиенте
Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
ОтключитьОбработчикОжидания("ВыполнитьПоиск");
ТекстПоиска = Текст;
ПодключитьОбработчикОжидания("ВыполнитьПоиск", 0.4, Истина);
КонецПроцедурыПоиск по нескольким полям и через запрос
Для поиска одновременно по наименованию, артикулу и коду используйте группу отборов с условием «ИЛИ» в компоновке данных либо прямой запрос. Вариант с группой: добавьте в отбор элемент типа «ГруппаЭлементовОтбораКомпоновкиДанных» с ТипГруппы = ИЛИ, а внутрь — по одному условию «Содержит» на каждое поле.
Если данные выводятся не динамическим списком, а собственной таблицей значений, отбор накладывается запросом с оператором ПОДОБНО:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование,
| Номенклатура.Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Строка
| ИЛИ Номенклатура.Артикул ПОДОБНО &Строка";
Запрос.УстановитьПараметр("Строка", "%" + СтрокаПоиска + "%");
Обратите внимание: символы %, _ и [ в пользовательском вводе являются служебными для оператора ПОДОБНО. Если пользователь может вводить их буквально, экранируйте ввод через СтрЗаменить с указанием спецсимвола через СПЕЦСИМВОЛ в тексте запроса, иначе получите неверные результаты или ошибку запроса.
Проверка результата и ограничения
После настройки проверьте поиск в режиме предприятия по контрольному набору данных: введите часть слова из середины значения, слово в другом регистре, строку со спецсимволами и заведомо отсутствующее значение. Список должен корректно фильтроваться во всех четырёх случаях, а при очистке строки поиска — возвращаться к полному составу.
Измерьте время отклика на реальном объёме данных. Если список содержит сотни тысяч записей, а отбор «Содержит» выполняется дольше 2–3 секунд, пересмотрите подход: ограничьте поиск полями с индексом, переключите способ поиска на «ПоНачалу» или переведите задачу на полнотекстовый поиск, который строит индекс заранее и не сканирует таблицы при каждом запросе.
Как проверить результат
Список фильтруется, нужные записи найдены
Записи не находятся — проверьте вид сравнения и колонки списка
Список возвращается к полному виду, пользовательские отборы сохранены
Сбрасываются все отборы или список остаётся отфильтрованным
Отклик в пределах 1–3 секунд
Форма подвисает — нужен индекс, отбор «ПоНачалу» или полнотекстовый поиск
Часто задаваемые вопросы
Как открыть строку поиска в уже работающей программе 1С без конфигуратора?
Нажмите Ctrl+F на открытой форме списка или кнопку «Найти» в командной панели. В интерфейсе «Такси» также работает глобальный поиск по строке в верхней части окна, если включён полнотекстовый поиск.
Почему поиск не находит значение, которое точно есть в базе?
Чаще всего дело в том, что поиск ведётся только по отображаемым колонкам списка, а нужное поле не выведено. Также проверьте способ поиска: при «ПоНачалу» значение ищется только с первого символа, а не по подстроке в середине.
Как сделать поиск нечувствительным к регистру?
В динамических списках сравнение «Содержит» обычно регистронезависимо на уровне СУБД. В запросах с ПОДОБНО поведение зависит от настроек базы данных; надёжный способ — приводить обе стороны к одному регистру функцией ВРЕГ() или НРЕГ() в тексте запроса.
Чем отличается строка поиска от полнотекстового поиска?
Строка поиска фильтрует конкретный список по точному вхождению подстроки. Полнотекстовый поиск ищет по всей базе сразу, понимает словоформы русского языка и работает по заранее построенному индексу, но требует его включения и периодического обновления.
Можно ли сделать поиск с выпадающими подсказками при вводе?
Да. У поля ввода включите свойства «АвтоПодбор» и «БыстрыйВыбор», а в обработчике «АвтоПодбор» программно сформируйте СписокЗначений с подходящими вариантами через запрос с ПОДОБНО и ограничением «ПЕРВЫЕ 10», чтобы не перегружать выпадающий список.
Почему после обновления конфигурации пропала кнопка поиска в списке?
Проверьте свойства динамического списка ПоложениеСтрокиПоиска и ОтображениеСтрокиПоиска — при доработке формы их могли сбросить. Также убедитесь, что у пользователя есть права на просмотр соответствующих данных: при ограничении на уровне записей поиск может работать некорректно.