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

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

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

Как выполнить поиск по строке в 1С: поиск в списках и табличных частях, функция СтрНайти, НайтиПоНаименованию, запросы с ПОДОБНО. Примеры кода и типичные ошибки.

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

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

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

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

Если стандартное поле поиска не находит нужное, используйте комбинацию Ctrl+F — откроется диалог «Найти», где можно указать, по каким колонкам искать и нужно ли искать по точному совпадению. Дополнительно доступен отбор по условию через меню «Ещё» → «Настроить список»: там можно задать условие вида «Наименование Содержит "текст"».

Важный нюанс: поиск в динамическом списке ищет только по видимым представлениям и полям, включённым в поиск. Если контрагент не находится по ИНН, скорее всего, поле ИНН просто не добавлено в настройки поиска — это исправляется в конфигураторе или расширением.

Как найти элемент в списке
  1. 1
    Откройте нужный список (справочник или журнал документов)
  2. 2
    Введите часть названия в поле поиска над списком
  3. 3
    Если результата нет — нажмите Ctrl+F и выберите конкретные колонки для поиска
  4. 4
    Для сложных условий откройте «Ещё» → «Настроить список» и добавьте отбор «Содержит»
  5. 5
    Проверьте, что отбор не скрывает часть данных: сбросьте лишние условия

Поиск подстроки в коде: функция СтрНайти

Когда нужно определить, содержит ли строковая переменная определённый текст, используется встроенная функция СтрНайти() (в английском синтаксисе — StrFind). Она возвращает позицию первого вхождения подстроки, начиная с 1, или 0, если подстрока не найдена.

bsl
Строка = "Счет-фактура № 1024 от 15.03";
Позиция = СтрНайти(Строка, "1024");
Если Позиция > 0 Тогда
    Сообщить("Номер найден, позиция: " + Позиция);
Иначе
    Сообщить("Подстрока не найдена");
КонецЕсли;

Третьим параметром функция принимает направление поиска (НаправлениеПоиска.СНачала или СКонца), четвёртым — начальную позицию, пятым — номер вхождения. Это позволяет искать второе, третье и последующие вхождения подстроки в цикле.

Типичная ошибка — сравнивать результат СтрНайти с Истина или проверять условием Если СтрНайти(...) Тогда. Функция возвращает число, поэтому корректная проверка — Если СтрНайти(Строка, Подстрока) > 0 Тогда.

Поиск элемента справочника по наименованию

Для поиска конкретного элемента справочника по точному наименованию применяется метод НайтиПоНаименованию(). Он возвращает ссылку на элемент или пустую ссылку, если элемент не найден.

bsl
НайденныйЭлемент = Справочники.Номенклатура.НайтиПоНаименованию("Кабель ВВГ 3х2.5");
Если НайденныйЭлемент.Пустая() Тогда
    Сообщить("Элемент не найден");
Иначе
    Сообщить("Найден: " + НайденныйЭлемент);
КонецЕсли;

Метод поддерживает необязательные параметры: поиск по точному соответствию (по умолчанию ищет по началу строки), отбор по родителю (группе) и по владельцу для подчинённых справочников. У метода есть три существенных ограничения.

  • Поиск идёт только по полю наименования — по артикулу, коду или ИНН нужны другие методы (НайтиПоКоду, НайтиПоРеквизиту).
  • При неточном соответствии возвращается первый найденный элемент, что при дублях наименований даёт непредсказуемый результат.
  • Если нужно искать по части наименования в любом месте строки, НайтиПоНаименованию не подходит — требуется запрос с ПОДОБНО.

Поиск по шаблону через запрос с ПОДОБНО

Самый гибкий способ поиска по строке — запрос с оператором ПОДОБНО и спецсимволами шаблона. Символ % заменяет любую последовательность символов, _ — ровно один символ.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    Сообщить(Результат.Наименование);
КонецЦикла;

Шаблон "%текст%" находит подстроку в любом месте наименования. Шаблон "текст%" ищет только по началу строки и работает заметно быстрее, поскольку может использовать индекс. Поиск с ведущим % индекс не использует и на больших справочниках (сотни тысяч записей) может выполняться секундами.

