При разработке сложных отчетов или обработок на платформе 1С 7.7 часто возникает необходимость использования прямых SQL-запросов для ускорения выборки данных. Одной из частых задач является реализация аналога метода НайтиПоНаименованию или оператора ПОДОБНО из 1С 8. Разберем, как правильно реализовать поиск подстроки в наименовании элемента справочника с использованием SQL.
Для поиска подстроки в SQL используется оператор LIKE. В отличие от стандартных методов 1С, этот оператор работает напрямую на стороне сервера базы данных. Чтобы найти элемент, в наименовании которого присутствует заданная строка, необходимо использовать символы подстановки (метасимволы) процента %, которые означают «любое количество любых символов».
Давайте рассмотрим базовый пример формирования такого запроса:
ТекстЗапроса = "
|SELECT
| спрТовары.Code as Код,
| спрТовары.ID as [Товар $Справочник.Номенклатура]
|FROM
| $Справочник.Номенклатура as спрТовары
|WHERE
| спрТовары.Descr LIKE '%"+СокрЛП(ТекстПоиска)+"%'
| OR спрТовары.Code LIKE '%"+СокрЛП(ТекстПоиска)+"%'";
В этом примере мы используем поле Descr (стандартное поле наименования в 1С 7.7) и объединяем его с поиском по коду. Обратите внимание на использование функции СокрЛП(), которая очищает строку от лишних пробелов, чтобы поиск был точным.
Если вы составили запрос, но не получаете результатов, проанализируйте следующие возможные причины:
Descr. В прямых запросах 1С 7.7 имена полей могут отличаться от привычных метаданных.N перед строковым литералом (например, N'%'+Текст+'%'), чтобы СУБД корректно интерпретировала строковые параметры.Важнейший аспект, о котором забывают многие разработчики — это безопасность. Склеивание строк запроса с пользовательским вводом через знак + открывает возможность для SQL-инъекций. Это ситуация, когда злоумышленник вводит в поле поиска не просто слово, а SQL-команду, которая может быть выполнена сервером.
Например, ввод '1%; DROP TABLE 1SJOURN; --' может привести к печальным последствиям для вашей базы данных. Чтобы этого избежать, мы настоятельно рекомендуем:
УстановитьТекстовыйПараметр. При таком подходе СУБД воспринимает данные только как текст, а не как исполняемый код.% и _. Если пользователь введет их в строку поиска, они будут восприняты как команды. Для поиска самих этих символов в тексте используйте конструкцию ESCAPE.Поиск с использованием маски LIKE '%строка%' (где процент стоит в начале) заставляет СУБД выполнять полное сканирование таблицы (Table Scan), так как индекс по полю Descr не может быть использован для поиска по подстроке, находящейся в середине или конце текста. Это нормально для справочников с небольшим количеством элементов, но на огромных таблицах (миллионы записей) это вызовет существенное замедление работы системы.
Если вы работаете с большими объемами данных, рассмотрите следующие альтернативы:
Descr. Это на порядки ускорит поиск по словам.Таким образом, работа с прямыми запросами в 1С 7.7 требует внимательности не только к синтаксису самого SQL, но и к вопросам архитектурной безопасности и производительности сервера. Следуя описанным шагам, вы сможете реализовать гибкий и надежный механизм поиска в своих разработках.