Разработка и Конфигурация · 12 мин
Как в запросе 1С указать условие «Содержит»
Как в запросе 1С проверить, что строка содержит подстроку: оператор ПОДОБНО, шаблоны % и _, экранирование, параметры, поиск по наименованию и типичные ошибки.
В языке запросов 1С нет функции с названием «Содержит», как в СКД или встроенном языке. Проверка вхождения подстроки выполняется оператором ПОДОБНО (английский синоним — LIKE) с использованием шаблонных символов. Если нужно отобрать контрагентов, у которых в наименовании встречается слово «Ромашка», условие выглядит так: Наименование ПОДОБНО "%Ромашка%".
Оператор ПОДОБНО работает только со строковыми значениями и поддерживается во всех современных версиях платформы 1С:Предприятие 8.3. Он применяется в секции ГДЕ (WHERE), в условиях соединений, в параметрах виртуальных таблиц и в конструкторе запроса. Понимание его синтаксиса и ограничений избавляет от типичных ошибок: пустых выборок, неожиданно медленных запросов и некорректного экранирования спецсимволов.
Ниже разобраны шаблонные символы, работа с параметрами, регистрозависимость, отрицание условия, альтернативные способы поиска и проверка результата на реальных примерах кода.
Синтаксис оператора ПОДОБНО
Общая форма записи: Выражение ПОДОБНО Шаблон [СПЕЦСИМВОЛ "символ"]. Выражение — строковое поле, шаблон — строка, в которой обычные символы сравниваются как есть, а специальные символы задают гибкие правила совпадения.
Простейший пример — отбор контрагентов, в наименовании которых есть заданное слово:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Наименование ПОДОБНО "%Ромашка%"
Знаки процента по краям означают: совпадение ищется в любой позиции строки — в начале, в середине или в конце. Без них оператор сработал бы как точное сравнение полного значения.
Шаблонные символы и их комбинации
Поведение оператора определяется набором спецсимволов в шаблоне. Всего их несколько, но комбинации позволяют строить достаточно точные условия.
| Символ | Значение | Пример шаблона | Что найдёт |
|---|---|---|---|
| % | Любая последовательность любой длины, включая пустую | "%Иванов%" | «Иванов», «Иванов И.И.», «ООО Иванов-Плюс» |
| _ | Ровно один любой символ | "Ивано_" | «Иванов», «Иванов2», но не «Иванова» |
| [...] | Один символ из перечисленных | "Ивано[вф]" | «Иванов», «Иваноф» |
| [^...] | Один символ, кроме перечисленных | "Ивано[^в]" | «Иванон», но не «Иванов» |
| [а-я] | Один символ из диапазона | "Код[0-9]" | «Код1», «Код5», но не «КодА» |
Типовые сценарии с процентом: шаблон "ООО%" — строка начинается с «ООО»; шаблон "%снт" — строка заканчивается на «снт»; шаблон "%склад%" — подстрока встречается где угодно. Именно последний вариант и есть эквивалент условия «содержит».
Поиск по параметру: «содержит введённый текст»
На практике искомая строка почти всегда приходит извне — из поля ввода на форме, из отбора динамического списка, из настроек отчёта. В этом случае шаблон собирается конкатенацией с параметром:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО ""%"" + &СтрокаПоиска + ""%""";
Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоиска);
Результат = Запрос.Выполнить().Выгрузить();
Обратите внимание на двойные кавычки внутри текста запроса: в литерале встроенного языка они удваиваются. Если текст запроса пишется в консоли запросов или конструкторе, удвоение не нужно — там пишется чистый язык запросов.
Если пользователь ввёл пустую строку, условие превращается в ПОДОБНО "%%", что совпадает с любым непустым значением и фактически отключает фильтр. Иногда это желаемое поведение, иногда — источник лишней нагрузки: запрос вернёт всю таблицу. Лучше явно проверять параметр до выполнения запроса и либо не выполнять его вовсе, либо убирать условие из текста.
- 1Определите строковое поле, по которому ведётся поиск (например, Наименование).
- 2Добавьте в секцию ГДЕ условие: Поле ПОДОБНО "%" + &Параметр + "%".
- 3Передайте параметр через УстановитьПараметр до вызова Выполнить().
- 4Выполните запрос в консоли запросов и проверьте, что выборка содержит ожидаемые записи.
- 5Проверьте граничные случаи: пустой параметр, параметр со спецсимволами % и _.
Регистрозависимость и национальные настройки
Оператор ПОДОБНО в 1С регистронезависим для букв: шаблон "%ромашка%" найдёт и «Ромашка», и «РОМАШКА». Это справедливо для типовых настроек большинства СУБД, используемых с 1С. Однако поведение зависит от collation (параметров сортировки) базы данных.
Если база развёрнута на SQL Server с регистрозависимым collation (например, при нестандартной установке), сравнение может стать чувствительным к регистру, и привычные запросы перестанут находить часть данных. Признак проблемы: один и тот же запрос в файловой копии базы и на сервере возвращает разные результаты.
Надёжный способ исключить влияние регистра — привести обе стороны к одному регистру функцией ВРЕГ или НРЕГ:
ГДЕ
ВРЕГ(Контрагенты.Наименование) ПОДОБНО ВРЕГ("%" + &СтрокаПоиска + "%")
У этого приёма есть цена: функция над полем отключает использование индекса, и по большой таблице запрос пойдёт полным сканированием. На справочнике в несколько тысяч записей это незаметно, на миллионах — уже ощутимо.
Отрицание: отобрать записи, которые НЕ содержат текст
Обратное условие строится ключевым словом НЕ перед оператором:
ГДЕ
НЕ Номенклатура.Наименование ПОДОБНО "%архив%"
Такой отбор часто используют, чтобы исключить служебные элементы: помеченные на удаление группы, тестовые карточки с префиксом «тест», архивные позиции. Важный нюанс — значения NULL. Если поле может быть NULL (например, при левом соединении), то для таких записей условие ПОДОБНО вернёт не ИСТИНА и не ЛОЖЬ, а NULL, и запись не попадёт в результат ни при прямом, ни при отрицательном условии.
Чтобы не потерять строки с NULL, добавьте явную проверку:
ГДЕ
НЕ ЕСТЬNULL(Товары.Комментарий, "") ПОДОБНО "%брак%"
Экранирование спецсимволов в искомом тексте
Если пользователь ищет строку, в которой буквально встречается символ процента или подчёркивания (например, «скидка 10%»), ПОДОБНО воспримет их как шаблонные и результат окажется неверным. Для таких случаев предусмотрено предложение СПЕЦСИМВОЛ:
ГДЕ
Товары.Наименование ПОДОБНО "%~%%" СПЕЦСИМВОЛ "~"
Здесь тильда объявлена экранирующим символом, и сочетание ~% означает буквальный знак процента. Перед подстановкой пользовательского ввода в шаблон программно заменяйте в нём экранирующий символ, % и _ на экранированные варианты — иначе поиск по тексту со спецсимволами будет работать непредсказуемо.
Экранированная = СтрЗаменить(СтрокаПоиска, "~", "~~");
Экранированная = СтрЗаменить(Экранированная, "%", "~%");
Экранированная = СтрЗаменить(Экранированная, "_", "~_");
// В запросе: ПОДОБНО "%" + &Текст + "%" СПЕЦСИМВОЛ "~"Альтернативы ПОДОБНО и выбор способа поиска
ПОДОБНО — не единственный способ найти записи по части строки. В зависимости от задачи лучше подходят другие механизмы.
Полнотекстовый поиск (при включённом полнотекстовом индексировании) работает быстрее на больших объёмах и поддерживает морфологию, но требует настройки индекса и обновляется с задержкой. Строковые функции ПОДСТРОКА и ЛЕВ позволяют сравнивать начало строки, что иногда заменяет шаблон "текст%" с сохранением индекса. В динамических списках отбор «содержит» можно задать декларативно через настройки компоновки, не меняя текст запроса.
Сравнение способов поиска подстроки
Универсально, работает везде. Не использует индекс при ведущем % — медленно на больших таблицах.
Поиск по началу строки. Может использовать индекс — подходит для автоподстановки в полях ввода.
Быстрый поиск по словам с морфологией на больших объёмах. Требует включения и обновления индекса, не ищет подстроки внутри слова.
Не требует изменения запроса, настраивается пользователем. Работает только в списках и отчётах на СКД.
Типичные ошибки и проверка результата
Большинство проблем с ПОДОБНО сводятся к нескольким повторяющимся сценариям. Знание их экономит время отладки.
Отладку удобно вести в консоли запросов: вставьте текст запроса, задайте параметры вручную и выполните. Если результат пустой, первым делом уберите условие ПОДОБНО и проверьте, что остальная часть запроса возвращает данные — так вы локализуете проблему.
Как проверить результат
Возвращаются записи, где подстрока есть в любой позиции поля
Пустая выборка при заведомо существующих данных — проверьте % в шаблоне и регистр
Пустая строка и строка со спецсимволами обрабатываются предсказуемо
Пустой параметр возвращает всю таблицу, спецсимволы ломают поиск
Запрос отрабатывает быстро, сопоставимо с другими отборами
Заметная пауза — условие идёт полным сканированием, добавьте отбор по индексированным полям
FAQ
Есть ли в запросе 1С функция СОДЕРЖИТ, как в СКД?
Нет, в языке запросов такой функции нет. Вид сравнения «Содержит» существует в отборах компоновки данных и динамических списков, но внутри запроса его эквивалент — оператор ПОДОБНО с шаблоном "%текст%". При генерации запроса СКД платформа сама преобразует «Содержит» в ПОДОБНО.
Как искать по нескольким словам одновременно?
Стандартный ПОДОБНО работает с одним шаблоном. Для поиска записей, содержащих каждое из слов, разбейте строку на слова во встроенном языке и сформируйте несколько условий, соединённых И. Для поиска «хотя бы одно из слов» соединяйте условия через ИЛИ. При большом числе слов удобнее собирать текст запроса программно в цикле.
Почему ПОДОБНО не находит значение, которое точно есть в базе?
Чаще всего причины: отсутствуют % по краям шаблона, в поле есть неразрывные пробелы или невидимые символы, параметр передан с лишними пробелами, либо база использует регистрозависимое сравнение. Проверьте значение функцией СОКРЛП и попробуйте шаблон с ВРЕГ с обеих сторон.
Можно ли применить ПОДОБНО к числовому полю?
Напрямую — нет, оператор работает только со строками. Для поиска по коду или номеру документа, которые имеют строковый тип, ПОДОБНО подходит. Если тип числовой, сначала преобразуйте значение функцией ВЫРАЗИТЬ или сравнивайте как число обычными операторами.
Как сделать отбор «содержит» в динамическом списке без изменения запроса?
Откройте настройки списка (Ещё — Настроить список), добавьте отбор по нужному полю и выберите вид сравнения «Содержит». Платформа сама сформирует условие ПОДОБНО. Программно то же делается через коллекцию Отбор элементов настроек компоновки данных списка.
Влияет ли ПОДОБНО на производительность запроса?
Да, существенно. Шаблон с ведущим процентом ("%текст%") не позволяет использовать индекс, и СУБД просматривает всю таблицу. Шаблон "текст%" (поиск по началу строки) индекс использовать может. На больших таблицах комбинируйте поиск по подстроке с отборами по индексированным полям или переходите на полнотекстовый поиск.
Что важно запомнить
Условие «содержит» в запросе 1С — это ПОДОБНО с шаблоном "%текст%". Параметр подставляйте конкатенацией "%" + &Параметр + "%", спецсимволы экранируйте через СПЕЦСИМВОЛ, NULL обрабатывайте через ЕСТЬNULL. На больших таблицах избегайте ведущего % без дополнительных отборов — такой запрос не использует индекс.