При работе с запросами в системе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда запрос идеально отрабатывает в консоли запросов, но при переносе в программный модуль (в конфигуратор) выдает ошибку синтаксиса. Одной из самых коварных тем в этом плане является использование оператора ПОДОБНО совместно с конкатенацией строк (сложением строк с помощью оператора +). В данной статье мы подробно разберем, как правильно писать такие запросы, почему возникают ошибки и как сделать поиск по строке эффективным.
Рассмотрим типичную ситуацию: вам необходимо найти данные в справочнике по частичному совпадению, используя поле из другой таблицы. Проанализируем пример запроса, который успешно работает в консоли:
ВЫБРАТЬ
ДанныеСправочника.Ссылка КАК Контрагент
ИЗ
ТаблицаДокументов КАК ТаблицаДокументов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК ДанныеСправочника
ПО ДанныеСправочника.ИНН ПОДОБНО "%" + ТаблицаДокументов.ИНН
В консоли запросов вы пишете текст «как есть». Однако, когда этот же текст переносится в модуль 1С, он сам становится строковым литералом, который заключается в кавычки. Здесь и кроется главная проблема. Выясним причину ошибки: в языке 1С, чтобы вставить символ кавычки внутрь строки, его необходимо удваивать. Если вы просто скопируете текст из консоли, конфигуратор воспримет кавычку перед символом процента как окончание текста запроса, что приведет к ошибке синтаксиса.
Правильный вариант написания в коде модуля выглядит так:
ТекстЗапроса = "ВЫБРАТЬ
| ДанныеСправочника.Ссылка
|ИЗ
| ВременнаяТаблица КАК ТаблицаДокументов
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК ДанныеСправочника
| ПО ДанныеСправочника.ИНН ПОДОБНО ""%"" + ТаблицаДокументов.ИНН";
Обратите внимание на конструкцию ""%"". Именно удвоение кавычек позволяет платформе понять, что это символ внутри строки, а не конец команды.
Важно помнить, что возможность складывать строки (использовать +) непосредственно внутри тела запроса появилась не сразу. Рассмотрим исторический контекст: данная функциональность была добавлена в платформу 1С:Предприятие 8.3.6. Если ваша конфигурация работает на более старой версии платформы или в режиме совместимости с версиями ниже 8.3.6, использование оператора + в запросе будет вызывать ошибку вне зависимости от количества кавычек.
В таких случаях рекомендуется готовить шаблон поиска заранее в коде на языке 1С и передавать его в запрос через параметр:
ШаблонПоиска = "%" + ИскомоеЗначение;
Запрос.УстановитьПараметр("ШаблонПоиска", ШаблонПоиска);
Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты ГДЕ ИНН ПОДОБНО &ШаблонПоиска";
Проанализируем ситуацию с точки зрения производительности базы данных. Использование конструкции ПОДОБНО "%" + Таблица.Поле считается «тяжелой» операцией. Разберем по шагам, что происходит на стороне СУБД (SQL Server, PostgreSQL):
% стоит в начале строки, СУБД не может использовать индекс по полю ИНН. Системе придется выполнить полное сканирование таблицы (Full Table Scan), чтобы проверить каждую запись на соответствие условию.ПО (при соединении таблиц), СУБД вынуждена вычислять новое строковое значение для каждой комбинации строк из обеих таблиц. На больших объемах данных это приведет к катастрофическому падению скорости выполнения запроса.+ в запросах работает исключительно со строковыми типами данных. Если одно из полей имеет тип Число, запрос упадет с ошибкой. Проверьте, что ИНН в вашем справочнике и во временной таблице — это именно строки.Если вам все же необходимо выполнить подобное соединение, рассмотрим несколько советов по оптимизации:
ПОДОБНО, максимально отфильтруйте данные во временных таблицах по другим, более простым критериям (например, по дате или организации).&Параметр. Это избавит вас от проблем с кавычками и сделает запрос более читаемым.ВЫРАЗИТЬ(Поле КАК СТРОКА(100)), так как оператор ПОДОБНО не работает с полями неограниченной длины напрямую.Мы выяснили, что основной причиной ошибок при использовании конкатенации в запросе является путаница с кавычками в программном коде. Используйте конструкцию ""%"" для строковых литералов и не забывайте о версии платформы. Однако всегда помните о производительности: поиск с процентом в начале строки — это крайняя мера, которую стоит избегать на высоконагруженных системах или больших справочниках.