Поиск по части строки в запросах 1С 8.3 через оператор ПОДОБНО

· 9 мин

Содержание

Чтобы в запросе 1С найти строки по части текста, пишут условие Поле ПОДОБНО "%текст%". Знак % заменяет любое количество символов, _ — ровно один символ. Шаблон лучше передавать параметром: ГДЕ Номенклатура.Наименование ПОДОБНО &Шаблон, а проценты добавлять в коде перед УстановитьПараметр.

Это аналог LIKE из SQL, но со своими правилами: служебное слово СПЕЦСИМВОЛ вместо ESCAPE, особенности регистра, строк неограниченной длины и индексов. Всё это — дальше, с готовыми примерами запросов, которые можно копировать в консоль.

Синтаксис ПОДОБНО в запросе 1С

Общая форма условия:

<Выражение> ПОДОБНО <Шаблон> [СПЕЦСИМВОЛ <Символ>]
  • 📝 Выражение — строковое поле или строковое выражение: Наименование, Контрагенты.ИНН, Документ.Комментарий.
  • 🧩 Шаблон — строка с символами подстановки. Надёжные варианты — строковый литерал в кавычках или параметр &Шаблон.
  • 🔑 СПЕЦСИМВОЛ — необязательная часть. Задаёт символ, который отменяет особое значение %, _ и скобок.

Английский вариант ключевого слова — LIKE, а СПЕЦСИМВОЛ пишется как ESCAPE. Язык запросов принимает оба написания, их можно даже смешивать, но в одном проекте лучше держать один стиль.

Простейший запрос: все контрагенты, в названии которых встречается «сервис».

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

Отрицание пишут через НЕ перед всем условием: НЕ Контрагенты.Наименование ПОДОБНО "%сервис%". Так запрос вернёт всех, у кого этого слова в названии нет.

ПОДОБНО работает в секциях ГДЕ и ИМЕЮЩИЕ, в условиях соединения и внутри ВЫБОР КОГДА. Последнее удобно, чтобы пометить строки прямо в выборке:

ВЫБОР
	КОГДА Номенклатура.Наименование ПОДОБНО "%услуга%"
		ТОГДА "Услуга"
	ИНАЧЕ "Товар"
КОНЕЦ КАК ВидПозиции

В конструкторе запроса условие задают на вкладке Условия: включают флажок произвольного условия и вписывают выражение с ПОДОБНО вручную.

Символы подстановки и СПЕЦСИМВОЛ в шаблоне

Шаблон ПОДОБНО понимает четыре конструкции. Остальные символы сравниваются как есть.

КонструкцияЧто означаетПример шаблонаПодходитНе подходит
%любая последовательность символов, в том числе пустая"Счет%"Счет, Счет-фактураМой счет
_ровно один любой символ"ООО _"ООО АООО АБ
[...]один символ из списка или диапазона"[АБВ]%"Альфа, ВегаГамма
[^...]один символ, которого нет в списке"[^0-9]%"А-123123-А

Диапазоны внутри скобок пишут через дефис: [0-9], [А-Я], [a-z]. Можно комбинировать: [0-9A-F] — одна шестнадцатеричная цифра.

Несколько полезных шаблонов:

  • 🔍 "%молоко%" — слово в любом месте строки;
  • ▶️ "Молоко%" — строка начинается со слова;
  • ⏹ "%кг" — строка заканчивается на «кг»;
  • 🔢 "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" — ровно 10 цифр, например ИНН организации;
  • 🧾 "%[^0-9]%" — в строке есть хотя бы один нецифровой символ (удобно для поиска кривых ИНН и телефонов).

Как найти сам знак процента или подчёркивания

