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

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

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

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

Оператор ГДЕ располагается после конструкции ИЗ и перед группировкой или упорядочиванием. Его основная задача — наложить фильтр на результирующую таблицу. Каждое условие в блоке ГДЕ должно возвращать логическое значение (Истина или Ложь).

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

Рассмотрим простейший пример выборки номенклатуры с определенной группой учета:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

Номенклатура.ГруппаУчета = ЗНАЧЕНИЕ(Справочник.ГруппыУчетаНоменклатуры.Товары)

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

💡

Всегда используйте функцию ЗНАЧЕНИЕ() при ссылке на предопределенные элементы справочников. Это гарантирует, что запрос будет работать корректно даже если изменится UUID элемента в другой базе.

Логические операторы И, ИЛИ и НЕ

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

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

Пример сложной фильтрации документов по статусу и дате:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка,

РеализацияТоваровУслуг.Дата

ИЗ

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

ГДЕ

(РеализацияТоваровУслуг.Проведен = ИСТИНА И РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ)

ИЛИ РеализацияТоваровУслуг.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийРеализации.КомиссионнаяПродажа)

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

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

☑️ Проверка логики запроса

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

Работа с диапазонами и множествами значений

Часто возникает необходимость отобрать данные за определенный период или список конкретных контрагентов. Для работы с диапазонами чисел и дат используются операторы МЕЖДУ, БОЛЬШЕ, МЕНЬШЕ. Для проверки вхождения в список значений предназначен оператор В.

Оператор МЕЖДУ включает граничные значения в выборку. Это эквивалентно конструкции "больше или равно И меньше или равно". При работе с датами и временем Если указать только дату, время будет считаться 00:00:00.

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

Оператор Описание Пример использования
МЕЖДУ Диапазон значений (включая границы) Дата МЕЖДУ &ДатаНач И &ДатаКон
В Вхождение в список значений Контрагент В (&СписокКонтрагентов)
ПОДОБНО Поиск по маске строки Наименование ПОДОБНО "%Товар%"

Особое внимание стоит уделить оператору ПОДОБНО. Он позволяет искать подстроки с использованием символов подстановки. Знак процента % заменяет любое количество символов, а знак подчеркивания _ — ровно один символ. Однако использование этого оператора с wildcard-символами в начале строки (например, "%Товар") часто приводит к полному сканированию таблицы и падению производительности.

Как работает индекс при использовании ПОДОБНО?

Если шаблон начинается с конкретных символов (например, "Товар%"), СУБД может использовать индекс для ускорения поиска. Если шаблон начинается с %, индекс игнорируется, и происходит полное чтение таблицы.

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

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

Избегайте применения функций к полям таблицы в левой части условия. Например, конструкция ГОД(Дата) = 2026 вынуждает систему вычислять функцию для каждой строки таблицы, что исключает использование индекса по полю Дата. Правильный подход — использовать диапазон дат.

Вместо функции лучше написать:

ГДЕ

Дата >= НАЧАЛОГОДА(2026) И Дата < НАЧАЛОГОДА(2026)

Такая запись позволяет СУБД сразу отсечь огромные пласты данных, не читая их физически с диска. Это правило применимо ко всем функциям преобразования типов, получения части строки или математическим операциям над полями.

💡

Никогда не применяйте функции к полям таблицы в левой части условия сравнения. Это главный враг производительности запросов в 1С.

Также стоит учитывать селективность условий. Если у вас есть условие, которое отсекает 90% данных, и условие, отсекающее 10%, поставьте более селективное условие первым. Хотя оптимизатор запросов 1С старается делать это автоматически, явное указание помогает в сложных случаях.

📊 С какой проблемой оптимизации вы сталкиваетесь чаще всего?
Медленные отчеты
Блокировки таблиц
Ошибки блокировок
Сложные соединения

Обработка NULL значений и пустых строк

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

