Разработка и Конфигурация · 8 мин
Как добавить строку поиска на форму в 1С
Как добавить строку поиска на форму в 1С 8.3: поле ввода с отбором динамического списка, расширенный поиск, код на встроенном языке и типичные ошибки.
Строка поиска на форме списка или форме подбора — один из самых востребованных элементов интерфейса в 1С. Пользователь вводит фрагмент наименования, артикула или кода, а список мгновенно фильтруется. В зависимости от задачи это реализуется тремя способами: стандартными средствами динамического списка без программирования, добавлением поля ввода с обработчиком отбора или настройкой расширенного поиска по строке.
Выбор способа зависит от того, где нужен поиск: в обычной форме списка справочника, в форме выбора при подборе товаров или в произвольной форме обработки. Ниже разобраны все варианты с конкретными действиями в конфигураторе и кодом на встроенном языке.
Способ 1: встроенная строка поиска динамического списка
Формы списков справочников и документов в управляемом приложении построены на динамическом списке, и платформа уже умеет показывать строку поиска. Часто её не видно только потому, что пользователь скрыл элемент через меню «Ещё» — «Настроить список» или поиск отключён в настройках формы.
Чтобы включить или проверить строку поиска в конфигураторе, откройте нужную форму списка, найдите в дереве реквизитов основной реквизит типа «ДинамическийСписок» (обычно называется «Список») и откройте его свойства. Обратите внимание на группу параметров, связанных с поиском.
- 1Откройте форму списка в конфигураторе и выделите реквизит «Список» (ДинамическийСписок)
- 2В палитре свойств установите «Расширенный поиск» = Истина
- 3В свойстве «Поля поиска» перечислите поля, по которым должен работать поиск (Наименование, Код, Артикул)
- 4Сохраните конфигурацию, обновите базу и проверьте форму в режиме 1С:Предприятие
После этого над таблицей списка появится поле с кнопкой поиска. Платформа будет искать введённую подстроку по указанным полям без единой строки кода. Это рекомендуемый вариант, если требования укладываются в стандартную механику.
Способ 2: своё поле ввода с программным отбором
Если нужен отдельный элемент — например, поле поиска в произвольном месте формы обработки или на форме подбора с особой логикой — добавьте реквизит формы типа «Строка» и элемент «Поле ввода», связанный с этим реквизитом.
Для элемента создайте обработчик события «ИзменениеТекстаРедактирования». Он срабатывает на каждое нажатие клавиши и позволяет фильтровать список в реальном времени. Внутри обработчика установите отбор динамического списка через свойство «Отбор» с использованием произвольного запроса или элементов отбора.
&НаКлиенте
Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
УстановитьОтборПоСтроке(Текст);
КонецПроцедуры
&НаСервере
Процедура УстановитьОтборПоСтроке(Текст)
Список.Отбор.Элементы.Очистить();
Если Не ПустаяСтрока(Текст) Тогда
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбора.ПравоеЗначение = Текст;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедурыОбратите внимание: обработчик изменения текста выполняется на клиенте, а отбор динамического списка удобнее устанавливать на сервере, поэтому в примере используется разделение на клиентскую и серверную процедуры. Вид сравнения «Содержит» ищет подстроку в любом месте наименования.
Поиск по нескольким полям одновременно
На практике пользователь ожидает, что по одной строке найдётся и товар по наименованию, и по артикулу, и по штрихкоду. Для этого в отбор нужно добавить группу элементов с типом «ГруппаЭлементовОтбораКомпоновкиДанных» и типом группы «ГруппаИли».
Внутри группы «ИЛИ» разместите по одному элементу отбора на каждое поле: Наименование, Артикул, Код. Тогда запись попадёт в результат, если подстрока найдена хотя бы в одном из полей. Убедитесь, что все поля доступны в запросе динамического списка — иначе получите ошибку «Поле не найдено».
Поиск в форме выбора и при подборе
В формах выбора справочников платформа и без доработок поддерживает поиск по строке: достаточно начать вводить текст, находясь в списке, либо воспользоваться полем поиска в командной панели. Если типовой формы выбора нет или она переопределена, проверьте, что у динамического списка включён расширенный поиск, как описано выше.
Для форм подбора товаров в документах часто делают комбинированный вариант: отдельное поле поиска, которое фильтрует таблицу товаров, плюс кнопка сброса отбора. Кнопку реализуют командой формы, в обработчике которой очищается строка поиска и коллекция элементов отбора.
Производительность и ограничения
Поиск по подстроке с видом сравнения «Содержит» не использует индексы базы данных, поэтому на больших таблицах (сотни тысяч записей и больше) каждый запрос будет выполнять полное сканирование. Для таких объёмов используйте полнотекстовый поиск: включите его в свойствах конфигурации (раздел «Полнотекстовый поиск»), настройте состав полей и выполняйте поиск через объект «ПолнотекстовыйПоиск».
Ещё одно ограничение — частые серверные вызовы. Если обработчик «ИзменениеТекстаРедактирования» при каждом символе вызывает серверную процедуру, форма начнёт подтормаживать. Смягчить проблему можно, реагируя на событие «ОкончаниеВводаТекста» вместо изменения текста, либо начиная поиск только от трёх введённых символов.
Проверка результата
После доработки проверьте форму в режиме 1С:Предприятие под учётной записью с типовыми правами, а не только под полными правами. Введите два-три символа из реального наименования: список должен сократиться до подходящих записей. Затем очистите строку — список обязан вернуться к полному виду без перезапуска формы.
Как проверить результат
Список фильтруется, подходящие записи видны
Список пуст или не меняется — проверьте отбор и поля запроса
Отображаются все записи
Фильтр остаётся — отбор не сбрасывается при пустой строке
Результат появляется без заметной паузы
Задержки — нужен полнотекстовый поиск или оптимизация запроса
Частые вопросы
Можно ли добавить строку поиска без изменения конфигурации?
Да, если форма типовая и у динамического списка не отключён поиск: пользователь может вывести поле поиска через «Ещё» — «Изменить форму» и включить нужный элемент. Для произвольной логики поиска без доработки конфигурации не обойтись.
Почему поиск не находит записи, хотя текст точно есть?
Чаще всего поле, по которому идёт поиск, не входит в запрос динамического списка или отбор применяется к другому полю. Также проверьте вид сравнения: «Равно» вместо «Содержит» требует точного совпадения всей строки.
Как сделать поиск сразу при открытии формы с переданным текстом?
Передайте строку через параметры формы при её открытии, в обработчике «ПриСозданииНаСервере» присвойте её реквизиту поиска и вызовите процедуру установки отбора с этим текстом.
Работает ли поиск по нажатию Enter, а не при вводе?
Да. Используйте событие «ОкончаниеВводаТекста» вместо «ИзменениеТекстаРедактирования» — обработчик сработает при нажатии Enter или потере фокуса, что снижает нагрузку на сервер.
Чем полнотекстовый поиск лучше отбора по подстроке?
Он использует специальный индекс, поэтому работает быстро на больших объёмах и умеет искать с учётом морфологии. Минус — индекс нужно создавать и периодически обновлять, а настройка сложнее простого отбора.
Можно ли искать по штрихкоду через ту же строку?
Да, если штрихкод хранится в доступном поле или связанном регистре сведений. Добавьте соответствующее поле в запрос динамического списка и включите его в группу «ИЛИ» отбора. Для сканера штрихкодов дополнительно используют обработку оповещения о внешнем событии.
Что важно запомнить
Стандартную строку поиска включайте через свойства динамического списка — это самый быстрый путь. Для особой логики добавляйте поле ввода и устанавливайте отбор компоновки данных с видом сравнения «Содержит», очищая старый отбор. На больших таблицах вместо поиска по подстроке применяйте полнотекстовый поиск.