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