К статье
Практический материал

Разработка и Конфигурация · 11 мин

ВЫБОР КОГДА и ПОДОБНО в запросах 1С: практическое руководство

Как использовать конструкции ВЫБОР КОГДА и ПОДОБНО в запросах 1С: синтаксис, примеры кода, типичные ошибки и способы проверить результат.

Конструкции ВЫБОР КОГДА и ПОДОБНО — два самых востребованных инструмента языка запросов 1С. Первая позволяет реализовать условную логику прямо в тексте запроса, вторая — искать строки по шаблону. Вместе они закрывают большинство задач по классификации данных и гибкой фильтрации без обхода выборки в коде.

Частая ошибка начинающих разработчиков — вытаскивать данные запросом целиком, а затем раскладывать их по категориям в цикле на встроенном языке. Это медленнее, требует больше кода и усложняет поддержку. Правильный подход — перенести логику на уровень запроса, где СУБД выполнит её оптимально.

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

Синтаксис ВЫБОР КОГДА: простая и поисковая формы

Конструкция ВЫБОР имеет две формы. Простая форма сравнивает одно выражение с несколькими значениями:

ВЫБОР Товары.ЕдиницаИзмерения

КОГДА &Штуки ТОГДА "шт."

КОГДА &Килограммы ТОГДА "кг"

ИНАЧЕ "прочее"

КОНЕЦ

Поисковая форма проверяет произвольные логические условия и подходит для диапазонов и составных условий:

ВЫБОР

КОГДА Продажи.Сумма >= 100000 ТОГДА "Крупная"

КОГДА Продажи.Сумма >= 10000 ТОГДА "Средняя"

ИНАЧЕ "Мелкая"

КОНЕЦ КАК КатегорияСделки

Ветка ИНАЧЕ не обязательна, но без неё при несовпадении всех условий поле получит значение NULL. Это частый источник ошибок: NULL не равен ни пустой строке, ни нулю, и сравнение с ним в последующих условиях требует конструкции ЕСТЬ NULL. Поэтому ветку ИНАЧЕ стоит указывать всегда, даже если кажется, что все варианты перечислены.

Условия проверяются сверху вниз, и выполняется первая подошедшая ветка. Порядок условий влияет на результат: если в примере выше поменять местами проверки на 10000 и 100000, все суммы выше 100000 попадут в категорию «Средняя». Располагайте более строгие условия выше.

Где можно применять ВЫБОР КОГДА

Конструкция работает не только в списке полей выборки. Её можно использовать в секции ГДЕ для фильтрации, в условиях соединений, в итогах и группировках, а также в параметрах виртуальных таблиц там, где это допустимо синтаксисом.

Практичный сценарий — группировка по вычисляемой категории. Например, отчёт по продажам с разбивкой на «Мелкие / Средние / Крупные» строится одним запросом: ВЫБОР помещается и в поле выборки, и в секцию СГРУППИРОВАТЬ ПО, а сумма агрегируется функцией СУММА.

В секции ГДЕ ВЫБОР позволяет строить динамические условия. Классический приём — необязательный отбор: если параметр не заполнен, фильтр не применяется:

ГДЕ ВЫБОР

КОГДА &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

ТОГДА ИСТИНА

ИНАЧЕ Продажи.Контрагент = &Контрагент

КОНЕЦ

Такой приём удобен, но при больших объёмах данных может мешать оптимизатору СУБД выбрать индекс. Если запрос стал выполняться медленно, надёжнее формировать текст условия программно и добавлять отбор только когда параметр заполнен.

Оператор ПОДОБНО: шаблоны поиска строк

Оператор ПОДОБНО проверяет, соответствует ли строка шаблону. В шаблоне используются служебные символы: знак процента (%) заменяет любую последовательность символов любой длины, включая пустую, а подчёркивание (_) — ровно один произвольный символ.

ГДЕ Номенклатура.Наименование ПОДОБНО "%кабель%"

