Разработка и Конфигурация · 10 мин
Запрос 1С 8: оператор ГДЕ и условия отбора
Как использовать оператор ГДЕ в запросах 1С 8: синтаксис, параметры, условия В, ПОДОБНО, ссылки, типичные ошибки и проверка результата в консоли запросов.
Оператор ГДЕ в языке запросов 1С 8 отвечает за фильтрацию строк: из таблицы выбираются только те записи, которые удовлетворяют заданному условию. Без корректного условия запрос либо возвращает лишние данные, либо не возвращает ничего, поэтому понимание логики ГДЕ — базовый навык при разработке отчётов, обработок и доработке типовых конфигураций.
Условие ГДЕ записывается после предложения ИЗ и необязательного предложения СГРУППИРОВАТЬ ПО, но до УПОРЯДОЧИТЬ ПО. Внутри условия можно сравнивать поля с константами, параметрами, другими полями, проверять вхождение в список, соответствие шаблону и значение NULL. Все логические комбинации строятся через И, ИЛИ и НЕ со скобками.
Ниже разобраны синтаксис, типовые сценарии с примерами кода, особенности работы со ссылками, датами и виртуальными таблицами, а также типичные ошибки, из-за которых условие «молча» не срабатывает.
Синтаксис оператора ГДЕ и базовые условия
Минимальный запрос с условием выглядит так: после ИЗ указывается таблица, затем ГДЕ с логическим выражением. Выражение должно возвращать булево — ИСТИНА или ЛОЖЬ для каждой строки.
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ПометкаУдаления = ЛОЖЬ
Доступные операции сравнения: =, <>, >, <, >=, <=. Константы в тексте запроса пишутся напрямую: строки в кавычках, даты через функцию ДАТАВРЕМЯ(2026, 1, 1), булевы значения как ИСТИНА и ЛОЖЬ, перечисления — через ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20).
Несколько условий объединяются через И и ИЛИ. Приоритет: сначала НЕ, затем И, затем ИЛИ. Чтобы не зависеть от приоритетов, всегда ставьте скобки при смешивании И и ИЛИ — это самая частая причина «неправильной» выборки.
Отбор по параметрам и спискам значений
На практике условия почти всегда строятся на параметрах, а не на константах. Параметр объявляется символом & и заполняется методом УстановитьПараметр перед выполнением запроса.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Контрагент = &Контрагент
| И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("Контрагент", КонтрагентСсылка);
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));
Условие В и вложенные запросы
Оператор В проверяет вхождение значения в список. Список может быть параметром типа СписокЗначений или массив, либо результатом вложенного запроса:
ГДЕ
Товары.Номенклатура В (&СписокНоменклатуры)
И Товары.Склад В
(ВЫБРАТЬ Склады.Ссылка
ИЗ Справочник.Склады КАК Склады
ГДЕ Склады.Родитель = &ГруппаСкладов)
Если параметр-список пуст, условие В вернёт ЛОЖЬ для всех строк — запрос вернёт пустой результат. Это удобно, когда пустой отбор означает «ничего не выбирать», но если бизнес-логика требует «пустой список = без ограничений», условие нужно строить динамически или через схему компоновки данных.
Отбор по строкам: ПОДОБНО и функции строк
Для поиска по части наименования используется оператор ПОДОБНО с шаблоном. Символ % заменяет любую последовательность символов, _ — ровно один символ. Параметр обычно формируется в коде с добавлением процентов:
Запрос.УстановитьПараметр("Фрагмент", "%" + СтрокаПоиска + "%");
// В тексте запроса:
// ГДЕ Номенклатура.Наименование ПОДОБНО &Фрагмент
Учтите два ограничения. Во-первых, ПОДОБНО чувствительно к регистру на большинстве СУБД, поэтому для поиска без учёта регистра приводят обе стороны к одному регистру через ВРЕГ() или НРЕГ(). Во-вторых, спецсимволы шаблона (%, _, [, ]) в искомой строке нужно экранировать через СПЕЦСИМВОЛ, иначе пользовательский ввод «100%» будет воспринят как шаблон.
Для точного сравнения строк помните про тип поля: сравнение строки неограниченной длины со строкой фиксированной длины может требовать приведения через ВЫРАЗИТЬ(... КАК Строка(150)), иначе СУБД вернёт пустой результат без ошибки.
Работа со ссылками, NULL и типами в условии
Проверка на NULL и пустые ссылки
NULL возникает при левых соединениях и в полях составного типа. Сравнение «= NULL» всегда ложно — проверять нужно через ЕСТЬ NULL или ЕСТЬ НЕ NULL:
ГДЕ
Остатки.КоличествоОстаток ЕСТЬ NULL
Пустая ссылка — это не NULL. Для проверки используют ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) или сравнение с параметром, переданным как ПустаяСсылка(). Функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) заменяет NULL на заданное значение прямо в условии.
Составные типы и приведение
Если реквизит имеет составной тип (например, «Документ-основание»), сравнение с конкретной ссылкой работает корректно, но обращение к полям через точку требует ВЫРАЗИТЬ: ГДЕ ВЫРАЗИТЬ(Запись.Регистратор КАК Документ.ПриходныйОрдер).Склад = &Склад. Для отбора по типу значения применяют ССЫЛКА: ГДЕ Таблица.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг.
Условия в виртуальных таблицах регистров
Главная оптимизационная особенность: для виртуальных таблиц (Остатки, Обороты, СрезПоследних, ОстаткиИОбороты) условия следует передавать в параметры виртуальной таблицы, а не в ГДЕ. Платформа тогда строит выборку сразу по нужным измерениям, а не фильтрует уже рассчитанный итог.
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&ДатаОстатков,
Склад = &Склад
И Номенклатура В (&СписокНоменклатуры)) КАК Остатки
Тот же отбор в ГДЕ даст идентичный результат, но выполняться будет заметно дольше на больших регистрах: сначала рассчитаются остатки по всем складам и всей номенклатуре, потом лишнее отбросится. На небольших базах разница незаметна, на крупных — кратная.
Для таблицы СрезПоследних условие в параметрах применяется к измерениям среза. Условия по ресурсам и реквизитам в параметрах не поддерживаются — их приходится выносить в ГДЕ, что является нормальной практикой.
Где ставить условие
Для измерений регистров (склад, номенклатура, период). Быстро, корректно, предпочтительный способ.
Для полей, недоступных в параметрах виртуальной таблицы: ресурсы, реквизиты, вычисляемые выражения, условия по соединённым таблицам.
Когда состав отборов задаёт пользователь отчёта: условия добавляются динамически без изменения текста запроса.
Типичные ошибки и проверка результата
Самая коварная ошибка — условие, которое синтаксически верно, но всегда ложно или всегда истинно. Запрос выполняется без сообщений, а результат просто пустой или избыточный, и проблему замечают по косвенным признакам в отчёте.
Проверять условие удобнее всего в консоли запросов: выполните запрос, сравните количество строк с ожидаемым, затем по одному убирайте условия и смотрите, какое именно «режет» выборку. Дополнительно полезно вывести в поля запроса само проверяемое значение — так видно, что реально лежит в базе (например, что в реквизите NULL, а не пустая строка).
Как проверить результат
Совпадает с контрольной выборкой по тем же условиям в стандартном отчёте
Ноль строк или явный избыток — проверяйте каждое условие по отдельности
В выборке видны ожидаемые ссылки, даты, строки
NULL, пустые ссылки или другой тип данных — условие сравнивает не с тем значением
Запрос с отбором по периоду выполняется быстро
Долгое выполнение — условия на измерения вынесены в ГДЕ вместо параметров виртуальной таблицы
FAQ
Чем отличается условие в ГДЕ от условия в параметрах виртуальной таблицы?
Функционально результат одинаков, если условие задано по измерениям. Разница в производительности: параметры виртуальной таблицы ограничивают расчёт итогов до выборки, а ГДЕ фильтрует уже готовый результат. Правило: всё, что можно передать в параметры, передавайте туда.
Как задать условие «поле заполнено»?
Однозначного оператора «заполнено» нет. Для ссылочных полей проверяют неравенство пустой ссылке и ЕСТЬ НЕ NULL, для строк — неравенство пустой строке, для чисел — неравенство нулю. Комбинируйте проверки через И, так как составной тип может содержать и NULL, и пустую ссылку одновременно в разных строках.
Почему условие по дате не отбирает документы последнего дня периода?
Дата документа содержит время. Если граница задана как начало дня (ДАТАВРЕМЯ(2026, 1, 31) — это 00:00:00), документы за 31 января позже полуночи не попадут в отбор. Используйте КонецДня(Дата) в коде или МЕЖДУ &Начало И &Конец с корректно рассчитанным концом периода.
Можно ли использовать ИЛИ с условием ЕСТЬ NULL?
Да, это стандартный приём: ГДЕ (Таблица.Поле ЕСТЬ NULL ИЛИ Таблица.Поле = &Значение). Такое условие часто нужно при левом соединении, когда отсутствие связанной записи тоже допустимо. Обязательно берите всё выражение в скобки, если рядом есть другие условия через И.
Как отладить запрос, который возвращает пустой результат?
Выполните запрос в консоли запросов без условия ГДЕ и убедитесь, что данные в таблице есть. Затем добавляйте условия по одному. Проверьте типы параметров: частая причина — передача строки вместо ссылки или даты строкой. Выведите проверяемые поля в результат, чтобы увидеть фактические значения в базе.
Работает ли ГДЕ в запросах к табличным частям?
Да, табличная часть — обычная таблица для запроса: ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары ГДЕ Товары.Ссылка = &Документ. Условие по ссылке на документ-владелец здесь обязательно, иначе выберутся строки всех документов вида.
Что важно запомнить
ГДЕ фильтрует строки запроса: сравнения, В, ПОДОБНО, ЕСТЬ NULL и логика И/ИЛИ со скобками. Значения передавайте параметрами, отборы по измерениям регистров — в параметры виртуальных таблиц. Проверяйте условия в консоли запросов по одному и следите за типами значений.