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