Такой запрос найдёт «Кабель ВВГ 3х2.5», «Провод и кабель», «Кабель-канал». Шаблон "К_т" найдёт «Кот» и «Кит», но не «Китай». Шаблон без служебных символов эквивалентен точному сравнению, хотя для точного сравнения лучше использовать обычное равенство — оно читается яснее.

Оператор чувствителен к регистру в зависимости от настроек СУБД: в большинстве установок MS SQL и PostgreSQL с типичными параметрами сортировки регистр не учитывается, но полагаться на это не стоит. Если нужен гарантированно регистронезависимый поиск, применяйте функцию ВРег или НРег к обеим сторонам сравнения, понимая, что это отключит использование индекса.

Инверсия выполняется через НЕ: ГДЕ НЕ Наименование ПОДОБНО "%архив%". Скобки вокруг НЕ и выражения в запросах 1С обязательны в ряде контекстов — при сомнениях заключайте всё условие в скобки.

bsl
Запрос.Текст = "ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура ГДЕ Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");

Спецсимволы и экранирование в ПОДОБНО

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

ГДЕ Наименование ПОДОБНО "%~%скидка%" СПЕЦСИМВОЛ "~"

Здесь "~%" означает буквальный знак процента, а не «любая последовательность». Забытое экранирование — коварная ошибка: запрос не упадёт, а просто вернёт лишние строки, и заметить это можно только при проверке результата.

При передаче шаблона из пользовательского ввода экранируйте спецсимволы программно перед подстановкой в параметр, если пользователь ищет буквальный текст. Иначе введённый им знак процента превратит точный поиск в поиск по маске.

Совместное использование ВЫБОР и ПОДОБНО

Конструкции отлично комбинируются. Типовая задача — классифицировать элементы по фрагментам наименования:

ВЫБОР

КОГДА Номенклатура.Наименование ПОДОБНО "%услуга%" ТОГДА "Услуги"

КОГДА Номенклатура.Наименование ПОДОБНО "%доставка%" ТОГДА "Логистика"

ИНАЧЕ "Товары"

КОНЕЦ КАК ГруппаПоТипу

Другой сценарий — мягкая валидация данных. Запросом можно выявить записи, где поле заполнено не по формату: например, ИНН, не состоящий из 10 или 12 цифр, или артикул, не подходящий под принятую маску. Для этого ПОДОБНО с шаблоном из подчёркиваний проверяет длину, а отрицание — соответствие формату.

При комбинировании следите за порядком веток: более частные шаблоны должны идти раньше общих. Шаблон "%кабель%" перехватит строки, которые вы хотели отдельно отнести к "%кабель-канал%", если стоит выше.

Порядок действий при написании условного запроса
  1. 1
    Сформулируйте категории и правила отнесения записей к ним
  2. 2
    Напишите ВЫБОР с ветками от более строгих условий к более общим, добавьте ИНАЧЕ
  3. 3
    Проверьте шаблоны ПОДОБНО на экранирование спецсимволов
  4. 4
    Выполните запрос в консоли запросов на тестовой базе и сверьте количество строк по категориям
  5. 5
    Проверьте план запроса, если таблица большая и шаблон начинается с %

Производительность и ограничения

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

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

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

Сравнение вариантов поиска строк

ПОДОБНО с шаблоном "текст%"

Ищет по началу строки, может использовать индекс. Подходит для поиска по префиксу кода или артикула.

ПОДОБНО с шаблоном "%текст%"

Ищет вхождение в любом месте, но сканирует таблицу целиком. Приемлемо на небольших справочниках.

Полнотекстовый поиск

Подходит для поиска по нескольким словам и длинным текстам. Требует включения и настройки индекса, обновляется регламентно.

Равенство строки

Самый быстрый вариант для точного совпадения, но не терпит отклонений в написании.

Типичные ошибки и проверка результата

