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

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

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

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

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

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

Материал разбирает синтаксис секции ГДЕ, работу с параметрами, специальные операторы (В, ПОДОБНО, МЕЖДУ, ССЫЛКА), фильтрацию виртуальных таблиц и типичные ошибки, которые приводят к пустым результатам или падению производительности.

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

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

Доступны стандартные операторы сравнения: =, <> (не равно), >, <, >=, <=. В качестве литералов можно использовать числа, строки в кавычках, даты в формате ДАТАВРЕМЯ(2026, 1, 1) и логические значения ИСТИНА/ЛОЖЬ. Строковые литералы записываются в двойных кавычках, но в тексте запроса внутри модуля их нужно удваивать.

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

ГДЕ

(Документ.Проведен = ИСТИНА

И Документ.Дата >= &НачалоПериода)

ИЛИ Документ.Ответственный = &ТекущийПользователь

Передача значений через параметры запроса

Жёстко прописывать значения в тексте запроса — плохая практика: при каждом изменении придётся править код, а конкатенация строк с пользовательскими данными создаёт риск ошибок синтаксиса. Правильный способ — параметры, которые обозначаются символом & перед именем:

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

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

"ВЫБРАТЬ

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

| Реализация.СуммаДокумента

|ИЗ

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

|ГДЕ

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

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

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

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

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

В параметры можно передавать ссылки, примитивные типы, массивы, списки значений и таблицы значений. Массив или список значений используется с оператором В: запрос отберёт записи, где поле совпадает с любым элементом коллекции. Пустой массив в таком условии вернёт пустой результат — это частая причина «запрос ничего не нашёл».

Один параметр можно использовать в запросе многократно — устанавливать его нужно только один раз. Если параметр указан в тексте, но не установлен через УстановитьПараметр(), при выполнении возникнет ошибка «Переменная не определена».

Порядок действий
  1. 1
    Сформулируйте условие и определите, какие значения приходят извне
  2. 2
    В тексте запроса добавьте секцию ГДЕ с параметрами через &
  3. 3
    Перед выполнением вызовите Запрос.УстановитьПараметр() для каждого параметра
  4. 4
    Выполните запрос и проверьте результат через Выгрузить() или Выбрать()
  5. 5
    Проверьте граничные случаи: пустой список, NULL, даты на границах периода

Специальные операторы условий: В, ПОДОБНО, МЕЖДУ, ССЫЛКА

Оператор В проверяет вхождение значения в список. Список может быть задан перечислением в скобках, параметром-массивом или вложенным запросом. Модификатор В ИЕРАРХИИ отбирает элементы группы справочника вместе со всеми вложенными подгруппами:

ГДЕ

Номенклатура.Родитель В ИЕРАРХИИ(&ГруппаТоваров)

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

Оператор МЕЖДУ проверяет попадание значения в диапазон включительно: Поле МЕЖДУ &Начало И &Конец эквивалентно Поле >= &Начало И Поле <= &Конец. Оператор ССЫЛКА проверяет тип ссылочного поля — полезно для составных типов, например отобрать строки, где поле «ДокументОснование» содержит именно заказ поставщику:

ГДЕ

Товары.ДокументОснование ССЫЛКА Документ.ЗаказПоставщику

Сравнение операторов

В (&Список)

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

ПОДОБНО

Для поиска по фрагменту строки. Медленно работает на больших таблицах при шаблоне % в начале.

МЕЖДУ

Для диапазонов дат и чисел, границы включаются. Для дат следите за временем в конце периода.

В ИЕРАРХИИ

Для отбора по группе иерархического справочника со всеми подгруппами.

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

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

ВЫБРАТЬ

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

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

ИЗ

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

&Период,

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

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

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

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

Соединения таблиц и условия в секции ПО

Когда данные берутся из нескольких таблиц, условия связи прописываются в секции ПО (ON) после указания типа соединения. ЛЕВОЕ СОЕДИНЕНИЕ оставляет все записи левой таблицы и подставляет NULL в поля правой, если пары не нашлось; ВНУТРЕННЕЕ возвращает только совпавшие пары:

ВЫБРАТЬ

Заказы.Ссылка,

ЕСТЬNULL(Оплаты.СуммаОборот, 0) КАК Оплачено

ИЗ

Документ.ЗаказКлиента КАК Заказы

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКлиентами.Обороты КАК Оплаты

ПО Заказы.Ссылка = Оплаты.ЗаказКлиента

ГДЕ

Заказы.Дата МЕЖДУ &Начало И &Конец

Ключевой нюанс: условие, ограничивающее правую таблицу ЛЕВОГО соединения, нужно писать в секции ПО, а не в ГДЕ. Если перенести его в ГДЕ, записи с NULL отфильтруются, и левое соединение фактически превратится во внутреннее — частая и трудноуловимая логическая ошибка.

Функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) заменяет NULL на заданное значение уже на этапе выборки. Это удобнее, чем обрабатывать NULL при обходе результата в коде, и защищает арифметику: NULL плюс число даёт NULL.

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

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

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

Совпадает с ожиданием при ручной проверке по списку документов

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

Записей сильно больше (декартово произведение) или ноль при наличии данных

Суммы по документам
Норма

Сходятся с суммами в самих документах

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

Суммы кратно завышены — дублирование из-за соединения с табличной частью

Поля из правой таблицы при ЛЕВОМ соединении
Норма

NULL там, где пары нет, обработаны через ЕСТЬNULL

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

В отчёте пустые значения ломают группировки и итоги

Условия в конструкторе запроса и динамические условия

Конструктор запроса в конфигураторе позволяет собрать условие без ручного набора текста: на закладке «Условия» поля перетаскиваются из списка, справа задаётся оператор и значение. Для виртуальных таблиц условия вводятся на закладке «Таблицы» через кнопку «Параметры виртуальной таблицы». Конструктор полезен на этапе изучения — сгенерированный текст можно посмотреть и доработать вручную.

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

ТекстУсловия = "";

Если ЗначениеЗаполнено(Склад) Тогда

ТекстУсловия = ТекстУсловия + " И Остатки.Склад = &Склад";

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

КонецЕсли;

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

Маршрут решения

Как выбрать подход

Условия фиксированы и известны заранееПишите статический текст запроса с параметрами через &
Набор отборов зависит от заполненности полей на формеСобирайте текст программно или используйте построитель запроса
Нужен отчёт, где пользователь сам настраивает отборыИспользуйте СКД — отборы добавляются без изменения кода
Фильтрация по измерениям регистраПередавайте условие в параметры виртуальной таблицы, а не в ГДЕ

Типичные ошибки при написании условий

Первая группа ошибок — логические: запрос выполняется, но возвращает не те данные. Сюда относятся сравнение с NULL через равенство, условие по правой таблице левого соединения в секции ГДЕ, перепутанный приоритет И/ИЛИ без скобок и сравнение даты без учёта времени — документ с датой 15:30 не попадёт в условие Дата <= КонецДня, если параметр установлен как начало дня.

Вторая группа — ошибки производительности. Фильтрация результата виртуальной таблицы в ГДЕ вместо параметров, ПОДОБНО с ведущим %, соединение по вычисляемым выражениям и функциям в условии (например, ПОДСТРОКА в ГДЕ) отключают использование индексов. На больших таблицах такой запрос может выполняться минутами.

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

Типичные ошибки
01
Сравнение Поле = NULL вместо Поле ЕСТЬ NULL — условие никогда не выполняется
02
Условие по правой таблице левого соединения в ГДЕ — левое соединение превращается во внутреннее
03
Фильтрация виртуальной таблицы в ГДЕ вместо параметров — резкое падение скорости
04
Параметр-дата без КонецДня() — документы за последний день периода теряются
05
Пустой массив в В (&Список) — запрос возвращает ноль записей без ошибки

FAQ: частые вопросы об условиях в запросах 1С

Как проверить, что поле не заполнено (пустая ссылка)?

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

Как задать условие «или по любому из нескольких полей»?

Объедините сравнения оператором ИЛИ и обязательно возьмите всю группу в скобки, если рядом есть условия через И: ГДЕ (Поле1 = &Значение ИЛИ Поле2 = &Значение) И Активен = ИСТИНА. Без скобок ИЛИ «прилипнет» к соседнему условию и изменит логику отбора.

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

Дата в 1С хранится с точностью до секунды. Если в параметр передать дату без времени, она означает начало дня 00:00:00, и документы, созданные позже в этот день, в условие <= не попадут. Передавайте КонецДня(Дата) или используйте строгое неравенство с началом следующего дня.

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

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

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

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

Чем отличается В от В ИЕРАРХИИ?

Оператор В проверяет точное совпадение со значениями списка. В ИЕРАРХИИ дополнительно включает всех потомков указанной группы иерархического справочника: условие Родитель В ИЕРАРХИИ(&Группа) отберёт элементы самой группы и всех вложенных подгрупп любого уровня.

Итог

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

Условия пишутся в секции ГДЕ, значения передаются параметрами через &. Списки — оператором В, шаблоны — ПОДОБНО, диапазоны — МЕЖДУ, проверка пустоты — ЕСТЬ NULL. Для регистров фильтруйте через параметры виртуальных таблиц, а условия по правой таблице левого соединения держите в секции ПО. Перед боевым применением проверяйте запрос в консоли на копии базы.