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