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

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

Запрос 1С 8: оператор ГДЕ и условия отбора

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

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

Условие ГДЕ записывается после предложения ИЗ и необязательного предложения СГРУППИРОВАТЬ ПО, но до УПОРЯДОЧИТЬ ПО. Внутри условия можно сравнивать поля с константами, параметрами, другими полями, проверять вхождение в список, соответствие шаблону и значение NULL. Все логические комбинации строятся через И, ИЛИ и НЕ со скобками.

Ниже разобраны синтаксис, типовые сценарии с примерами кода, особенности работы со ссылками, датами и виртуальными таблицами, а также типичные ошибки, из-за которых условие «молча» не срабатывает.

Синтаксис оператора ГДЕ и базовые условия

Минимальный запрос с условием выглядит так: после ИЗ указывается таблица, затем ГДЕ с логическим выражением. Выражение должно возвращать булево — ИСТИНА или ЛОЖЬ для каждой строки.

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

Номенклатура.ПометкаУдаления = ЛОЖЬ

Доступные операции сравнения: =, <>, >, <, >=, <=. Константы в тексте запроса пишутся напрямую: строки в кавычках, даты через функцию ДАТАВРЕМЯ(2026, 1, 1), булевы значения как ИСТИНА и ЛОЖЬ, перечисления — через ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20).

Несколько условий объединяются через И и ИЛИ. Приоритет: сначала НЕ, затем И, затем ИЛИ. Чтобы не зависеть от приоритетов, всегда ставьте скобки при смешивании И и ИЛИ — это самая частая причина «неправильной» выборки.

Отбор по параметрам и спискам значений

На практике условия почти всегда строятся на параметрах, а не на константах. Параметр объявляется символом & и заполняется методом УстановитьПараметр перед выполнением запроса.

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

Запрос.Текст =

"ВЫБРАТЬ

| Реализация.Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Контрагент = &Контрагент

| И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос.УстановитьПараметр("Контрагент", КонтрагентСсылка);

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));

Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));

Условие В и вложенные запросы

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

ГДЕ

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

И Товары.Склад В

(ВЫБРАТЬ Склады.Ссылка

ИЗ Справочник.Склады КАК Склады

ГДЕ Склады.Родитель = &ГруппаСкладов)

Если параметр-список пуст, условие В вернёт ЛОЖЬ для всех строк — запрос вернёт пустой результат. Это удобно, когда пустой отбор означает «ничего не выбирать», но если бизнес-логика требует «пустой список = без ограничений», условие нужно строить динамически или через схему компоновки данных.

Отбор по строкам: ПОДОБНО и функции строк

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

Запрос.УстановитьПараметр("Фрагмент", "%" + СтрокаПоиска + "%");

// В тексте запроса:

// ГДЕ Номенклатура.Наименование ПОДОБНО &Фрагмент

Учтите два ограничения. Во-первых, ПОДОБНО чувствительно к регистру на большинстве СУБД, поэтому для поиска без учёта регистра приводят обе стороны к одному регистру через ВРЕГ() или НРЕГ(). Во-вторых, спецсимволы шаблона (%, _, [, ]) в искомой строке нужно экранировать через СПЕЦСИМВОЛ, иначе пользовательский ввод «100%» будет воспринят как шаблон.

Для точного сравнения строк помните про тип поля: сравнение строки неограниченной длины со строкой фиксированной длины может требовать приведения через ВЫРАЗИТЬ(... КАК Строка(150)), иначе СУБД вернёт пустой результат без ошибки.

Работа со ссылками, NULL и типами в условии

Проверка на NULL и пустые ссылки

NULL возникает при левых соединениях и в полях составного типа. Сравнение «= NULL» всегда ложно — проверять нужно через ЕСТЬ NULL или ЕСТЬ НЕ NULL:

ГДЕ

Остатки.КоличествоОстаток ЕСТЬ NULL

