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

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

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

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

Условия в запросе 1С — главный инструмент отбора данных: без них выборка возвращает всё содержимое таблицы, что замедляет работу и загружает лишние записи. Язык запросов 1С построен по образцу SQL, но имеет свои особенности: русскоязычные синонимы ключевых слов, работу с иерархическими справочниками, виртуальные таблицы регистров и строгую типизацию параметров.

Правильно поставленное условие решает сразу три задачи: отбирает только нужные записи, ускоряет выполнение за счёт использования индексов и упрощает дальнейшую обработку результата. Неправильное — приводит к пустым выборкам, дублированию строк или полному сканированию таблицы на больших объёмах данных.

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

Базовый синтаксис: оператор ГДЕ и простые сравнения

Условие отбора записывается после ключевого слова ГДЕ (английский синоним — WHERE). Простейший вариант — сравнение поля со значением или параметром:

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Артикул = &Артикул

Параметр начинается с символа & и передаётся из кода через метод УстановитьПараметр. Использование параметров вместо прямой вставки значений в текст запроса — обязательное правило: это защищает от ошибок с типами данных и делает запрос безопасным и повторно используемым.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Номенклатура.Артикул = &Артикул";

Запрос.УстановитьПараметр("Артикул", "ТН-1001");

Результат = Запрос.Выполнить();

Доступны стандартные операторы сравнения: =, <>, >, <, >=, <=. Для дат и чисел сравнение работает напрямую. Для ссылочных полей сравнение идёт по значению ссылки — строковое представление объекта сравнивать нельзя.

Логические операторы: И, ИЛИ, НЕ и приоритет условий

Несколько условий объединяются операторами И (AND), ИЛИ (OR) и НЕ (NOT). Оператор И имеет более высокий приоритет, чем ИЛИ, поэтому при смешанных условиях обязательно расставляйте скобки — иначе отбор сработает не так, как задумано.

ГДЕ

(Номенклатура.ВидНоменклатуры = &Вид

ИЛИ Номенклатура.ВидНоменклатуры = &ВидЗапасной)

И НЕ Номенклатура.ПометкаУдаления

Частая ошибка — запись вида «Условие1 ИЛИ Условие2 И Условие3» без скобок. Запрос трактует её как «Условие1 ИЛИ (Условие2 И Условие3)», что обычно не совпадает с намерением разработчика. Если логика сложная, разбивайте условие на строки и явно группируйте скобками.

Оператор НЕ удобен для исключений: отобрать всех контрагентов, кроме помеченных на удаление, или документы, не относящиеся к заданному виду. Учитывайте, что НЕ с отрицанием иногда читается хуже, чем прямое условие — предпочитайте вариант, который проще проверить глазами.

Отбор по списку значений: оператор В

Когда нужно отобрать записи по нескольким значениям одного поля, перечислять их через ИЛИ неудобно. Оператор В (IN) принимает список значений, массив или даже результат вложенного запроса:

ГДЕ

Номенклатура.Ссылка В (&СписокНоменклатуры)

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

Вариант с вложенным запросом позволяет отобрать документы по условию из другой таблицы без явного соединения:

ГДЕ

Реализация.Контрагент В

(ВЫБРАТЬ

Контрагенты.Ссылка

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.Регион = &Регион)

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

Отбор по части строки: оператор ПОДОБНО

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

ГДЕ

Номенклатура.Наименование ПОДОБНО &Шаблон

Запрос.УстановитьПараметр("Шаблон", "%кабель%");

Шаблон формируется в коде, а не в тексте запроса — так проще контролировать позицию знаков %. Поиск «%текст%» находит вхождение в любом месте строки, «текст%» — только в начале.

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

Отбор по иерархии справочника: В ИЕРАРХИИ

Справочники в 1С часто иерархические, и типовая задача — отобрать элементы, входящие в группу со всеми подгруппами. Для этого существует конструкция В ИЕРАРХИИ:

ГДЕ

Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)

Условие вернёт саму группу (если она подходит по типу поля) и все вложенные элементы любого уровня вложенности. Это заметно проще и быстрее, чем рекурсивный обход дерева в коде с накоплением списка ссылок.

В отчётах на СКД тот же эффект даёт вид сравнения «В группе из списка» или «В группе» — при настройке отбора через пользовательский интерфейс писать текст запроса не требуется.

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

ГДЕ со сравнением

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

В (&Список)

Для отбора по нескольким значениям или результату вложенного запроса; пустой список даёт пустой результат

ПОДОБНО

Для поиска по части строки; шаблон с % в начале не использует индекс

В ИЕРАРХИИ

Для отбора по группе справочника со всеми подгруппами; работает только с иерархическими таблицами

Условия в виртуальных таблицах регистров

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

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(

&Период,

Склад = &Склад) КАК Остатки

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

В параметрах СрезПоследних и СрезПервых первым идёт период среза, вторым — условие по измерениям. Условие по ресурсам и реквизитам в параметрах недопустимо — его ставят в секции ГДЕ.

