При разработке механизмов поиска в системе 1С:Предприятие часто возникает задача найти данные, которые содержат не одно конкретное слово, а сразу несколько (логическое "И"). Стандартный оператор ПОДОБНО (LIKE) в языке запросов позволяет эффективно решать эту задачу, однако существует несколько подходов, каждый из которых имеет свои преимущества и ограничения — есть обработка расширенного поиска для 1С. Разберем подробно, как правильно составить запрос для поиска по тексту.
Это самый надежный и распространенный способ. Мы создаем отдельное условие для каждого слова, которое должен содержать текст. Проанализируем ситуацию: если нам нужно найти строку, где есть и «золото», и «айфон», мы должны убедиться, что оба подстрочных вхождения присутствуют в поле, независимо от их порядка — для этого подойдёт обработка быстрого поиска по фрагментам и раскладке.
Рассмотрим пример построения запроса в конфигураторе:
ВЫБРАТЬ
Товары.Наименование КАК Наименование
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Наименование ПОДОБНО &Текст1
И Товары.Наименование ПОДОБНО &Текст2
В коде 1С параметры для этого запроса нужно подготовить следующим образом, добавив символы процента % с обеих сторон:
Запрос.УстановитьПараметр("Текст1", "%золото%");
Запрос.УстановитьПараметр("Текст2", "%айфон%");
Преимущество: Слова могут идти в любом порядке — "Золотой айфон" или "Айфон в золоте" будут найдены одинаково успешно.
Иногда программисты пытаются упростить запрос и передать все слова в один параметр, используя конструкцию %золото%айфон%. Выясним причину, почему это не всегда эффективно: такой запрос найдет только те строки, где слово «золото» стоит перед словом «айфон».
Если же вы хотите использовать этот метод, но учитывать разный порядок, придется использовать оператор ИЛИ, что значительно усложняет конструкцию при увеличении количества слов:
ГДЕ
Таблица.Поле ПОДОБНО "%золото%айфон%"
ИЛИ Таблица.Поле ПОДОБНО "%айфон%золото%"
Для трех слов количество комбинаций возрастет в геометрической прогрессии, поэтому данный метод рекомендуется только в тех случаях, когда порядок слов строго определен (например, при поиске по артикулу или специфическому шаблону).
В реальных задачах мы часто не знаем заранее, сколько слов введет пользователь в строку поиска. В этом случае программно разберем строку на массив слов (удобно через инструмент разбора наименований на ключевые слова) и динамически сформируем текст запроса. Посмотрим на пример реализации такого алгоритма:
ТекстПоиска = "золото айфон скидка";
МассивСлов = СтрРазделить(ТекстПоиска, " ", Ложь);
ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ ";
Для Сч = 0 По МассивСлов.Количество() - 1 Цикл
ИмяПараметра = "П" + Сч;
ТекстЗапроса = ТекстЗапроса + (Если Сч > 0 Тогда " И " Иначе "") + "Наименование ПОДОБНО &" + ИмяПараметра;
Запрос.УстановитьПараметр(ИмяПараметра, "%" + МассивСлов[Сч] + "%");
КонецЦикла;
Этот подход является наиболее профессиональным, так как он гибок и позволяет обрабатывать любое количество условий поиска.
Бывают случаи, когда само слово для поиска содержит технические символы 1С, такие как %, _ или [. Чтобы СУБД восприняла их как обычный текст, а не как команду маски, воспользуемся конструкцией СПЕЦСИМВОЛ. Рассмотрим подробнее:
Предположим, нам нужно найти строку "Скидка 10%". Запрос будет выглядеть так:
ГДЕ
Таблица.Поле ПОДОБНО "%10#% %" СПЕЦСИМВОЛ "#"
Здесь символ # указывает, что следующий за ним символ процента является частью текста, а не оператором поиска.
Важно помнить о производительности. Использование ПОДОБНО с процентом в начале строки (%Слово%) приводит к полному сканированию таблицы (Full Scan), так как стандартные индексы СУБД не могут быть задействованы — поможет анализ производительности и выявление долгих запросов. Если в вашей таблице сотни тысяч записей, такой поиск будет работать медленно.
Практические советы по оптимизации:
Слово%). В этом случае 1С сможет использовать индекс по полю, и запрос выполнится мгновенно.ПолнотекстовыйПоиск. Он работает по принципу поисковых систем (Яндекс, Google), поддерживает морфологию и работает значительно быстрее оператора ПОДОБНО.Подводя итог, для реализации качественного поиска по нескольким словам в запросе 1С оптимальным является комбинирование условий через оператор И с динамическим формированием текста запроса — решается через расширение для переопределения стандартного поиска в формах. Это обеспечивает точность результатов и гибкость при работе с пользовательским вводом.