Самые частые проблемы при работе с этими конструкциями перечислены ниже. Все они дают не падение запроса, а тихо неверный результат, поэтому проверка обязательна.

Типичные ошибки
01
Отсутствие ветки ИНАЧЕ — часть строк получает NULL и выпадает из дальнейших сравнений и итогов
02
Неверный порядок веток КОГДА — общее условие перехватывает строки раньше частного
03
Неэкранированные % и _ в пользовательском вводе — поиск возвращает лишние записи
04
Сравнение результата ВЫБОР со значением другого типа — ошибка исполнения или пустой результат
05
ПОДОБНО с ведущим % на большой таблице — длительное выполнение и блокировки
06
Ожидание строгой регистронезависимости — поведение зависит от настроек сортировки СУБД

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

Контрольные точки

Как проверить результат

Количество строк по категориям ВЫБОР
Норма

Сумма по категориям равна общему числу строк, NULL отсутствует

Тревожный признак

Есть строки с NULL или сумма не сходится — нет ветки ИНАЧЕ или пробел в условиях

Результат ПОДОБНО
Норма

Найдены ожидаемые строки, лишних нет

Тревожный признак

Лишние строки — проверьте спецсимволы и ширину шаблона

Время выполнения
Норма

Запрос отрабатывает за приемлемое время на рабочем объёме

Тревожный признак

Заметное замедление — проверьте ведущий % и условия ВЫБОР в ГДЕ

FAQ

Можно ли использовать ВЫБОР КОГДА внутри итогов и группировки?

Да. Конструкцию можно помещать в секцию СГРУППИРОВАТЬ ПО и в список полей с агрегатными функциями. Важно, чтобы выражение в группировке и в поле выборки совпадало, иначе запрос вернёт ошибку о поле, не входящем в группировку.

Чем ВЫБОР отличается от функции ЕСТЬNULL?

ЕСТЬNULL(Поле, Значение) — частный случай: заменяет NULL указанным значением. ВЫБОР универсальнее и позволяет проверять любые условия, но для простой подстановки вместо NULL запись ЕСТЬNULL короче и читается легче.

Почему ПОДОБНО не находит строку, которая точно есть в базе?

Чаще всего причины три: в строке есть неразрывные пробелы или невидимые символы, шаблон содержит неэкранированные служебные символы, либо сравнение идёт с учётом регистра на конкретной СУБД. Проверьте значение функцией с обрезкой пробелов и упростите шаблон до минимального фрагмента.

Можно ли в шаблоне ПОДОБНО перечислить несколько значений, как в списке?

Нет, ПОДОБНО принимает один шаблон. Для нескольких вариантов объединяйте условия через ИЛИ либо используйте оператор В для точных совпадений. При большом числе вариантов удобнее поместить их во временную таблицу и соединиться с ней.

Работает ли ПОДОБНО в параметрах виртуальных таблиц?

В параметрах виртуальных таблиц набор допустимых выражений ограничен и зависит от конкретной таблицы. Надёжнее применять ПОДОБНО в секции ГДЕ основного запроса после выборки из виртуальной таблицы.

Как организовать поиск по нескольким словам одновременно?

Разбейте строку поиска на слова программно и для каждого добавьте отдельное условие ПОДОБНО через И (все слова обязаны встречаться) или ИЛИ (достаточно любого). Для полноценного поиска с учётом морфологии используйте механизм полнотекстового поиска платформы.

Итог

Что важно запомнить

ВЫБОР КОГДА реализует условную логику в запросе: ветки проверяются сверху вниз, ИНАЧЕ защищает от NULL. ПОДОБНО ищет по шаблону с % и _, спецсимволы экранируются через СПЕЦСИМВОЛ. Ведущий % в шаблоне отключает индекс — на больших таблицах используйте полнотекстовый поиск. Результат всегда проверяйте на тестовых данных, включая строки, которые не должны попасть в выборку.