Если в тексте нужно найти буквально %, _ или [, их экранируют. Выбирают любой символ, которого точно нет в данных, и объявляют его через СПЕЦСИМВОЛ:

ГДЕ
	Номенклатура.Наименование ПОДОБНО "%100~%%" СПЕЦСИМВОЛ "~"

Здесь ~% — это настоящий знак процента, а последний % — снова «любые символы». Запрос найдёт «Сок 100% яблочный», но не «Сок 1000 мл».

Тильда ~ и обратная косая \ — популярные спецсимволы. Сам спецсимвол в тексте ищут, удвоив его: ~~.

ПОДОБНО или строковые функции запроса

До платформы 8.3.20 у языка запросов почти не было строковых функций: была ПОДСТРОКА, а для поиска по тексту оставался только ПОДОБНО. Начиная с 8.3.20 в запросах доступны СТРНАЙТИ, СТРДЛИНА, ЛЕВ, ПРАВ, ВРЕГ, НРЕГ, СОКРЛП, СТРЗАМЕНИТЬ и другие. Часть задач теперь решается двумя способами.

ЗадачаЧерез ПОДОБНОЧерез функции (8.3.20 и новее)Что выбрать
Строка содержит текстПоле ПОДОБНО "%abc%"СТРНАЙТИ(Поле, "abc") > 0ПОДОБНО: работает на любой 8.3
Начинается с текстаПоле ПОДОБНО "abc%"ЛЕВ(Поле, 3) = "abc"ПОДОБНО: может использовать индекс
Заканчивается текстомПоле ПОДОБНО "%abc"ПРАВ(Поле, 3) = "abc"равноценно
Проверка формата (цифры, буквы)[0-9], [^...]неудобно, нужны цепочкитолько ПОДОБНО
Позиция подстроки, её вырезаниенельзяСТРНАЙТИ, ПОДСТРОКАфункции
Ровно N символов"_____"СТРДЛИНА(Поле) = 5функции читаются проще

Короткое правило: ПОДОБНО отвечает на вопрос «подходит ли строка под маску». Функции нужны, когда со строкой надо что-то сделать: узнать длину, вырезать кусок, заменить символы.

Комбинировать тоже можно. Например, убрать пробелы по краям и проверить формат: СОКРЛП(Контрагенты.ИНН) ПОДОБНО "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]".

Если конфигурация должна работать на платформах старше 8.3.20 или в режиме совместимости ниже этой версии, строковые функции запроса недоступны. ПОДОБНО в таком случае — единственный вариант.

Шаблон в параметре: поиск по тексту пользователя

На практике строку для поиска вводит пользователь: в поле отбора, в обработке, в форме подбора. Вставлять её в текст запроса склейкой нельзя — кавычка во вводе сломает запрос. Правильный путь — параметр.

Базовый вариант

Запрос = Новый Запрос;
Запрос.Текст =
	"ВЫБРАТЬ
	|	Номенклатура.Ссылка,
	|	Номенклатура.Наименование
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Наименование ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");
Результат = Запрос.Выполнить().Выбрать();

Проценты добавляются в коде, поэтому одним и тем же текстом запроса легко искать «содержит» ("%" + Текст + "%") и «начинается с» (Текст + "%").

Экранирование ввода

Если пользователь введёт 50% или art_12, символы % и _ сработают как маска, и выборка окажется шире, чем он ждал. Поэтому ввод перед поиском экранируют и в запросе добавляют СПЕЦСИМВОЛ.

Функция ЭкранироватьДляПодобно(Знач Текст, Спецсимвол = "~")
	
	// Сначала удваиваем сам спецсимвол, иначе он испортит следующие замены
	Результат = СтрЗаменить(Текст, Спецсимвол, Спецсимвол + Спецсимвол);
	Результат = СтрЗаменить(Результат, "%", Спецсимвол + "%");
	Результат = СтрЗаменить(Результат, "_", Спецсимвол + "_");
	Результат = СтрЗаменить(Результат, "[", Спецсимвол + "[");
	Результат = СтрЗаменить(Результат, "]", Спецсимвол + "]");
	
	Возврат Результат;
	
КонецФункции

Текст запроса меняется в одном месте:

|ГДЕ
|	Номенклатура.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ ""~""

А параметр устанавливают так:

Шаблон = "%" + ЭкранироватьДляПодобно(СокрЛП(СтрокаПоиска)) + "%";
Запрос.УстановитьПараметр("Шаблон", Шаблон);

Внутри текста запроса в модуле кавычки удваиваются, поэтому ""~"" — это строка "~" в самом запросе. В консоли запросов пишите одинарные кавычки: СПЕЦСИМВОЛ "~".

Поиск по нескольким словам

Пользователь ввёл «молоко 3,2». Искать всю фразу целиком значит потерять «Молоко пастеризованное 3,2%». Удобнее разбить ввод на слова и для каждого добавить своё условие через И.

Слова = СтрРазделить(СокрЛП(СтрокаПоиска), " ", Ложь);
Условия = Новый Массив;
Для Индекс = 0 По Слова.ВГраница() Цикл
	ИмяПараметра = "Слово" + Формат(Индекс, "ЧН=0; ЧГ=0");
	Условия.Добавить("Номенклатура.Наименование ПОДОБНО &" + ИмяПараметра + " СПЕЦСИМВОЛ ""~""");
	Запрос.УстановитьПараметр(ИмяПараметра, "%" + ЭкранироватьДляПодобно(Слова[Индекс]) + "%");
КонецЦикла;

Готовые условия собирают через СтрСоединить(Условия, " И ") и подставляют в секцию ГДЕ. Если слов нет, условие не добавляют вовсе. Формат ЧН=0 нужен, чтобы первый параметр назывался Слово0, а не Слово.

Скорость: когда ПОДОБНО использует индекс

ПОДОБНО сам по себе не медленный. Медленным его делает форма шаблона.

  • ✅ Шаблон без % в начале ("Молоко%"). СУБД может пройти по индексу поля, как при поиске диапазона. На большом справочнике это доли секунды.
  • ❌ Шаблон с % в начале ("%молоко%"). Индекс не помогает: СУБД просматривает все строки таблицы. На справочнике в сотни тысяч позиций запрос заметно тормозит.
  • ⚠️ Функция над полем (ВРЕГ(Поле) ПОДОБНО ..., СОКРЛП(Поле) ПОДОБНО ...) тоже отключает индекс, даже если шаблон начинается не с %.

Индекс по наименованию у справочника есть, когда для реквизита Наименование включено индексирование или оно входит в основное представление и сортировку. Для собственных реквизитов индекс включают в свойствах реквизита в конфигураторе: свойство Индексировать.

Что делать, если искать по вхождению всё же нужно в большой таблице:

  1. Сначала сузьте выборку другими условиями: период, организация, вид номенклатуры, пометка удаления. ПОДОБНО тогда проверяет тысячи строк, а не миллионы.
  2. Ограничьте результат через ВЫБРАТЬ ПЕРВЫЕ 50, если это подбор в форме. Пользователю всё равно не нужны 20 000 совпадений.
  3. Для поиска по многим реквизитам сразу (наименование, артикул, комментарий) подумайте о полнотекстовом поиске платформы. Он работает по своему индексу и не делает полный просмотр таблиц, но требует настройки и регулярного обновления индекса.

План запроса на клиент-серверной базе видно через технологический журнал или средства СУБД. Если в плане сканирование всей таблицы, а шаблон начинается с %, причина найдена.

Примеры запросов и ошибки, на которых спотыкаются

Готовые примеры

Документы с определённым словом в комментарии. Комментарий обычно хранится как строка неограниченной длины. Обычное сравнение = с такими строками в запросе недопустимо, а ПОДОБНО работает:

ВЫБРАТЬ
	РеализацияТоваровУслуг.Ссылка
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
	РеализацияТоваровУслуг.Комментарий ПОДОБНО "%возврат%"
	И РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Отбор по дате стоит рядом не случайно: по комментарию индекса нет, и без периода запрос пройдёт по всем документам базы.

Контрагенты с ИНН неправильного формата. ИНН юрлица — 10 цифр, ИП — 12. Находим тех, у кого в ИНН есть что-то кроме цифр:

ВЫБРАТЬ
	Контрагенты.Ссылка,
	Контрагенты.ИНН
ИЗ
	Справочник.Контрагенты КАК Контрагенты
ГДЕ
	Контрагенты.ИНН <> ""
	И Контрагенты.ИНН ПОДОБНО "%[^0-9]%"

Номенклатура, у которой артикул начинается с буквы, а дальше идут цифры: Номенклатура.Артикул ПОДОБНО "[A-Z][0-9]%".

Ошибки, на которых чаще всего спотыкаются

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

Ещё одна ловушка — регистр. В файловой базе и в типовых настройках СУБД для 1С сравнение строк обычно идёт без учёта регистра: "%молоко%" найдёт и «Молоко», и «МОЛОКО». Но поведение задаётся правилами сравнения (collation) конкретной базы. Если база перенесена на сервер с нестандартными настройками, проверьте результат на тестовой выборке, прежде чем полагаться на поиск в отчёте.

Проверьте себя
Какой шаблон найдёт «Счет 15», но не «Счет 150»?
Что найдёт условие Поле ПОДОБНО "[^А-Я]%"?
Как найти текст «5_6» с буквальным подчёркиванием?

Частые вопросы

Можно ли использовать ПОДОБНО в системе компоновки данных?
Да. В тексте запроса набора данных ПОДОБНО пишется как обычно. В отборах СКД есть вид сравнения «Подобно» — тогда пользователь сам вводит маску с % и _, а вид «Содержит» подставляет проценты за него.
Чем ПОДОБНО отличается от LIKE в SQL?
По смыслу это тот же оператор: % и _ значат то же самое, скобки [ ] тоже поддерживаются. Отличие в записи: вместо ESCAPE используется СПЕЦСИМВОЛ, хотя английские слова LIKE и ESCAPE язык запросов тоже принимает.
Можно ли проверить в запросе, что строка пустая, через ПОДОБНО?
Можно: Поле ПОДОБНО "" истинно только для пустой строки. Для строк обычной длины проще написать Поле = “”. Для строк неограниченной длины, где равенство недоступно, ПОДОБНО "" — рабочий вариант.
Есть ли в 1С регулярные выражения вместо ПОДОБНО?
В языке запросов — нет, самые гибкие средства там — скобки [ ] и [^ ]. Если маски не хватает, выберите кандидатов запросом с ПОДОБНО, а точную проверку сделайте во встроенном языке после выборки.
Почему ПОДОБНО по полю из соединения работает медленно?
Часто проверка идёт по полю через точку, например Документ.Контрагент.Наименование. Это неявное соединение с таблицей справочника для каждой строки. Сначала отберите контрагентов во временную таблицу, затем соединяйтесь с ней.