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

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

Условие ГДЕ в запросах 1С: полное практическое руководство

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

Условие ГДЕ (WHERE) — основной инструмент фильтрации данных в языке запросов 1С. Оно определяет, какие строки попадут в результат выборки, и напрямую влияет на скорость выполнения: корректное условие позволяет СУБД использовать индексы, а небрежно написанное заставляет перебирать всю таблицу целиком.

Язык запросов 1С во многом повторяет SQL, но имеет собственные особенности: русскоязычные ключевые слова, специфические операторы вроде В ИЕРАРХИИ и ССЫЛКА, а также обязательную работу с параметрами через символ «&». Понимание этих отличий избавляет от типичных ошибок, которые приводят к пустым выборкам или ошибкам исполнения.

Материал рассчитан на разработчиков и внедренцев, которые пишут запросы в конфигураторе, консоли запросов или коде модулей. Разобраны синтаксис условия ГДЕ, все основные операторы, работа с параметрами, виртуальными таблицами и способы проверки результата.

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

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

Доступны стандартные операторы сравнения: =, <> (неравно), >, <, >=, <=. Для строк, чисел, дат и булевых значений они работают предсказуемо. Даты в тексте запроса задаются функцией ДАТАВРЕМЯ(2026, 1, 1) или передаются параметром.

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

Для проверки на NULL используется специальная конструкция ЕСТЬ NULL, а не сравнение через «= NULL». Выражение «Поле = NULL» в языке запросов 1С некорректно, правильно: «Поле ЕСТЬ NULL» или «НЕ Поле ЕСТЬ NULL».

Работа с параметрами запроса

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

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

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

"ВЫБРАТЬ

| Товары.Ссылка

|ИЗ

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

|ГДЕ

| Товары.Родитель = &Группа

| И Товары.Артикул = &Артикул";

Запрос.УстановитьПараметр("Группа", ГруппаТоваров);

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

Параметр можно использовать в условии несколько раз — значение устанавливается один раз. Если параметр не установлен, при выполнении запроса возникнет ошибка. Поэтому при динамическом формировании текста запроса следите, чтобы каждый упомянутый параметр был установлен до вызова Выполнить().

Один параметр может содержать массив или список значений — это удобно в сочетании с оператором В. Тип элементов массива должен соответствовать типу сравниваемого поля, иначе сравнение вернёт пустой результат без явной ошибки.

Операторы В, В ИЕРАРХИИ, ПОДОБНО и МЕЖДУ

Оператор В проверяет вхождение значения в список: «Номенклатура.Ссылка В (&СписокТоваров)». В качестве списка можно передать массив, список значений или вложенный запрос. Вложенный запрос в В — мощный приём, но на больших таблицах может работать медленнее соединения, поэтому для тяжёлых выборок сравнивайте оба варианта.

Оператор В ИЕРАРХИИ — специфика 1С для работы с иерархическими справочниками. Условие «Товары.Ссылка В ИЕРАРХИИ(&Группа)» выберет все элементы, находящиеся в указанной группе и всех её подгруппах на любой глубине. Это заменяет рекурсивный обход дерева в коде и выполняется на стороне СУБД.

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

Оператор МЕЖДУ проверяет попадание значения в диапазон включительно: «Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода». Обе границы входят в результат, поэтому для периодов с точностью до секунды корректнее передавать конец дня (23:59:59) или использовать сравнение «<» со следующей датой.

Сравнение вариантов фильтрации списков

В (&Массив)

Подходит для заранее известного набора значений из кода. Ограничение — очень большие массивы могут замедлять запрос.

В (вложенный запрос)

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

В ИЕРАРХИИ

Единственный корректный способ фильтрации по группе иерархического справочника с учётом всех вложенных подгрупп.

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

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

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

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

Отдельный приём — передача таблицы значений как параметра и её соединение с виртуальной таблицей по условию. Это используется, когда нужно получить остатки по произвольному списку номенклатуры с дополнительными полями (например, ценой из другого источника). Таблицу значений помещают во временную таблицу и индексируют по полям соединения.

Проверка типов, ссылок и составных полей

