Как выполнить поиск строки в наименовании справочника через прямой запрос в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке сложных отчетов или обработок на платформе 1С 7.7 часто возникает необходимость использования прямых SQL-запросов для ускорения выборки данных. Одной из частых задач является реализация аналога метода НайтиПоНаименованию или оператора ПОДОБНО из 1С 8. Разберем, как правильно реализовать поиск подстроки в наименовании элемента справочника с использованием SQL.

Основные принципы использования оператора LIKE

Для поиска подстроки в SQL используется оператор LIKE. В отличие от стандартных методов 1С, этот оператор работает напрямую на стороне сервера базы данных. Чтобы найти элемент, в наименовании которого присутствует заданная строка, необходимо использовать символы подстановки (метасимволы) процента %, которые означают «любое количество любых символов».

Давайте рассмотрим базовый пример формирования такого запроса:


ТекстЗапроса = "
|SELECT
|    спрТовары.Code as Код,
|    спрТовары.ID as [Товар $Справочник.Номенклатура]
|FROM
|    $Справочник.Номенклатура as спрТовары
|WHERE
|  спрТовары.Descr LIKE '%"+СокрЛП(ТекстПоиска)+"%' 
|  OR спрТовары.Code LIKE '%"+СокрЛП(ТекстПоиска)+"%'";

В этом примере мы используем поле Descr (стандартное поле наименования в 1С 7.7) и объединяем его с поиском по коду. Обратите внимание на использование функции СокрЛП(), которая очищает строку от лишних пробелов, чтобы поиск был точным.

Почему ваш запрос может не возвращать данные?

Если вы составили запрос, но не получаете результатов, проанализируйте следующие возможные причины:

  1. Неверное поле: Убедитесь, что вы обращаетесь именно к полю Descr. В прямых запросах 1С 7.7 имена полей могут отличаться от привычных метаданных.
  2. Регистр и кодировка: В зависимости от настроек SQL-сервера, поиск может быть чувствителен к регистру (Case Sensitive). Если база настроена на строгий учет регистра, поиск «товар» и «Товар» даст разные результаты.
  3. Тип данных Unicode: Если база данных использует расширенный набор символов, иногда требуется добавление префикса N перед строковым литералом (например, N'%'+Текст+'%'), чтобы СУБД корректно интерпретировала строковые параметры.

Безопасность: предотвращение SQL-инъекций

Важнейший аспект, о котором забывают многие разработчики — это безопасность. Склеивание строк запроса с пользовательским вводом через знак + открывает возможность для SQL-инъекций. Это ситуация, когда злоумышленник вводит в поле поиска не просто слово, а SQL-команду, которая может быть выполнена сервером.

Например, ввод '1%; DROP TABLE 1SJOURN; --' может привести к печальным последствиям для вашей базы данных. Чтобы этого избежать, мы настоятельно рекомендуем:

Рекомендации по оптимизации производительности

Поиск с использованием маски LIKE '%строка%' (где процент стоит в начале) заставляет СУБД выполнять полное сканирование таблицы (Table Scan), так как индекс по полю Descr не может быть использован для поиска по подстроке, находящейся в середине или конце текста. Это нормально для справочников с небольшим количеством элементов, но на огромных таблицах (миллионы записей) это вызовет существенное замедление работы системы.

Если вы работаете с большими объемами данных, рассмотрите следующие альтернативы:

  1. Полнотекстовый поиск (Full-Text Search): Если ваша СУБД (например, MS SQL Server) поддерживает полнотекстовое индексирование, настройте его для поля Descr. Это на порядки ускорит поиск по словам.
  2. Предварительная фильтрация: Старайтесь ограничить выборку по другим критериям (например, по родителю, виду товара или дате), прежде чем применять фильтр по подстроке.

Таким образом, работа с прямыми запросами в 1С 7.7 требует внимательности не только к синтаксису самого SQL, но и к вопросам архитектурной безопасности и производительности сервера. Следуя описанным шагам, вы сможете реализовать гибкий и надежный механизм поиска в своих разработках.

← На главную