Работа с базами данных в 1С:Предприятие невозможна без умения формировать гибкие запросы. Одним из ключевых элементов любого SQL-подобного запроса являются условия отбора — они позволяют получать только те данные, которые соответствуют заданным критериям. Без грамотного использования условий даже простейший отчёт может возвращать тысячи ненужных строк, а аналитика превратится в поиск иголки в стоге сена.
В этой статье мы разберём все виды условий в запросах 1С — от базового оператора WHERE до сложных логических конструкций с AND, OR, IN и LIKE. Вы узнаете, как фильтровать данные по датам, строкам, числам, а также как комбинировать несколько условий для точного отбора. Особое внимание уделим типичным ошибкам новичков при работе с условиями в запросах 1С, которые приводят к некорректным результатам или падению производительности.
Базовый синтаксис: оператор WHERE
Оператор WHERE — основа любого условия в запросе. Он позволяет отфильтровать строки по заданному критерию. В 1С синтаксис условия идентичен стандартному SQL, но с учётом особенностей платформы.
Пример простейшего запроса с условием:
ВЫБРАТЬ
Номенклатура.Наименование,
Номенклатура.Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ПометкаУдаления = ЛОЖЬ
Здесь мы выбираем только те позиции номенклатуры, которые не помечены на удаление. Обратите внимание, что в 1С логические значения записываются как ИСТИНА/ЛОЖЬ, а не 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
Для работы со списками значений, диапазонами и частичным совпадением строк в 1С предусмотрены специальные операторы.
Оператор IN позволяет проверить принадлежность значения к списку:
ВЫБРАТЬ
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Группа В (&СписокГрупп)
BETWEEN удобен для работы с диапазонами (даты, числа):
ВЫБРАТЬ
Документ.Дата,
Документ.Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Дата МЕЖДУ ДАТАВРЕМЯ(2026, 01, 01) И ДАТАВРЕМЯ(2026, 03, 31)
LIKE используется для поиска по шаблону (с учётом регистра!):
ВЫБРАТЬ
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Наименование ПОДОБНО "ООО %Торг%"
- 📋
IN— проверка на принадлежность списку (аналог множественногоOR) - 📊
BETWEEN— диапазон значений (включительно) - 🔍
LIKE— поиск по шаблону (%— любое количество символов,_— один символ) - 🔠
ПОДОБНО— синонимLIKEв синтаксисе 1С
Условия с параметрами и динамические запросы
В реальных задачах условия часто формируются динамически на основе пользовательского ввода или других данных программы. Для этого в 1С используются параметры запроса, которые обозначаются символом &.
Пример запроса с параметром:
ВЫБРАТЬ
Товары.Наименование,
Товары.Цена
ИЗ
Справочник.Номенклатура КАК Товары
ГДЕ
Товары.Цена > &МинимальнаяЦена
И Товары.Группа = &ВыбраннаяГруппа
В коде программы параметры передаются через коллекцию Параметры:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Цена > &МинимальнаяЦена";
Запрос.УстановитьПараметр("МинимальнаяЦена", 1000);
Результат = Запрос.Выполнить();
⚠️ Внимание: При передаче дат в параметры используйте тип Дата, а не строку. Иначе может произойти неявное приведение типов с неожиданными результатами.
Указать все параметры с символом & в тексте запроса|Проверить типы передаваемых значений|Обработать возможные NULL-значения|Протестировать запрос с крайними значениями-->
Работа с NULL и пустыми значениями
Особое внимание в условиях требует обработка пустых ссылок и NULL-значений. В 1С для этого предусмотрены специальные конструкции:
Проверка на пустую ссылку:
ГДЕ
Поставщик.Ссылка ЕСТЬ NULL // Поставщик не указан
// или
Поставщик.Ссылка ЕСТЬНЕ NULL // Поставщик указан
Сравнение с пустым значением:
ГДЕ
Документ.Комментарий = "" // Пустая строка
// или
Документ.Комментарий <> "" // Непустая строка
Важный нюанс: в 1С пустая ссылка и 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
)
В:ГДЕ Товар.Группа В (
ВЫБРАТЬ ГруппыНоменклатуры.Ссылка
ИЗ Справочник.ГруппыНоменклатуры КАК ГруппыНоменклатуры
ГДЕ ГруппыНоменклатуры.Уровень = 1
)
Почему условие с LIKE не находит некоторые строки?
Проверьте:
- Регистр символов (по умолчанию поиск регистрозависимый)
- Наличие пробелов или непечатаемых символов в данных
- Кодировку базы данных (может влиять на сравнение символов)
Для регистронезависимого поиска используйте:
ГДЕ ВРЕГ(Наименование) ПОДОБНО ВРЕГ("-%текст%")
Как оптимизировать запрос с большим количеством условий OR?
Замените конструкцию с OR на несколько запросов с UNION ALL:
ВЫБРАТЬ Поля Из Таблица1 ГДЕ Условие1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Поля Из Таблица1 ГДЕ Условие2
Это позволит СУБД использовать индексы для каждого условия отдельно.