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