Оператор ПОДОБНО (аналог SQL-конструкции LIKE) в языке запросов 1С:Предприятие позволяет гибко фильтровать данные по шаблонам строк. Это незаменимый инструмент, когда нужно найти записи с частичным совпадением текста — например, товары с определённым префиксом в артикуле, контрагентов по фрагменту названия или документы с комментариями, содержащими ключевые слова. Однако не все разработчики используют его потенциал на 100%: кто-то ограничивается простыми шаблонами вроде "А%", а кто-то даже не знает о возможности экранирования специальных символов.
В этой статье разберём все нюансы работы с ПОДОБНО — от базового синтаксиса до оптимизации сложных запросов. Вы узнаете, как правильно комбинировать подстановочные символы % и _, избегать типичных ошибок при поиске по регистру, а также научитесь использовать регулярные выражения (через РЕГВЫР) для задач, где LIKE бессилен. Особое внимание уделим скрытым особенностям индексирования полей при использовании ПОДОБНО — это критично для производительности на больших базах.
1. Синтаксис оператора ПОДОБНО в 1С
Базовая конструкция условия ПОДОБНО выглядит так:
ГДЕ Поле ПОДОБНО "Шаблон"
Где Поле — это строка (название, артикул, комментарий и т.п.), а "Шаблон" — строка с подстановочными символами. В 1С:Предприятие поддерживаются два специальных символа:
- 🔹
%— заменяет любое количество символов (включая ноль). Например,"А%"найдёт все строки, начинающиеся на "А". - 🔹
_— заменяет ровно один символ. Например,"Р_т"найдёт "Рот", "Рат", "Рит" и т.д.
Важно: оператор чувствителен к регистру в большинстве СУБД (например, PostgreSQL или Microsoft SQL Server), но нечувствителен в 1С:Предприятие 8.3 при работе с файловой базой. Чтобы гарантированно игнорировать регистр, используйте функцию ВРЕГ():
ГДЕ ВРЕГ(Поле) ПОДОБНО ВРЕГ("шаблон")
Если вам нужно найти строки, не соответствующие шаблону, используйте конструкцию НЕ ПОДОБНО. Например: ГДЕ Номенклатура.Артикул НЕ ПОДОБНО "АРТ%".
2. Подстановочные символы: примеры использования
Рассмотрим практические примеры применения % и _ в реальных задачах. Допустим, у нас есть справочник Номенклатура с полем Артикул, и нам нужно:
| Задача | Шаблон | Пример результата |
|---|---|---|
| Найти артикулы, начинающиеся на "К-100" | "К-100%" | "К-100А", "К-100/5", "К-10001" |
| Найти артикулы с ровно 3 символами после "Т" | "Т___" | "Т123", "ТАБВ", но не "Т12" |
| Найти артикулы, содержащие дефис | "%-%" | "АРТ-01", "К-100-5", "123-45" |
| Найти артикулы, где вторая буква — "Р" | "_Р%" | "АРТ123", "1Р001", "ПР-45" |
Обратите внимание на последний пример: шаблон "_Р%" найдёт все строки, где второй символ — "Р", независимо от длины. Это мощный инструмент для поиска по позициям символов.
3. Экранирование специальных символов
Если вам нужно найти строки, содержащие сами символы %, _ или [, их необходимо экранировать с помощью квадратных скобок. Например, чтобы найти артикул "100%", используйте:
ГДЕ Артикул ПОДОБНО "100[%]"
Аналогично для поиска подчёркивания:
ГДЕ Наименование ПОДОБНО "А_[_]Б"
Это найдёт строки вроде "А_B" или "А1_Б2", но не "АБ" или "А1Б2".
Что будет, если не экранировать специальные символы?
Если в шаблоне есть неэкранированные % или _, они будут восприняты как подстановочные символы. Например, запрос ГДЕ Артикул ПОДОБНО "100%" найдёт все артикулы, начинающиеся на "100", а не только тот, который равен "100%".
4. Поиск по нескольким шаблонам (IN + LIKE)
Иногда требуется найти записи, соответствующие одному из нескольких шаблонов. Например, артикулы, начинающиеся на "А" или "К". Для этого используйте конструкцию В() (аналог SQL-оператора IN):
ГДЕ Артикул ПОДОБНО В("А%", "К%", "М%")
Это эквивалентно условию:
ГДЕ Артикул ПОДОБНО "А%"
ИЛИ Артикул ПОДОБНО "К%"
ИЛИ Артикул ПОДОБНО "М%"
Но первый вариант короче и оптимальнее с точки зрения производительности, особенно на больших базах данных.
✓ Убедитесь, что подстановочные символы экранированы, если нужно найти их буквально
✓ Проверьте регистр (при необходимости используйте ВРЕГ())
✓ Оцените selective index (индексная селективность) для полей с ПОДОБНО
✓ Тестируйте запрос на небольшой выборке перед запуском на всей базе-->
5. Оптимизация запросов с ПОДОБНО
Запросы с ПОДОБНО могут тормозить на больших базах, если не соблюдать простые правила:
- 📌 Избегайте шаблонов, начинающихся с %. Например,
"%А"(поиск строк, оканчивающихся на "А") не может использовать индексы и приводит к полному сканированию таблицы. Лучше переформулировать задачу или использовать другие методы (например,ПРАВ()). - 📌 Ограничивайте область поиска. Если ищете по справочнику, добавьте дополнительные условия по иерархии или реквизитам. Например:
ГДЕ Номенклатура.Родитель = &СсылкаНаГруппу
И Номенклатура.Артикул ПОДОБНО "К-%"
Для сложных шаблонов (например, с несколькими % в середине) рассмотрите возможность использования РЕГВЫР — он может быть эффективнее на некоторых СУБД.
Запросы с ПОДОБНО, где шаблон начинается с %, игнорируют индексы. Это критично для баз с миллионами записей — время выполнения может вырасти в десятки раз.
6. Альтернативы ПОДОБНО: РЕГВЫР и строковые функции
Если ПОДОБНО не справляется с задачей (например, нужно искать по сложному регулярному выражению), используйте:
- 🔧
РЕГВЫР(Строка, Шаблон)— поддержка полноценных регулярных выражений. Пример:
ГДЕ РЕГВЫР(Номенклатура.Наименование, "[А-Я]{3}-\d{4}")
Найдёт названия в формате "АБВ-1234" (три заглавные буквы, дефис, четыре цифры).
- 🔧 Строковые функции:
НАЙТИ(),ЛЕВ(),ПРАВ(). Пример:
ГДЕ НАЙТИ(Номенклатура.Артикул, "-") > 0
Это найдёт все артикулы, содержащие дефис (аналог ПОДОБНО "%-%", но без подстановочных символов).
Функция РЕГВЫР доступна только в 1С:Предприятие 8.3.14+. Для более старых версий используйте ПОДОБНО или строковые функции.
7. Типичные ошибки и как их избежать
Даже опытные разработчики иногда допускают ошибки при работе с ПОДОБНО. Вот самые распространённые:
⚠️ Внимание: Если вы используетеПОДОБНОс параметрами запроса (например,&Шаблон), убедитесь, что передаёте строку с уже подставленными подстановочными символами. КонструкцияГДЕ Поле ПОДОБНО &Параметр + "%"не сработает — параметры подставляются буквально!Пример неправильного кода:
Запрос.УстановитьПараметр("Префикс", "АРТ");Запрос.Текст = "ГДЕ Артикул ПОДОБНО &Префикс + "%"";
Правильный вариант:
Запрос.УстановитьПараметр("Шаблон", "АРТ%");Запрос.Текст = "ГДЕ Артикул ПОДОБНО &Шаблон";
Ещё одна типичная ошибка — поиск по нестрокам. Оператор
ПОДОБНОработает только со строковыми полями. Если пытаетесь применить его к числу или дате, получите ошибку. Преобразуйте значение явно:ГДЕ СТРОКА(Дата) ПОДОБНО "2023-%"8. Практический пример: поиск дублей по шаблону
Допустим, вам нужно найти возможные дубли в справочнике
Контрагенты, где названия отличаются только суффиксом (например, "ООО Ромашка" и "ООО Ромашка (филиал)"). Запрос может выглядеть так:ВЫБРАТЬ РАЗЛИЧНЫЕЛЕВ(Контрагенты.Наименование, НАЙТИ(Контрагенты.Наименование, " (")) КАК ОсновноеНаименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НАЙТИ(Контрагенты.Наименование, " (") > 0
УПОРЯДОЧИТЬ ПО
ОсновноеНаименование
А затем проверяйте группы с одинаковым
ОсновноеНаименованиена дубли. Для более точного поиска можно использоватьПОДОБНО:ВЫБРАТЬКонтрагенты1.Наименование КАК Наименование1,
Контрагенты2.Наименование КАК Наименование2
ИЗ
Справочник.Контрагенты КАК Контрагенты1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты2
ПО Контрагенты1.Ссылка < Контрагенты2.Ссылка
ГДЕ
Контрагенты1.Наименование ПОДОБНО Контрагенты2.Наименование + "%"
Для поиска дублей эффективнее использовать комбинацию строковых функций и ПОДОБНО, чем пытаться сделать всё через один оператор.
FAQ: Частые вопросы по запросам с ПОДОБНО
Можно ли использовать ПОДОБНО для поиска по нескольким полям одновременно?
Да, но синтаксис зависит от задачи. Если нужно, чтобы хотя бы одно поле соответствовало шаблону, используйте
ИЛИ:ГДЕ Поле1 ПОДОБНО "А%"ИЛИ Поле2 ПОДОБНО "А%"
Если требуется, чтобы все поля соответствовали своим шаблонам, используйте
И:ГДЕ Поле1 ПОДОБНО "А%"И Поле2 ПОДОБНО "Б%"
Почему запрос с ПОДОБНО работает медленно?
Скорее всего, шаблон начинается с
%(например,"%А"), что приводит к полному сканированию таблицы. Попробуйте:
- Переформулировать условие (например, искать по первым символам).
- Добавить дополнительные ограничения (по дате, группе и т.п.).
- Использовать
РЕГВЫРдля сложных шаблонов.Также проверьте, есть ли индексы на полях, по которым ведётся поиск.
Как искать по шаблону с учётом регистра?
В большинстве СУБД
ПОДОБНОчувствительно к регистру. Если нужно игнорировать регистр, используйте:ГДЕ ВРЕГ(Поле) ПОДОБНО ВРЕГ("шаблон")Если же, наоборот, нужно учитывать регистр, но в файловой базе 1С поиск идёт без учёта регистра, придётся использовать
РЕГВЫРили переносить логику в код на 1С.Можно ли в шаблоне ПОДОБНО использовать регулярные выражения?
Нет,
ПОДОБНОподдерживает только подстановочные символы%и_. Для регулярных выражений используйте функциюРЕГВЫР(доступна с версии 1С:Предприятие 8.3.14):ГДЕ РЕГВЫР(Поле, "[А-Я]{2}-\d{3}")Это найдёт строки вида "АБ-123" (две заглавные буквы, дефис, три цифры).
Как экранировать специальные символы в динамически формируемом шаблоне?
Если шаблон формируется программно и может содержать
%,_или[, замените их экранированными версиями:Шаблон = СтрЗаменить(Шаблон, "%", "[%]");Шаблон = СтрЗаменить(Шаблон, "_", "[_]");
Шаблон = СтрЗаменить(Шаблон, "[", "[[]");
После этого можно безопасно использовать шаблон в запросе:
ГДЕ Поле ПОДОБНО &Шаблон