В процессе разработки часто возникает задача предоставить пользователю возможность искать элементы справочников по фрагменту текста. При этом поиск должен охватывать сразу несколько полей, например, Наименование и НаименованиеПолное. Рассмотрим, как грамотно организовать такую логику в запросах 1С, чтобы поиск работал корректно и масштабируемо.
Когда мы используем оператор ПОДОБНО в связке с ИЛИ, важно помнить о приоритете логических операций и правильности синтаксиса. Автор темы столкнулся с тем, что запрос не возвращал ожидаемые данные, хотя синтаксически конструкция выглядела верной. Основная причина таких проблем обычно кроется либо в наличии лишних пробелов в данных, либо в некорректном оформлении групп условий в запросе.
Для того чтобы поиск работал по любому из полей, мы должны четко сгруппировать условия. Давайте проанализируем базовый пример реализации:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("пНаименование", "%" + СокрЛП(ЗначениеПоиска) + "%");
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| (Номенклатура.Наименование ПОДОБНО &пНаименование)
| ИЛИ (Номенклатура.НаименованиеПолное ПОДОБНО &пНаименование)";
Результат = Запрос.Выполнить().Выгрузить();
При расширении функционала и добавлении новых полей, например, по коду или артикулу, крайне важно оборачивать каждое условие в скобки. Если вы планируете добавить другие фильтры (например, отбор по группе или статусу записи), без скобок логика ИЛИ может нарушить работу всего запроса, объединив несвязанные логические блоки.
Рассмотрим структуру запроса для поиска по трем полям:
// Правильная структура с группировкой условий
ГДЕ
(Наименование ПОДОБНО &Параметр)
ИЛИ (НаименованиеПолное ПОДОБНО &Параметр)
ИЛИ (Артикул ПОДОБНО &Параметр)
СокрЛП() для строки поиска, переданной от пользователя. Это исключает влияние случайных пробелов по краям строки, которые часто приводят к тому, что ПОДОБНО не находит совпадений.ПОДОБНО воспринимает символы %, _, [ и ] как служебные. Если пользователь ввел их в строку поиска, запрос может выдать ошибку или неверный результат. Если вы ожидаете ввода таких символов, их необходимо экранировать в коде.Номенклатура содержит сотни тысяч записей, использование ПОДОБНО может существенно замедлить работу системы, так как база данных будет вынуждена сканировать каждое поле (Table Scan). В таких случаях мы настоятельно рекомендуем использовать ПолнотекстовыйПоиск, который работает гораздо быстрее за счет использования индексов и поддерживает морфологию (поиск по разным формам слов).Если вы столкнулись с ситуацией, когда данные в базе точно есть, а запрос их не находит, выполните следующие шаги:
Сообщить(Запрос.Текст) и проверьте, как сформировались параметры.ПОДОБНО.Следуя этим простым правилам, вы сможете организовать надежный и быстрый поиск, который будет удобно поддерживать и расширять в будущем. Совместными усилиями мы разобрали, что даже самая простая задача требует внимательного отношения к синтаксису запросов и особенностям работы с индексированными данными в 1С.