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

В этой статье мы разберём все виды условий в запросах — от базового оператора WHERE до сложных логических конструкций с AND, OR, IN и LIKE. Вы узнаете, как фильтровать данные по датам, строкам, числам, а также как комбинировать несколько условий для точного отбора. Особое внимание уделим типичным ошибкам новичков при работе с условиями в запросах 1С, которые приводят к некорректным результатам или падению производительности.

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

Оператор WHERE — основа любого условия в запросе. Он позволяет отфильтровать строки по заданному критерию. В синтаксис условия идентичен стандартному SQL, но с учётом особенностей платформы.

Пример простейшего запроса с условием:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

Здесь мы выбираем только те позиции номенклатуры, которые не помечены на удаление. Обратите внимание, что в логические значения записываются как ИСТИНА/ЛОЖЬ, а не TRUE/FALSE как в классическом SQL.

  • 📌 Сравнение чисел: Цена > 1000 или Количество <= 5
  • 📅 Фильтрация дат: ДатаДокумента = ДАТАВРЕМЯ(2026, 05, 15)
  • 🔤 Строковые значения: Наименование = "Стул офисный" (регистрозависимо!)
  • 🔢 Проверка на NULL: Поставщик.Ссылка ЕСТЬ NULL или ЕСТЬНЕ NULL
💡

В запросах 1С для обозначения параметров используйте знак & перед именем (например, &ДатаНачала). Это позволит передавать значения из кода программы динамически.

Логические операторы: AND, OR, NOT

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

Основные правила:

  • 🔗 ANDлогическое И (оба условия должны выполняться)
  • 🔀 ORлогическое ИЛИ (достаточно выполнения одного условия)
  • 🚫 NOTотрицание (инвертирует условие)

Пример запроса с несколькими условиями:

ВЫБРАТЬ

Клиенты.Наименование,

Клиенты.ИНН

ИЗ

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

ГДЕ

Клиенты.ВидКонтрагента = ЗНАЧЕНИЕ(Перечисление.ВидыКонтрагентов.Покупатель)

И Клиенты.ДатаРегистрации > ДАТАВРЕМЯ(2023, 01, 01)

И НЕ Клиенты.ЧерныйСписок = ИСТИНА

⚠️ Внимание: При использовании OR в запросах с большим количеством данных может резко упасть производительность. Старайтесь заменять OR на UNION ALL для сложных условий.
Оператор Пример использования Эквивалент в коде 1С
AND Цена > 1000 AND Количество < 10 И
OR Город = "Москва" OR Город = "Санкт-Петербург" ИЛИ
NOT NOT ПометкаУдаления = ИСТИНА НЕ

Специальные операторы: IN, BETWEEN, LIKE

Для работы со списками значений, диапазонами и частичным совпадением строк в предусмотрены специальные операторы.

Оператор IN позволяет проверить принадлежность значения к списку:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Номенклатура.Группа В (&СписокГрупп)

BETWEEN удобен для работы с диапазонами (даты, числа):

ВЫБРАТЬ

Документ.Дата,

Документ.Сумма

ИЗ

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

ГДЕ

Документ.Дата МЕЖДУ ДАТАВРЕМЯ(2026, 01, 01) И ДАТАВРЕМЯ(2026, 03, 31)

LIKE используется для поиска по шаблону (с учётом регистра!):

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Контрагенты.Наименование ПОДОБНО "ООО %Торг%"

  • 📋 IN — проверка на принадлежность списку (аналог множественного OR)
  • 📊 BETWEEN — диапазон значений (включительно)
  • 🔍 LIKE — поиск по шаблону (% — любое количество символов, _ — один символ)
  • 🔠 ПОДОБНО — синоним LIKE в синтаксисе 1С
📊 Какой оператор вы используете чаще всего в запросах 1С?
WHERE
AND/OR
IN
BETWEEN
LIKE

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

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

Пример запроса с параметром:

ВЫБРАТЬ

Товары.Наименование,

Товары.Цена

ИЗ

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

ГДЕ

Товары.Цена > &МинимальнаяЦена

И Товары.Группа = &ВыбраннаяГруппа

В коде программы параметры передаются через коллекцию Параметры:

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

Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Цена > &МинимальнаяЦена";

Запрос.УстановитьПараметр("МинимальнаяЦена", 1000);

Результат = Запрос.Выполнить();

⚠️ Внимание: При передаче дат в параметры используйте тип Дата, а не строку. Иначе может произойти неявное приведение типов с неожиданными результатами.

Указать все параметры с символом & в тексте запроса|Проверить типы передаваемых значений|Обработать возможные NULL-значения|Протестировать запрос с крайними значениями-->

Работа с NULL и пустыми значениями

Особое внимание в условиях требует обработка пустых ссылок и NULL-значений. В для этого предусмотрены специальные конструкции:

Проверка на пустую ссылку:

ГДЕ

Поставщик.Ссылка ЕСТЬ NULL // Поставщик не указан

// или

Поставщик.Ссылка ЕСТЬНЕ NULL // Поставщик указан