Для проверки на NULL нельзя использовать операторы сравнения (= или <>). Необходимо применять специальные конструкции ЕСТЬ NULL и ЕСТЬ НЕ NULL. Попытка сравнить поле с NULL через равно всегда вернет ЛОЖЬ (или НЕИЗВЕСТНО в трехзначной логике), что приведет к потере данных.

Пример корректной фильтрации:

ВЫБРАТЬ

Сотрудник.Ссылка,

Сотрудник.ДатаУвольнения

ИЗ

Справочник.Сотрудники КАК Сотрудник

ГДЕ

Сотрудник.ДатаУвольнения ЕСТЬ NULL

Этот запрос выберет только действующих сотрудников, у которых не заполнена дата увольнения. Если бы мы написали ДатаУвольнения = NULL, результат был бы пустым.

⚠️ Внимание: При объединении результатов запросов (ОБЪЕДИНИТЬ) значения NULL в полях разных типов могут приводить к ошибкам приведения типов. Всегда явно указывайте тип значения в таких случаях.

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

Параметризация запросов и безопасность

Использование параметров в запросах — это не только вопрос удобства, но и безопасности, а также производительности. Параметры обозначаются символом & перед именем. Значения параметров передаются в объект запроса перед выполнением.

Параметризация позволяет СУБД кэшировать план выполнения запроса. Если вы каждый раз подставляете значения напрямую в текст запроса (конкатенация строк), сервер вынужден компилировать новый план для каждого уникального набора значений, что увеличивает нагрузку на процессор.

Кроме того, использование параметров защищает от SQL-инъекций в тех случаях, когда часть условия формируется динамически на основе ввода пользователя. В среде 1С это особенно актуально при работе с внешними источниками данных или веб-сервисами.

  • 🚀 Параметры улучшают читаемость кода запроса.
  • 🚀 Включается механизм кэширования планов выполнения на стороне СУБД.
  • 🚀 Упрощается отладка и тестирование различных сценариев выборки.

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

При передаче списка значений в параметр используйте тип СписокЗначений или таблицу значений. Это позволяет передать множество элементов в одном параметре и использовать его в операторе В без ограничения на длину строки запроса.

Частые ошибки и способы их устранения

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

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

Для исправления такой ошибки необходимо перенести условие в секцию ИМЕЮЩИЕ:

ВЫБРАТЬ

Контрагент,

СУММА(Сумма) КАК ОбщаяСумма

ИЗ

ВиртуальнаяТаблица

ГДЕ

Период МЕЖДУ &Нач И &Кон

СГРУППИРОВАТЬ ПО

Контрагент

ИМЕЮЩИЕ

СУММА(Сумма) > 1000

Здесь условие по сумме применяется уже к сгруппированным данным. Попытка написать ГДЕ СУММА(Сумма) > 1000 вызовет ошибку выполнения запроса.

Почему нельзя использовать агрегаты в ГДЕ?

Секция ГДЕ фильтрует строки до группировки. Агрегатные функции вычисляются после группировки. Поэтому логически невозможно применить результат агрегации до того, как он вычислен.

FAQ: Вопросы и ответы

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

Да, вы можете использовать вложенные запросы в условии ГДЕ, особенно с операторами В или СУЩЕСТВУЕТ. Это мощный инструмент для фильтрации по данным из других таблиц без явных соединений ЛЕВОЕ СОЕДИНЕНИЕ.

В чем разница между ПУСТОЙ СТРОКОЙ и NULL в 1С?

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

Как отфильтровать записи по текущему пользователю?

Используйте системную функцию &ТекущийПользователь в параметре запроса или функцию ПОЛЬЗОВАТЕЛЬ() в тексте запроса, сравнивая её с полем ссылки на пользователя в таблице.

Почему запрос с ПОДОБНО работает медленно?

Если шаблон поиска начинается с символа подстановки (например, "%слово"), база данных не может использовать индекс и вынуждена перебирать все строки таблицы. Старайтесь фиксировать начало строки в шаблоне.

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

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