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