Работа с данными в платформе 1С:Предприятие 8 немыслима без языка запросов. Среди всех конструкций именно оператор ГДЕ является фундаментом для фильтрации информации. Он позволяет отсекать лишние записи еще на уровне базы данных, что критически важно для производительности системы. Многие начинающие разработчики допускают ошибки в синтаксисе или логике построения условий, что приводит к медленной работе отчетов и некорректным выборкам.

Понимание принципов работы этого оператора открывает двери к написанию эффективного кода. Вы научитесь комбинировать условия, использовать логические связки и правильно обрабатывать отсутствующие значения. В этой статье мы детально разберем синтаксис, приоритеты операций и типичные сценарии использования, с которыми вы столкнетесь в реальной разработке конфигураций.

Базовый синтаксис и место в структуре запроса

Оператор ГДЕ всегда следует сразу после ключевого слова ВЫБРАТЬ и списка полей. Его главная задача — наложить фильтр на источник данных до того, как система начнет формировать итоговый результат. Если условие не выполнено, запись просто не попадает в выборку, экономя ресурсы процессора и памяти.

Синтаксически конструкция выглядит как логическое выражение, возвращающее булево значение (Истина или Ложь). Вы можете сравнивать поля таблицы с константами, другими полями или результатами функций.

⚠️ Внимание: Оператор ГДЕ не поддерживает прямое использование агрегатных функций (СУММА, КОЛИЧЕСТВО) без группировки. Для фильтрации по итогам расчетов необходимо использовать оператор ИМЕЮЩИЕ.

Рассмотрим простейший пример выборки номенклатуры, у которой установлен флаг "ЭтоУслуга".

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

Номенклатура.ЭтоУслуга = ИСТИНА

Здесь мы обращаемся к конкретному реквизиту справочника. Платформа оптимизирует такой запрос, используя индексы базы данных для быстрого поиска нужных строк. Использование псевдонимов таблиц делает код более читаемым и компактным.

💡

Всегда используйте псевдонимы для таблиц (КАК Таблица), чтобы избежать конфликтов имен полей при объединении данных из разных источников.

Логические операторы и приоритеты вычислений

Сложные условия фильтрации строятся с помощью логических связок И (AND), ИЛИ (OR) и НЕ (NOT). Правильное их сочетание позволяет реализовывать гибкие сценарии отбора. Однако, порядок вычисления этих операторов строго регламентирован правилами приоритета, нарушение которых ведет к логическим ошибкам.

Приоритет операций следующий: сначала выполняется НЕ, затем И, и в последнюю очередь ИЛИ. Если вам нужно изменить этот порядок, необходимо использовать круглые скобки. Это аналогично математическим формулам, где скобки диктуют последовательность действий.

  • 🔹 Оператор И требует одновременного выполнения всех смежных условий.
  • 🔹 Оператор ИЛИ пропускает запись, если выполнено хотя бы одно из условий.
  • 🔹 Оператор НЕ инвертирует результат проверки условия.

Представьте ситуацию, когда нужно выбрать документы, проведенные сегодня, но только если они не помечены на удаление. Логика будет следующей:

ГДЕ

Документ.Дата >= НАЧАЛОДНЯ(&Дата)

И Документ.Дата < КОНЕЦДНЯ(&Дата)

И НЕ Документ.ПометкаУдаления

Если же требуется выбрать товары определенной группы ИЛИ товары с конкретной характеристикой, скобки становятся обязательными для группировки условий ИЛИ, чтобы они не "расползлись" по всему запросу из-за более высокого приоритета оператора И.

📊 Какой логический оператор вызывает у вас больше всего затруднений?
И (AND)
ИЛИ (OR)
НЕ (NOT)
Вложенные скобки

Работа с неопределенными значениями (NULL)

В реляционных базах данных, включая те, что используются в 1С:Предприятие, отсутствие значения обозначается ключевым словом NULL (или ЕСТЬNULL в контексте функций). Обычные операторы сравнения (=, <>) с NULL работают не так, как с числами или строками. Результат сравнения с NULL всегда неопределен.

Для корректной проверки на наличие или отсутствие значения используются специальные конструкции ЕСТЬNULL и НЕ ЕСТЬNULL. Попытка написать условие Поле = NULL является распространенной ошибкой новичков, которая никогда не вернет ожидаемый результат.

Конструкция Описание Пример использования
ЕСТЬNULL(Поле) Проверка, что значение отсутствует ГДЕ ЕСТЬNULL(Контрагент.ИНН)
НЕ ЕСТЬNULL(Поле) Проверка, что значение заполнено ГДЕ НЕ ЕСТЬNULL(Заказ.Комментарий)
ЕСТЬNULL(Поле, Замена) Подстановка значения, если поле пусто ГДЕ ЕСТЬNULL(Цена, 0) > 100

Функция ЕСТЬNULL также позволяет подменять пустые значения на дефолтные прямо в условии. Это удобно, когда нужно сравнить поле с числом, но в базе могут быть пустые ячейки, которые при обычном сравнении вызвали бы ошибку логики.

⚠️ Внимание: В условиях соединения таблиц (ЛЕВОЕ СОЕДИНЕНИЕ) проверка правой таблицы на НЕ ЕСТЬNULL в секции ГДЕ может превратить внешнее соединение во внутреннее. Будьте осторожны с размещением таких условий.

