Как использовать конкатенацию со строками и оператор ПОДОБНО в запросах 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разница между консолью запросов и программным кодом

Рассмотрим типичную ситуацию: вам необходимо найти данные в справочнике по частичному совпадению, используя поле из другой таблицы. Проанализируем пример запроса, который успешно работает в консоли:


ВЫБРАТЬ
    ДанныеСправочника.Ссылка КАК Контрагент
ИЗ
    ТаблицаДокументов КАК ТаблицаДокументов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК ДанныеСправочника
    ПО ДанныеСправочника.ИНН ПОДОБНО "%" + ТаблицаДокументов.ИНН

В консоли запросов вы пишете текст «как есть». Однако, когда этот же текст переносится в модуль 1С, он сам становится строковым литералом, который заключается в кавычки. Здесь и кроется главная проблема. Выясним причину ошибки: в языке 1С, чтобы вставить символ кавычки внутрь строки, его необходимо удваивать. Если вы просто скопируете текст из консоли, конфигуратор воспримет кавычку перед символом процента как окончание текста запроса, что приведет к ошибке синтаксиса.

Правильный вариант написания в коде модуля выглядит так:


ТекстЗапроса = "ВЫБРАТЬ
               |    ДанныеСправочника.Ссылка
               |ИЗ
               |    ВременнаяТаблица КАК ТаблицаДокументов
               |ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК ДанныеСправочника
               |    ПО ДанныеСправочника.ИНН ПОДОБНО ""%"" + ТаблицаДокументов.ИНН";

Обратите внимание на конструкцию ""%"". Именно удвоение кавычек позволяет платформе понять, что это символ внутри строки, а не конец команды.

Ограничения платформы и версии 1С

Важно помнить, что возможность складывать строки (использовать +) непосредственно внутри тела запроса появилась не сразу. Рассмотрим исторический контекст: данная функциональность была добавлена в платформу 1С:Предприятие 8.3.6. Если ваша конфигурация работает на более старой версии платформы или в режиме совместимости с версиями ниже 8.3.6, использование оператора + в запросе будет вызывать ошибку вне зависимости от количества кавычек.

В таких случаях рекомендуется готовить шаблон поиска заранее в коде на языке 1С и передавать его в запрос через параметр:


ШаблонПоиска = "%" + ИскомоеЗначение;
Запрос.УстановитьПараметр("ШаблонПоиска", ШаблонПоиска);
Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты ГДЕ ИНН ПОДОБНО &ШаблонПоиска";

Проблема производительности: почему ИТС считает это плохим вариантом?

Проанализируем ситуацию с точки зрения производительности базы данных. Использование конструкции ПОДОБНО "%" + Таблица.Поле считается «тяжелой» операцией. Разберем по шагам, что происходит на стороне СУБД (SQL Server, PostgreSQL):

  1. Потеря индекса (SARGability): Индексы в базах данных строятся слева направо. Если символ подстановки % стоит в начале строки, СУБД не может использовать индекс по полю ИНН. Системе придется выполнить полное сканирование таблицы (Full Table Scan), чтобы проверить каждую запись на соответствие условию.
  2. Вычисления в соединении: Когда конкатенация используется в условии ПО (при соединении таблиц), СУБД вынуждена вычислять новое строковое значение для каждой комбинации строк из обеих таблиц. На больших объемах данных это приведет к катастрофическому падению скорости выполнения запроса.
  3. Типы данных: Оператор + в запросах работает исключительно со строковыми типами данных. Если одно из полей имеет тип Число, запрос упадет с ошибкой. Проверьте, что ИНН в вашем справочнике и во временной таблице — это именно строки.

Как сделать поиск правильно?

Если вам все же необходимо выполнить подобное соединение, рассмотрим несколько советов по оптимизации:

  1. Минимизируйте выборку: Перед выполнением соединения по ПОДОБНО, максимально отфильтруйте данные во временных таблицах по другим, более простым критериям (например, по дате или организации).
  2. Используйте параметры: Если поиск идет по одному значению, всегда лучше собрать строку поиска в коде 1С и передать ее как параметр &Параметр. Это избавит вас от проблем с кавычками и сделает запрос более читаемым.
  3. Полнотекстовый поиск: Если задача стоит шире, чем просто сравнение ИНН (например, поиск по наименованию), рассмотрите возможность использования механизмов полнотекстового поиска 1С.
  4. Ограничение длины: Если вы работаете со строками неограниченной длины, обязательно используйте функцию ВЫРАЗИТЬ(Поле КАК СТРОКА(100)), так как оператор ПОДОБНО не работает с полями неограниченной длины напрямую.

Заключение

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

← На главную