Разработка и Конфигурация · 10 мин
Условие ГДЕ в конструкторе запросов 1С 8.3: практическое руководство
Как работать с условием ГДЕ в конструкторе запросов 1С 8.3: виды сравнений, параметры, виртуальные таблицы, типичные ошибки и проверка результата.
Условие ГДЕ — основной инструмент отбора данных в запросах 1С: именно оно определяет, какие строки попадут в результат, а какие будут отброшены ещё на этапе выборки. В конструкторе запросов 1С 8.3 условия настраиваются на закладке «Условия», и правильная их постановка влияет не только на корректность выборки, но и на скорость выполнения запроса.
Ошибки в секции ГДЕ — одна из самых частых причин «пустых» отчётов, задвоенных строк и медленных запросов. Типичные проблемы: сравнение полей разных типов, отбор по несуществующему значению, использование условий там, где нужны параметры виртуальных таблиц. Всё это решается штатными средствами конструктора, если понимать логику работы отборов.
Материал рассчитан на тех, кто уже умеет открыть консоль запросов или конструктор в конфигураторе и хочет уверенно строить отборы: от простого равенства до условий по вложенным запросам и спискам значений.
Где в конструкторе запросов задаётся условие ГДЕ
Откройте конструктор запроса (в конфигураторе — через контекстное меню модуля «Конструктор запроса», в режиме предприятия — через консоль запросов). После выбора таблиц на закладке «Таблицы и поля» перейдите на закладку «Условия». Именно здесь формируется текст после ключевого слова ГДЕ в итоговом запросе.
Закладка разделена на две части: слева — доступные поля выбранных таблиц, справа — список условий. Чтобы добавить условие, перетащите поле мышью в правую часть или дважды щёлкните по нему. Конструктор автоматически создаст выражение вида Поле = &Поле — с параметром, который потом передаётся из кода.
Каждое условие можно редактировать вручную: щёлкните по строке условия и измените текст в поле внизу. Здесь же доступен флажок «Произвольное» — он позволяет написать любое выражение языка запросов, включая функции и вложенные запросы, которые конструктор не сгенерирует сам.
Виды сравнений в условии ГДЕ
Язык запросов 1С поддерживает несколько видов сравнения, и выбор правильного напрямую влияет на результат. Разберём основные.
| Вид сравнения | Пример | Когда применять |
|---|---|---|
| Равно (=) | Номенклатура = &Номенклатура | Точный отбор по ссылке, числу, дате |
| В (&Список) | Склад В (&Склады) | Отбор по нескольким значениям сразу |
| В ИЕРАРХИИ | Номенклатура В ИЕРАРХИИ(&Группа) | Отбор по группе справочника с учётом вложенности |
| ПОДОБНО | Наименование ПОДОБНО "%кабель%" | Поиск по части строки |
| МЕЖДУ | Дата МЕЖДУ &Нач И &Кон | Отбор по диапазону дат или чисел |
| ЕСТЬ NULL | Поле ЕСТЬ NULL | Поиск незаполненных значений при соединениях |
Оператор В с параметром-списком — самый практичный приём для отборов по нескольким значениям: в коде параметру присваивается массив или список значений, и запрос отбирает строки по любому из них. Это заменяет цепочку условий через ИЛИ и работает быстрее.
Оператор ПОДОБНО использует шаблоны: символ % — любая последовательность символов, _ — один символ. Учтите, что поиск по шаблону вида %строка% не использует индекс и на больших таблицах выполняется медленно.
Отбор по датам и периодам
Даты — самый частый тип условий в учётных запросах. Стандартный приём: передать в запрос два параметра &НачалоПериода и &КонецПериода и построить условие Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода.
Важная тонкость: если дата документа хранится с точностью до секунды, а конец периода задан как начало дня (00:00:00), документы за последний день в выборку не попадут. Используйте функцию КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ) или задавайте границу как начало следующего дня со строгим сравнением МЕНЬШЕ.
Для виртуальных таблиц регистров накопления и сведений период лучше задавать не в ГДЕ, а в параметрах виртуальной таблицы — об этом подробнее ниже. Это принципиально для производительности.
Параметры виртуальных таблиц против условия ГДЕ
Виртуальные таблицы регистров (Остатки, Обороты, ОстаткиИОбороты, СрезПоследних) принимают параметры, которые задаются в круглых скобках после имени таблицы. В конструкторе это делается через кнопку «Параметры виртуальной таблицы» на закладке «Таблицы и поля».
Ключевое правило: отборы по измерениям виртуальной таблицы нужно переносить из ГДЕ в параметры. Условие Номенклатура = &Номенклатура в секции ГДЕ заставит СУБД сначала построить всю виртуальную таблицу остатков по всей номенклатуре, а потом отбросить лишнее. Тот же отбор в параметрах таблицы ограничит расчёт на уровне источника данных — разница в скорости на больших базах может быть кратной.
Пример параметров для таблицы остатков: РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад). Здесь и период, и отбор по складу заданы параметрами — это правильный вариант.
Где задавать отбор
Отборы по периоду и измерениям регистров. Быстро, ограничивает расчёт виртуальной таблицы. Ограничение: доступны только предопределённые параметры.
Отборы по полям реальных таблиц, по реквизитам, вычисляемым выражениям и условиям после соединений. Универсально, но для виртуальных таблиц медленнее.
Условия со списками, иерархией и вложенными запросами
Отбор по списку значений
Условие Поле В (&СписокЗначений) требует, чтобы в коде параметру был присвоен массив или список значений. Если передать одиночное значение вместо коллекции, запрос вернёт ошибку или пустой результат в зависимости от контекста — проверяйте тип параметра перед выполнением.
Отбор по иерархии справочника
Конструкция Номенклатура В ИЕРАРХИИ(&Группа) отберёт элементы, находящиеся в указанной группе и всех её подгруппах. Это стандартный способ отбора по разделу номенклатуры. Учтите, что сама группа в результат не попадает — только элементы.
Условие по вложенному запросу
Конструкция Поле В (ВЫБРАТЬ ...) позволяет отобрать строки по результату другого запроса — например, все документы, в которых есть определённый товар. В конструкторе такое условие вводится вручную с флажком «Произвольное». Это мощный, но ресурсоёмкий приём: на больших таблицах проверяйте время выполнения.
- 1Выберите таблицы и поля на закладке «Таблицы и поля»
- 2Перейдите на закладку «Условия»
- 3Перетащите нужное поле из левого списка в правый
- 4Отредактируйте вид сравнения и значение или параметр
- 5Для сложных выражений включите флажок «Произвольное» и введите текст вручную
- 6Нажмите «ОК» и проверьте сгенерированный текст запроса
Соединения таблиц и условия: в чём разница
Частая путаница у начинающих: условие можно поставить и в описании соединения (закладка «Связи»), и в секции ГДЕ. Для внутреннего соединения результат одинаков. Но для левого соединения разница принципиальна: условие в ГДЕ, наложенное на поле правой таблицы, фактически превращает левое соединение во внутреннее — строки с NULL отфильтруются.
Если нужно сохранить все строки левой таблицы, условие на поля правой таблицы переносите в условие соединения (в тексте запроса — после ключевого слова ПО), а не в ГДЕ. В конструкторе это делается на закладке «Связи» редактированием условия связи.
Проверка результата и отладка условий
После построения запроса проверяйте результат в консоли запросов в режиме предприятия на реальных данных. Задавайте параметры, максимально близкие к боевым: если в коде передаётся список — передавайте список и в консоли.
Полезный приём отладки: временно убирайте условия по одному и смотрите, какое из них «съедает» строки. Если запрос возвращает пустоту, в 9 случаях из 10 виновато одно конкретное условие — найти его методом исключения быстрее, чем перечитывать весь текст.
Проверяйте типы данных полей в условии: составное поле (например, «Контрагент» в документе, который может ссылаться на разные справочники) при сравнении со ссылкой конкретного типа может потребовать явного приведения через ВЫРАЗИТЬ(... КАК Справочник.Контрагенты).
Как проверить корректность условия
Строки соответствуют ожидаемому отбору
Пустой результат при заведомо существующих данных — проверяйте типы и значения параметров
Запрос по регистру с параметрами виртуальной таблицы выполняется быстро
Отбор в ГДЕ по виртуальной таблице — перенесите условие в параметры
Строки левой таблицы без пары присутствуют с NULL в полях правой
Строки потеряны — условие на правую таблицу стоит в ГДЕ вместо условия связи
Часто задаваемые вопросы
Как в условии ГДЕ проверить поле на пустую ссылку?
Используйте функцию ЗНАЧЕНИЕ с указанием типа: Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Для незаполненных строковых полей сравнение идёт с пустой строкой, для дат — с датой '0001-01-01'. Сравнение ссылки с пустой строкой результата не даст.
Чем отличается ГДЕ от ИМЕЮЩИЕ?
ГДЕ фильтрует строки до группировки, ИМЕЮЩИЕ — после. Условия на итоговые функции (СУММА, КОЛИЧЕСТВО) можно ставить только в ИМЕЮЩИЕ. Например, отбор клиентов с суммой продаж больше заданной делается через ИМЕЮЩИЕ СУММА(Сумма) > &Порог.
Можно ли использовать ИЛИ между условиями?
Да. В конструкторе включите флажок «Произвольное» и напишите выражение вручную: Поле1 = &Значение1 ИЛИ Поле2 = &Значение2. При смешивании И и ИЛИ используйте скобки — приоритет И выше, и без скобок логика может оказаться не той, что ожидалась.
Почему условие по параметру-списку не работает?
Чаще всего параметру присвоено одиночное значение вместо массива или списка значений. Для оператора В в коде создайте массив, добавьте в него значения и присвойте параметру. Также проверьте, что типы элементов списка совпадают с типом поля.
Как отобрать документы за текущий день?
Передайте параметр с текущей датой сеанса и используйте условие: Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ). Так вы корректно захватите все документы дня независимо от времени их проведения.
Влияет ли порядок условий в ГДЕ на скорость?
Практически нет: оптимизатор СУБД сам определяет порядок применения условий. На скорость влияет не порядок записи, а наличие индексов по полям отбора и размещение отборов в параметрах виртуальных таблиц.
Что важно запомнить
Условия ГДЕ настраиваются на закладке «Условия» конструктора: поле, вид сравнения, параметр. Отборы по измерениям регистров переносите в параметры виртуальных таблиц, условия на правую таблицу левого соединения — в условие связи. Проверяйте типы параметров и границы периодов — это главные источники пустых результатов.