Пустая ссылка — это не NULL. Для проверки используют ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) или сравнение с параметром, переданным как ПустаяСсылка(). Функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) заменяет NULL на заданное значение прямо в условии.

Составные типы и приведение

Если реквизит имеет составной тип (например, «Документ-основание»), сравнение с конкретной ссылкой работает корректно, но обращение к полям через точку требует ВЫРАЗИТЬ: ГДЕ ВЫРАЗИТЬ(Запись.Регистратор КАК Документ.ПриходныйОрдер).Склад = &Склад. Для отбора по типу значения применяют ССЫЛКА: ГДЕ Таблица.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг.

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

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

ВЫБРАТЬ

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

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

ИЗ

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

&ДатаОстатков,

Склад = &Склад

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

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

Для таблицы СрезПоследних условие в параметрах применяется к измерениям среза. Условия по ресурсам и реквизитам в параметрах не поддерживаются — их приходится выносить в ГДЕ, что является нормальной практикой.

Где ставить условие

Параметры виртуальной таблицы

Для измерений регистров (склад, номенклатура, период). Быстро, корректно, предпочтительный способ.

ГДЕ основного запроса

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

Отбор в СКД

Когда состав отборов задаёт пользователь отчёта: условия добавляются динамически без изменения текста запроса.

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

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

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

Проверять условие удобнее всего в консоли запросов: выполните запрос, сравните количество строк с ожидаемым, затем по одному убирайте условия и смотрите, какое именно «режет» выборку. Дополнительно полезно вывести в поля запроса само проверяемое значение — так видно, что реально лежит в базе (например, что в реквизите NULL, а не пустая строка).

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

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

Количество строк результата
Норма

Совпадает с контрольной выборкой по тем же условиям в стандартном отчёте

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

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

Значения в полях-условиях
Норма

В выборке видны ожидаемые ссылки, даты, строки

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

NULL, пустые ссылки или другой тип данных — условие сравнивает не с тем значением

Время выполнения на регистрах
Норма

Запрос с отбором по периоду выполняется быстро

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

Долгое выполнение — условия на измерения вынесены в ГДЕ вместо параметров виртуальной таблицы

FAQ

Чем отличается условие в ГДЕ от условия в параметрах виртуальной таблицы?

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

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

Однозначного оператора «заполнено» нет. Для ссылочных полей проверяют неравенство пустой ссылке и ЕСТЬ НЕ NULL, для строк — неравенство пустой строке, для чисел — неравенство нулю. Комбинируйте проверки через И, так как составной тип может содержать и NULL, и пустую ссылку одновременно в разных строках.

Почему условие по дате не отбирает документы последнего дня периода?

Дата документа содержит время. Если граница задана как начало дня (ДАТАВРЕМЯ(2026, 1, 31) — это 00:00:00), документы за 31 января позже полуночи не попадут в отбор. Используйте КонецДня(Дата) в коде или МЕЖДУ &Начало И &Конец с корректно рассчитанным концом периода.

Можно ли использовать ИЛИ с условием ЕСТЬ NULL?

Да, это стандартный приём: ГДЕ (Таблица.Поле ЕСТЬ NULL ИЛИ Таблица.Поле = &Значение). Такое условие часто нужно при левом соединении, когда отсутствие связанной записи тоже допустимо. Обязательно берите всё выражение в скобки, если рядом есть другие условия через И.

Как отладить запрос, который возвращает пустой результат?

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

Работает ли ГДЕ в запросах к табличным частям?

Да, табличная часть — обычная таблица для запроса: ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары ГДЕ Товары.Ссылка = &Документ. Условие по ссылке на документ-владелец здесь обязательно, иначе выберутся строки всех документов вида.

Итог

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

ГДЕ фильтрует строки запроса: сравнения, В, ПОДОБНО, ЕСТЬ NULL и логика И/ИЛИ со скобками. Значения передавайте параметрами, отборы по измерениям регистров — в параметры виртуальных таблиц. Проверяйте условия в консоли запросов по одному и следите за типами значений.