Использование параметров и динамическая фильтрация

Жестко заданные условия в тексте запроса делают код негибким. Для создания универсальных отчетов и обработок используются параметры. Они передаются в запрос из кода 1С и позволяют менять критерии отбора без изменения текста запроса.

Параметры обозначаются знаком амперсанда &. В теле запроса вы ссылаетесь на них как на обычные значения. Это особенно полезно для фильтрации по периодам, конкретным контрагентам или складам, которые пользователь выбирает в форме отчета.

Часто возникает ситуация, когда параметр может быть не заполнен пользователем. В таком случае фильтр должен игнорироваться. Реализуется это через проверку параметра на ЕСТЬNULL внутри самого условия ГДЕ.

ГДЕ

(ЕСТЬNULL(&Менеджер, Ссылка) = Ссылка)

И (ЕСТЬNULL(&ДатаНачала, Дата) >= Дата)

Здесь, если параметр &Менеджер не заполнен, условие превращается в Ссылка = Ссылка, что всегда истинно, и фильтр снимается. Если же менеджер выбран, происходит обычное сравнение.

Оптимизация параметров

Использование параметров в условии ГДЕ позволяет серверу 1С кэшировать план выполнения запроса. Если вы будете подставлять значения прямо в текст запроса через конкатенацию строк, план будет перестраиваться каждый раз, что снижает производительность.

Сравнение строк и поиск по подстроке

При работе с текстовыми данными часто требуется найти записи, содержащие определенный фрагмент информации. Для этого в языке запросов 1С предусмотрен оператор ПОДОБНО. Он использует символы подстановки для формирования масок поиска.

Звездочка * заменяет любую последовательность символов (включая пустую строку), а знак процента % заменяет ровно один любой символ. Это мощный инструмент для реализации поиска "как в Google" внутри ваших справочников.

  • 🔸 ПОДОБНО "Альфа" — найдет все строки, содержащие слово "Альфа" в любом месте.
  • 🔸 ПОДОБНО "А%а" — найдет строки, начинающиеся на "А", имеющие любой один символ в середине и заканчивающиеся на "а".
  • 🔸 ПОДОБНО "Тест%" — найдет все строки, начинающиеся с "Тест".

Важно учитывать, что поиск с использованием ПОДОБНО с ведущей звездочкой (например, *текст) является ресурсоемкой операцией. База данных не может использовать индекс для такого поиска и вынуждена просматривать все записи таблицы.

Если производительность критична, старайтесь избегать условий, где маска начинается с подстановочного знака. Лучше использовать полнотекстовый поиск или заранее подготовленные регистры сведений для таких задач.

💡

Оператор ПОДОБНО регистрозависим в некоторых СУБД, но в 1С на уровне платформы сравнение строк обычно нечувствительно к регистру, если не задано иное в настройках базы.

Вложенные запросы и существование записей

Иногда условие отбора зависит от наличия связанных записей в других таблицах. Например, нужно выбрать только тех контрагентов, у которых есть хотя бы один договор. Для этого используется конструкция СУЩЕСТВУЕТ с вложенным запросом.

Вложенный запрос выполняется для каждой строки внешнего запроса. Если он возвращает хотя бы одну запись, условие считается истинным. Это эффективный способ фильтрации без использования лишних соединений, которые могут дублировать строки результата.

ВЫБРАТЬ

Контрагенты.Наименование

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

СУЩЕСТВУЕТ (

ВЫБРАТЬ 1

ИЗ

Справочник.ДоговорыКонтрагентов КАК Договоры

ГДЕ

Договоры.Контрагент = Контрагенты.Ссылка

)

Такой подход гарантирует, что каждый контрагент попадет в выборку только один раз, независимо от количества его договоров. Это отличается от обычного СОЕДИНЕНИЕ, где при наличии нескольких договоров строка с контрагентом продублировалась бы.

⚠️ Внимание: Интерфейс и возможности конструктора запросов могут меняться в новых версиях платформы 1С. Всегда сверяйте доступные функции в справке по вашей конкретной версии конфигурации и платформы.

Часто задаваемые вопросы (FAQ)

Можно ли использовать несколько операторов ГДЕ в одном запросе?

Нет, в одном запросе может быть только одна секция ГДЕ. Все необходимые условия должны быть объединены внутри этой секции с помощью логических операторов И, ИЛИ и скобок.

В чем разница между ГДЕ и ИМЕЮЩИЕ?

ГДЕ фильтрует записи до группировки и агрегации данных. ИМЕЮЩИЕ фильтрует уже сгруппированные результаты, позволяя использовать в условиях агрегатные функции, такие как СУММА или СРЕДНЕЕ.

Почему запрос с ГДЕ работает медленно?

Медленная работа часто вызвана использованием функций над полями в условии (например, ГОД(Дата) = 2023), что отключает использование индексов. Также причиной может быть поиск по подстроке с ведущим символом * или отсутствие индексов по полям фильтрации.

Как проверить поле на пустую строку?

Пустая строка и NULL — это разные значения. Для проверки на пустую строку используйте обычное сравнение: Поле = "". Для проверки на отсутствие значения используйте ЕСТЬNULL(Поле).

Можно ли в ГДЕ сравнивать поля из разных таблиц без соединения?

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

☑️ Проверка корректности условия ГДЕ

Выполнено: 0 / 5