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