Разработка и Конфигурация · 11 мин
Условие в запросе 1С: как работать с оператором ГДЕ
Как правильно задать условие в запросе 1С: оператор ГДЕ, сравнения, В ИЕРАРХИИ, ВЫБОР, параметры и типичные ошибки с примерами кода.
Условие в запросе 1С — это основной инструмент отбора данных из базы. Оператор ГДЕ (WHERE) позволяет выбрать только те записи, которые соответствуют заданным критериям: по конкретному документу, диапазону дат, значению реквизита или принадлежности к группе справочника. Без корректно построенного условия запрос либо вернёт лишние данные, либо не найдёт ничего.
Язык запросов 1С во многом повторяет SQL, но имеет собственные особенности: виртуальные таблицы, параметры с амперсандом, конструкции В ИЕРАРХИИ, ВЫБОР и ССЫЛКА. Ошибки в условиях — одна из самых частых причин медленных отчётов и неверных данных в выборках.
Материал рассчитан на разработчиков и внедренцев, которые пишут или дорабатывают запросы в конфигурациях на управляемых и обычных формах. Разберём синтаксис оператора ГДЕ, типовые сценарии отбора, работу с параметрами и типичные ошибки.
Базовый синтаксис оператора ГДЕ
Оператор ГДЕ ставится после секции ИЗ и определения псевдонима таблицы. В нём перечисляются логические выражения, которые должны быть истинны для каждой отбираемой строки. Простейший вариант — сравнение поля с параметром или константой:
ВЫБРАТЬ
Товары.Ссылка КАК Товар,
Товары.Наименование
ИЗ
Справочник.Номенклатура КАК Товары
ГДЕ
Товары.Родитель = &Группа
И НЕ Товары.ПометкаУдаления
Логические условия объединяются операторами И, ИЛИ и НЕ. Приоритет стандартный: сначала вычисляется НЕ, затем И, затем ИЛИ. Если логика сложная, всегда расставляйте скобки явно — это уберегает от ошибок интерпретации и упрощает чтение запроса коллегами.
В условиях можно сравнивать поля с параметрами (&Имя), с литералами (строки в кавычках, числа, даты через ДАТАВРЕМЯ) и с другими полями той же или соединённой таблицы. Сравнение полей между собой допустимо, но может работать медленнее, чем фильтрация по параметру.
Операторы сравнения и логические конструкции
Для точных отборов применяются стандартные операторы: =, <>, >, <, >=, <=. Для строк используется ПОДОБНО с шаблоном, где % — любая последовательность символов, а _ — один символ. Учтите, что ПОДОБНО с шаблоном вида "%строка%" не использует индекс и на больших таблицах работает медленно.
Оператор В позволяет проверить вхождение значения в список или результат вложенного запроса. Список можно передать параметром типа СписокЗначений или массив — это удобно для отбора по нескольким контрагентам, складам или видам документов:
ГДЕ
Продажи.Контрагент В (&СписокКонтрагентов)
И Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
Оператор МЕЖДУ включает обе границы диапазона. Для дат помните, что ДАТАВРЕМЯ(2026,12,31) — это начало суток, поэтому для включения всего последнего дня задавайте конец периода как КонецДня(Дата) при формировании параметра.
Отбор по иерархии и ссылочным типам
Частая задача — выбрать все элементы справочника, входящие в группу с учётом вложенных подгрупп. Обычное сравнение Родитель = &Группа вернёт только элементы первого уровня. Для полного отбора используйте В ИЕРАРХИИ:
ВЫБРАТЬ
Ном.Ссылка
ИЗ
Справочник.Номенклатура КАК Ном
ГДЕ
Ном.Ссылка В ИЕРАРХИИ(&Группа)
Для полей составного типа (например, документ-основание, который может ссылаться на разные виды документов) применяется проверка ССЫЛКА. Она отбирает только записи, где поле содержит ссылку конкретного типа:
ГДЕ
Расчеты.ДокументРасчетов ССЫЛКА Документ.РеализацияТоваровУслуг
Обратная ситуация — когда нужно сравнить поле составного типа с параметром конкретного типа. Платформа выполнит неявное приведение, но надёжнее явно использовать ВЫРАЗИТЬ: ГДЕ ВЫРАЗИТЬ(Таб.Основание КАК Документ.ЗаказКлиента) = &Заказ. Это также помогает оптимизатору построить правильный план запроса.
Условия в виртуальных таблицах регистров
Виртуальные таблицы регистров накопления и сведений принимают параметры отбора прямо в описании источника. Это принципиально важно для производительности: отбор на уровне виртуальной таблицы выполняется до формирования результата.
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&ДатаОстатков,
Склад = &Склад
И Номенклатура В ИЕРАРХИИ(&Группа)) КАК Остатки
В параметрах виртуальной таблицы доступны не все операторы основного ГДЕ: поддерживаются сравнения, В, В ИЕРАРХИИ, МЕЖДУ и логические связки. Сложные выражения с функциями и вложенными запросами внутри параметров виртуальной таблицы недопустимы.
Для регистра сведений СрезПоследних и СрезПервых первым параметром идёт период, вторым — условие отбора по измерениям. Если условие не нужно, его просто опускают, оставляя только период.
- 1Определите источник данных и задайте ему короткий псевдоним через КАК
- 2Сформулируйте условие: какие поля с какими значениями нужно сравнить
- 3Выберите оператор: = для точного совпадения, В для списка, В ИЕРАРХИИ для групп справочника, ПОДОБНО для подстроки
- 4Объявите параметры с амперсандом и установите их через УстановитьПараметр до выполнения
- 5Выполните запрос на тестовой копии и сверьте количество и содержимое записей с ожиданием
Конструкция ВЫБОР как условная логика в полях
Когда условие нужно не для отбора строк, а для вычисления значения поля, используется конструкция ВЫБОР — аналог CASE в SQL. Она позволяет вернуть разные значения в зависимости от данных строки:
ВЫБРАТЬ
Заказы.Номер,
ВЫБОР
КОГДА Заказы.Сумма > 100000
ТОГДА "Крупный"
КОГДА Заказы.Сумма > 10000
ТОГДА "Средний"
ИНАЧЕ "Мелкий"
КОНЕЦ КАК Категория
ИЗ
Документ.ЗаказКлиента КАК Заказы
ГДЕ
Заказы.Проведен
Ветка ИНАЧЕ обязательна, если ни одно условие может не сработать — без неё поле получит NULL. Проверки внутри ВЫБОР вычисляются сверху вниз, поэтому более строгие условия ставьте первыми.
Для проверки на NULL существует функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию). Она незаменима при левых соединениях, когда поле присоединённой таблицы может быть пустым, а в отчёте нужен ноль или пустая строка вместо NULL.
Сравнение вариантов отбора
Подходит для отбора по обычным таблицам справочников и документов; универсален, но для виртуальных таблиц менее эффективен
Оптимальный вариант для Остатков, Оборотов, Срезов — отбор выполняется до выборки данных; ограничен по набору операторов
Когда фильтр должен задавать пользователь в отчёте без изменения текста запроса; требует настройки схемы компоновки
Параметры запроса и типичные ошибки
Каждый параметр, упомянутый в тексте запроса, должен быть установлен до вызова Выполнить(). Порядок установки не важен, важна полнота. Для списков значений передавайте массив или СписокЗначений — платформа сама развернёт его в условие В.
Особый случай — пустые ссылки и незаполненные параметры. Если параметр не задан осознанно, условие Поле = &Параметр с неинициализированным значением вернёт пустой результат. Когда параметр необязателен, используйте приём с ИЛИ: ГДЕ (&Склад = НЕОПРЕДЕЛЕНО ИЛИ Таб.Склад = &Склад), а в коде передавайте Неопределено, если отбор не нужен.
Даты передавайте как значения типа Дата, а не строками. Строковое сравнение дат работает по алфавиту и даёт неверный результат. Для границ периода применяйте функции НачалоПериода() и КонецПериода() на стороне кода.
Проверка результата и отладка условий
Перед встраиванием запроса в код проверяйте его в консоли запросов — она показывает результат сразу и позволяет экспериментировать с параметрами без перезапуска отчёта. Конструктор запроса в конфигураторе также помогает собрать условие визуально и посмотреть итоговый текст.
Признак корректного условия — выборка содержит ровно те записи, которые вы ожидали, включая граничные случаи: элементы вложенных групп, документы на границах периода, записи с пустыми реквизитами. Проверяйте эти краевые ситуации отдельно, а не только «средний» случай.
Если запрос работает медленно, откройте технологический журнал или план запроса на стороне СУБД и проверьте, используется ли индекс по полям условия. Отбор по неиндексированным реквизитам больших таблиц — повод пересмотреть структуру условия или добавить индексирование реквизита в конфигураторе.
Как проверить результат
Совпадает с ожидаемым по данным базы
Пустой результат или заметно больше записей, чем должно быть
Документы первого и последнего дня входят в выборку
Последний день периода отсутствует из-за времени 00:00:00
Присутствуют элементы всех уровней вложенности группы
Только элементы первого уровня — значит, использовано = вместо В ИЕРАРХИИ
Запрос отрабатывает за приемлемое время на рабочей базе
Заметная задержка — проверяйте отбор в параметрах виртуальной таблицы и индексы
Часто задаваемые вопросы
Чем отличается В от В ИЕРАРХИИ?
Оператор В проверяет вхождение значения в заданный список — элемент сравнивается напрямую с каждым значением. В ИЕРАРХИИ дополнительно анализирует дерево справочника: условие истинно, если элемент находится внутри указанной группы на любом уровне вложенности. Для плоских отборов по списку значений используйте В, для групп справочников — В ИЕРАРХИИ.
Как сделать условие необязательным?
Используйте приём с проверкой параметра на Неопределено: ГДЕ (&Параметр = НЕОПРЕДЕЛЕНО ИЛИ Поле = &Параметр). Когда отбор не нужен, передавайте в параметр значение Неопределено — условие станет истинным для всех записей. В схеме компоновки данных для этой цели есть штатная необязательность отборов.
Почему запрос с условием по дате не находит документы за последний день?
Потому что дата без времени означает начало суток (00:00:00), а документы проведены в течение дня с конкретным временем. Передавайте конец периода через КонецДня(Дата) в коде либо используйте границу вида МЕЖДУ &Начало И &Конец с корректно вычисленным концом дня.
Можно ли в условии использовать функции и вычисления?
В секции ГДЕ основного запроса допустимы выражения: арифметика, функции работы со строками и датами, ВЫБОР. Однако условия с функциями над полем обычно отключают использование индекса, поэтому по возможности преобразуйте их так, чтобы поле сравнивалось с вычисленным параметром.
Как отобрать записи, где реквизит не заполнен?
Для ссылочных реквизитов сравнивайте с пустой ссылкой: Поле = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Для строк — с пустой строкой, для чисел — с нулём. Если поле может содержать NULL (например, после левого соединения), проверяйте через Поле ЕСТЬ NULL.
Где правильно фильтровать данные регистра — в ГДЕ или в параметрах виртуальной таблицы?
В параметрах виртуальной таблицы. Условие, записанное в фигурных скобках после имени виртуальной таблицы, применяется до формирования выборки, и платформа строит эффективный план. Тот же фильтр в секции ГДЕ заставит сначала вычислить весь виртуальный набор, что на больших регистрах критично по времени и нагрузке.
Что важно запомнить
Условие в запросе 1С задаётся оператором ГДЕ с параметрами через амперсанд. Для групп справочников используйте В ИЕРАРХИИ, для виртуальных таблиц — параметры отбора внутри самой таблицы, для вычисляемых значений — конструкцию ВЫБОР. Проверяйте граничные случаи: конец периода, пустые ссылки, вложенные группы — именно там условия чаще всего ломаются.