Особые случаи: NULL, составные типы и проверка результата

Значение NULL возникает при левых соединениях и в полях с незаполненными данными. Сравнение «Поле = NULL» не работает — NULL не равен ничему, включая сам себя. Используйте специальные операторы:

ГДЕ

Товары.Характеристика ЕСТЬ NULL

Для замены NULL на значение по умолчанию применяется функция ЕСТЬNULL(Поле, Значение). Её удобно ставить и в списке выбора, и в условии, если сравнивать нужно с конкретным значением.

Поля составного типа (например, «Контрагент» может быть ссылкой на разные справочники) иногда требуется отфильтровать по типу. Для этого служит оператор ССЫЛКА или функция ТИПЗНАЧЕНИЯ:

ГДЕ

Расчеты.Контрагент ССЫЛКА Справочник.Контрагенты

После выполнения запроса проверяйте результат методом Результат.Пустой() перед обходом выборки — это защищает от лишней работы и делает поведение кода предсказуемым при отсутствии данных.

Порядок постановки условия
  1. 1
    Определите, по какому полю и таблице нужен отбор
  2. 2
    Выберите оператор: =, В, ПОДОБНО, В ИЕРАРХИИ или ЕСТЬ NULL
  3. 3
    Запишите условие в секции ГДЕ с параметром &Имя
  4. 4
    Для виртуальных таблиц регистров перенесите отбор по измерениям в параметры таблицы
  5. 5
    Передайте значение через Запрос.УстановитьПараметр()
  6. 6
    Выполните запрос и проверьте Результат.Пустой() перед обходом
Типичные ошибки
01
Сравнение «Поле = NULL» вместо «Поле ЕСТЬ NULL» — условие никогда не сработает
02
Смешение И и ИЛИ без скобок — отбор применяется не в том порядке
03
Подстановка значений в текст запроса конкатенацией вместо параметров — ошибки типов и уязвимости
04
Условие по измерениям регистра в ГДЕ вместо параметров виртуальной таблицы — резкое падение скорости
05
Шаблон ПОДОБНО с % в начале на большой таблице — полное сканирование без индекса
06
Передача пустого массива в В (&Список) без проверки — запрос возвращает пустой результат
Контрольные точки

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

Количество записей в выборке
Норма

Совпадает с ожидаемым числом отобранных объектов

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

Пустой результат или явно лишние записи — проверяйте скобки и значения параметров

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

Запрос отрабатывает быстро даже на большой таблице

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

Заметная задержка — условие не использует индекс или отбор не вынесен в параметры виртуальной таблицы

Типы данных параметра
Норма

Тип значения совпадает с типом поля (ссылка, дата, строка)

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

Ошибка при выполнении или пустая выборка из-за несовпадения типов

Частые вопросы об условиях в запросах 1С

Как задать условие «не равно»?

Используйте оператор <> (или НЕ с равенством): ГДЕ Номенклатура.ПометкаУдаления <> ИСТИНА. Для ссылочных полей сравнение идёт по значению ссылки, для NULL неравенство не работает — применяйте конструкцию НЕ Поле ЕСТЬ NULL.

Как отобрать записи за период по датам?

Передайте две даты параметрами и используйте условие: ГДЕ Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода. Помните, что дата в 1С содержит время, поэтому конец периода задавайте как конец дня — функцией КонецДня() в коде.

Можно ли ставить условие по полю через точку (разыменование)?

Да, например ГДЕ Реализация.Контрагент.Регион = &Регион. Но разыменование порождает неявное соединение с таблицей справочника и замедляет запрос. Если таких полей много, лучше явно соединить таблицы через ЛЕВОЕ СОЕДИНЕНИЕ.

Как задать условие в динамическом списке формы?

Для динамического списка отбор задаётся программно через элементы отбора: ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")), затем задаются ЛевоеЗначение, ВидСравнения и ПравоеЗначение. Текст запроса списка изменять не требуется.

Чем В ИЕРАРХИИ отличается от проверки Родитель = &Группа?

Сравнение с родителем отбирает только элементы первого уровня вложенности в указанную группу. В ИЕРАРХИИ возвращает элементы всех уровней, включая вложенные подгруппы. Для многоуровневых справочников корректен только второй вариант.

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

В консоли запросов параметры задаются на отдельной закладке: добавьте параметр, укажите тип и значение, затем выполните запрос. Это удобный способ отладить условие до переноса текста в модуль — вы сразу видите, сколько записей возвращает отбор.

Итог

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

Условия ставятся в секции ГДЕ через параметры, списки отбираются оператором В, подстроки — ПОДОБНО, иерархия — В ИЕРАРХИИ, NULL проверяется оператором ЕСТЬ NULL. Для виртуальных таблиц регистров отбор по измерениям переносите в параметры таблицы — это главный фактор скорости. Всегда проверяйте скобки в сложных условиях и результат через Пустой().