Если в искомом тексте могут встречаться сами символы % или _, их нужно экранировать с помощью ключевого слова СПЕЦСИМВОЛ, иначе шаблон сработает неправильно.

Сравнение способов поиска по строке

Выбор метода зависит от того, где находятся данные и насколько точным должно быть совпадение. Таблица ниже помогает сориентироваться.

СпособГде применяетсяТочностьОграничение
Поле поиска в форме спискаИнтерфейс, без кодаПо части строкиТолько по полям, включённым в поиск
СтрНайти()Строковые переменные в кодеПодстрока, с учётом регистраНе работает с данными базы напрямую
НайтиПоНаименованию()СправочникиТочное или по началуТолько поле наименования
Запрос с ПОДОБНОЛюбые таблицы и поляГибкий шаблонМедленно при ведущем % на больших таблицах
Полнотекстовый поискБольшие базы, несколько полейПо словам, с морфологиейТребует включения и обновления индекса
Маршрут решения

Как выбрать способ

Нужно найти подстроку в переменной внутри алгоритмаИспользуйте СтрНайти() с проверкой результата > 0
Нужна ссылка на элемент справочника по точному названиюПримените НайтиПоНаименованию() с проверкой на пустую ссылку
Нужно искать по части наименования в любом месте или по другому полюПостройте запрос с ПОДОБНО и шаблоном %текст%
Поиск идёт по нескольким полям больших таблиц и тормозитВключите и настройте полнотекстовый поиск

Полнотекстовый поиск как альтернатива

Для баз с большим объёмом данных платформа 1С предлагает механизм полнотекстового поиска. Он строит отдельный индекс по указанным полям объектов и ищет по словам с учётом морфологии русского языка: запрос «кабель» найдёт и «кабеля», и «кабелем».

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

Полнотекстовый поиск оправдан, когда пользователи регулярно ищут по нескольким текстовым полям сразу (наименование, описание, комментарий). Если поиск нужен только по наименованию справочника, обычный запрос с ПОДОБНО по началу строки проще и быстрее в поддержке.
ПЗ
Практическое замечание

Проверка результата и типичные ошибки

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

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

Частые вопросы

Как искать по строке без учёта регистра?

Для СтрНайти приведите обе строки к одному регистру: СтрНайти(ВРег(Строка), ВРег(Подстрока)). В запросах с ПОДОБНО поведение зависит от настроек СУБД: в большинстве установок MS SQL Server и PostgreSQL с типовыми параметрами сравнение регистронезависимо, но гарантировать это можно только проверкой на конкретной базе.

Как найти элемент справочника по артикулу или ИНН?

Используйте метод НайтиПоРеквизиту("Артикул", ЗначениеАртикула) — он работает для любого реквизита, у которого включено индексирование. Если индекса нет, надёжнее выполнить запрос с условием равенства по нужному полю.

Почему поле поиска в списке не находит существующий элемент?

Чаще всего поле, по которому вы ищете, не включено в состав полей поиска динамического списка. Проверьте в конфигураторе свойство «Поля поиска» у динамического списка формы. Также элемент может быть помечен на удаление или скрыт действующим отбором списка.

Чем отличается СтрНайти от устаревшей функции Найти?

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

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

В запросе добавьте конструкцию ВЫБРАТЬ ПЕРВЫЕ 100 — это ограничит выборку и ускорит выполнение. В пользовательском интерфейсе формы подбора обычно имеют собственные настройки ограничения вывода результатов.

Безопасно ли передавать ввод пользователя напрямую в запрос?

Текст запроса нельзя склеивать с пользовательским вводом конкатенацией строк — только через параметры (Запрос.УстановитьПараметр). Для ПОДОБНО дополнительно экранируйте служебные символы шаблона %, _ и [ в пользовательском вводе.

Итог

Что важно запомнить

В интерфейсе поиск по строке выполняется через поле поиска списка или Ctrl+F. В коде: СтрНайти — для подстроки в переменной, НайтиПоНаименованию — для точного поиска элемента справочника, запрос с ПОДОБНО — для гибкого шаблона. Всегда проверяйте результат на пустоту, учитывайте регистр и избегайте поиска с ведущим % на больших таблицах в рабочее время.