Для полей составного типа часто требуется отобрать только значения определённого вида. Оператор ССЫЛКА проверяет тип ссылочного значения: «Регистратор ССЫЛКА Документ.ПоступлениеТоваров». Это полезно в запросах к регистрам, где регистратором могут быть документы разных видов.

Функция ВЫРАЗИТЬ приводит значение к нужному типу: «ВЫРАЗИТЬ(Поле КАК Справочник.Номенклатура)». Приведение убирает лишние типы из составного поля, что упрощает соединения и позволяет обращаться к реквизитам конкретного типа через точку.

Функция ЕСТЬNULL заменяет NULL на указанное значение прямо в условии или списке полей: «ЕСТЬNULL(Остатки.Количество, 0) > 0». Без этой обёртки сравнение NULL с числом вернёт не ИСТИНА и не ЛОЖЬ, а NULL, и строка выпадет из результата — частая причина «пропавших» данных в отчётах.

Типичные ошибки
01
Сравнение с NULL через «=» вместо ЕСТЬ NULL — условие никогда не выполняется, выборка пустая без ошибки.
02
Условия к виртуальным таблицам через ГДЕ вместо параметров — запрос строит лишние данные и работает в разы медленнее.
03
ПОДОБНО с шаблоном «%текст%» на большой таблице — полное сканирование вместо использования индекса.
04
Смешение И и ИЛИ без скобок — логика условия отличается от задуманной, в результат попадают лишние строки.
05
Несовпадение типов параметра и поля — сравнение молча не срабатывает, диагностируется только проверкой данных.

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

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

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

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

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

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

Количество строк до и после добавления ГДЕ
Норма

Число строк уменьшилось ожидаемым образом

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

Ноль строк или количество не изменилось

Типы параметров
Норма

Тип параметра совпадает с типом поля в метаданных

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

Передана строка вместо ссылки или даты

Сравнение с отчётом в интерфейсе
Норма

Итоги запроса совпадают со стандартным отчётом

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

Расхождения в суммах или количестве

Часто задаваемые вопросы

Чем ГДЕ отличается от ИМЕЮЩИЕ в запросе 1С?

ГДЕ фильтрует строки до группировки, а ИМЕЮЩИЕ — уже сгруппированные итоги. Например, отбор по складу пишется в ГДЕ, а условие «сумма продаж больше 100000» после группировки — в ИМЕЮЩИЕ. Фильтрация через ГДЕ эффективнее, поэтому всё, что можно проверить до группировки, следует писать именно там.

Можно ли использовать функции в условии ГДЕ?

Да, доступны встроенные функции языка запросов: НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, ДОБАВИТЬКДАТЕ, РАЗНОСТЬДАТ, ПОДСТРОКА и другие. Пример: «Документ.Дата >= НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ)». Учтите, что применение функции к полю таблицы обычно мешает использованию индекса, поэтому по возможности преобразуйте параметр, а не поле.

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

Для ссылочных полей сравните с пустой ссылкой через ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка). Для строк — с пустой строкой, для чисел — с нулём, так как в 1С у примитивных типов нет NULL по умолчанию. NULL появляется только при соединениях, и тогда нужна проверка ЕСТЬ NULL.

Почему условие с параметром-датой не отбирает документы за день?

Дата документа содержит время, а параметр часто передают как начало дня (00:00:00). Сравнение «Дата = &Дата» совпадёт только с документами в полночь. Используйте диапазон: «Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)».

Работает ли ГДЕ с таблицей значений, переданной как параметр?

Напрямую — нет. Таблицу значений сначала помещают во временную таблицу конструкцией «ВЫБРАТЬ ... ПОМЕСТИТЬ ВТ ИЗ &Таблица», затем соединяют с основной выборкой. После соединения поля временной таблицы можно использовать в ГДЕ как обычные поля.

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

Обращение через точку («Товары.Номенклатура.СтавкаНДС = &Ставка») допустимо, но порождает неявное соединение с таблицей справочника. На больших выборках лучше явно соединить таблицы через ЛЕВОЕ СОЕДИНЕНИЕ и накладывать условие на поле присоединённой таблицы — так запрос прозрачнее и легче оптимизируется.

Итог

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

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