Сравнение с пустым значением:

ГДЕ

Документ.Комментарий = "" // Пустая строка

// или

Документ.Комментарий <> "" // Непустая строка

Важный нюанс: в пустая ссылка и NULL — это разные понятия. Пустая ссылка означает, что объект не выбран, а NULL — что поле не заполнено вообще.

Ситуация Правильный синтаксис Неправильный синтаксис
Проверка на пустую ссылку Ссылка ЕСТЬ NULL Ссылка = NULL
Проверка на непустую строку Строка <> "" Строка ЕСТЬНЕ NULL
Проверка на заполненное число Число > 0 Число <> NULL

Оптимизация условий в запросах

Неправильно составленные условия могут существенно замедлить выполнение запроса. Следуйте этим рекомендациям для оптимизации:

  • Индексируемые поля: Старайтесь фильтровать по полям, которые являются индексами в базе данных (например, коды, даты, ссылки).
  • 🔄 Порядок условий: Начинайте с самых "жёстких" условий, которые отсекают больше строк (например, сначала по дате, потом по другим полям).
  • 🚫 Избегайте функций: Условия вида ГОД(Дата) = 2026 не используют индексы. Лучше: Дата >= ДАТАВРЕМЯ(2026,01,01) И Дата < ДАТАВРЕМЯ(2026,01,01).
  • 📉 Ограничивайте выборку: Используйте ПЕРВЫЕ 100 или РАЗЛИЧНЫЕ, если не нужны все строки.

Пример оптимизированного запроса:

ВЫБРАТЬ ПЕРВЫЕ 100

Документ.Номер,

Документ.Дата,

Документ.Сумма

ИЗ

Документ.ЗаказПокупателя КАК Документ

ГДЕ

Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

И Документ.Организация = &Организация

И Документ.Сумма > 10000

УПОРЯДОЧИТЬ ПО

Документ.Дата УБЫВ

💡

Использование функции ВЫРАЗИТЬ() в условиях приводит к полному сканированию таблицы. Заменяйте её на явное сравнение типов, где это возможно.

Типичные ошибки и как их избежать

Даже опытные разработчики иногда допускают ошибки при составлении условий в запросах. Вот наиболее распространённые из них:

1. Неучёт регистра в строковых сравнениях:

ГДЕ Наименование = "стул"  // Не найдёт "Стул" или "СТУЛ"

Решение: используйте ВРЕГ(Наименование) = ВРЕГ("стул") или настройте регистронезависимый поиск на уровне СУБД.

2. Сравнение дат как строк:

ГДЕ ФОРМАТ(Дата, "ДФ=dd.MM.yyyy") = "15.05.2026"

Решение: всегда сравнивайте даты как даты: Дата = ДАТАВРЕМЯ(2026, 05, 15).

3. Избыточные условия:

ГДЕ (Цена > 1000) И (Цена > 500)  // Второе условие избыточно

4. Неправильная работа с NULL:

ГДЕ ПометкаУдаления = ЛОЖЬ  // Не найдёт записи, где ПометкаУдаления = NULL

Решение: ГДЕ НЕ ПометкаУдаления = ИСТИНА.

Почему запрос с LIKE "%текст%" работает медленно?

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

⚠️ Внимание: Синтаксис условий в запросах 1С может отличаться в зависимости от версии платформы и используемой СУБД (MS SQL, PostgreSQL, файловый вариант). Для критичных систем тестируйте запросы на целевой базе данных.

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

Как сделать условие по нескольким значениям одного поля?

Используйте оператор IN:

ГДЕ Город В ("Москва", "Санкт-Петербург", "Казань")

Альтернатива — несколько условий с OR:

ГДЕ Город = "Москва" ИЛИ Город = "Санкт-Петербург"
Можно ли в условии использовать функции 1С, например НАЧАЛОПЕРИОДА()?

Да, но это снизит производительность, так как функции не могут использовать индексы. Лучше вычислять границы периода заранее и передавать как параметры:

Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Как сделать условие "поле равно одному из значений другого запроса"?summary>

Используйте подзапрос с оператором В:

ГДЕ Товар.Группа В (

ВЫБРАТЬ ГруппыНоменклатуры.Ссылка

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

ГДЕ ГруппыНоменклатуры.Уровень = 1

)

Почему условие с LIKE не находит некоторые строки?

Проверьте:

  1. Регистр символов (по умолчанию поиск регистрозависимый)
  2. Наличие пробелов или непечатаемых символов в данных
  3. Кодировку базы данных (может влиять на сравнение символов)

Для регистронезависимого поиска используйте:

ГДЕ ВРЕГ(Наименование) ПОДОБНО ВРЕГ("-%текст%")
Как оптимизировать запрос с большим количеством условий OR?

Замените конструкцию с OR на несколько запросов с UNION ALL:

ВЫБРАТЬ Поля Из Таблица1 ГДЕ Условие1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ Поля Из Таблица1 ГДЕ Условие2

Это позволит СУБД использовать индексы для каждого условия отдельно.