Работа с выборкой данных является фундаментом любого сложного решения на платформе 1С:Предприятие 8. Когда вы пишете код, который обращается к базе данных, критически важно уметь фильтровать информацию еще на этапе формирования запроса. Это позволяет значительно снизить нагрузку на сервер и ускорить работу программы.
Условие в запросе 1С — это не просто проверка на равенство. Это мощный инструмент, позволяющий оперировать диапазонами, списками значений, частичным совпадением строк и сложной логикой. Неправильное использование конструкций может привести к полному сканированию таблиц, что губительно для производительности в высоконагруженных системах.
В этой статье мы детально разберем синтаксис оператора ГДЕ, рассмотрим особенности работы с параметрами и изучим нюансы, о которых часто забывают даже опытные разработчики. Вы научитесь писать эффективные условия, которые будут работать быстро и предсказуемо в любой конфигурации.
Базовый синтаксис оператора ГДЕ
Любое условие в языке запросов 1С начинается с ключевого слова ГДЕ. Оно располагается после перечисления полей в секции ВЫБРАТЬ и перед возможными группировками или объединениями. Именно здесь определяется логика отбора записей из виртуальной таблицы результата.
Простейший пример условия выглядит как сравнение поля с конкретным значением или параметром. Платформа автоматически преобразует текст запроса в SQL-код, оптимизируя его под конкретную СУБД, будь то MSSQL, PostgreSQL или встроенная база. Однако синтаксис самого языка запросов 1С остается единым.
Обратите внимание, что имена полей в условии должны совпадать с псевдонимами, объявленными в секции выбора, или с реальными именами полей таблиц, указанных в секции ИЗ. Использование несуществующих полей вызовет ошибку компиляции модуля.
ВЫБРАТЬ
Справочник.Номенклатура.Ссылка КАК Ссылка,
Справочник.Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура
ГДЕ
Справочник.Номенклатура.ЭтоГруппа = ЛОЖЬ
В приведенном примере мы отбираем только элементы справочника, исключая папки. Это классический пример булевого условия.
Оператор ГДЕ применяется до выполнения группировки данных, поэтому в нем нельзя использовать агрегатные функции типа СУММА или КОЛИЧЕСТВО.
Работа с параметрами запроса
Жестко заданные значения в коде запроса используются редко, так как делают код негибким. Гораздо правильнее использовать параметры. В тексте запроса они обозначаются символом &, за которым следует имя параметра. Значение параметра передается из программного кода перед выполнением запроса.
Использование параметров не только упрощает поддержку кода, но и защищает от SQL-инъекций, а также позволяет системе 1С кэшировать планы выполнения запросов. Если вы меняете только значение параметра, но не текст запроса, СУБД может использовать уже подготовленный план исполнения.
Для передачи значений параметров используется объект Структура или Соответствие в встроенном языке. Ключом структуры должно быть имя параметра без символа амперсанда, а значением — то, что вы хотите подставить в запрос.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Документ.РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг
|ГДЕ
| Документ.РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ТекущаяДата()));
В данном фрагменте кода мы динамически формируем интервал дат. Оператор МЕЖДУ удобен для работы с периодами, так как включает в себя обе граничные даты. Это часто требуется при построении отчетов за месяц или квартал.
Если параметр может принимать значение Неопределено, используйте конструкцию "ИСТИНА ИЛИ Поле = &Параметр", чтобы условие игнорировалось при отсутствии фильтра.
Логические операторы и группировка условий
Часто одного условия недостаточно для точной выборки данных. В таких случаях на помощь приходят логические операторы И, ИЛИ и НЕ. Они позволяют комбинировать несколько простых условий в одно сложное логическое выражение.
Приоритет выполнения операторов в 1С стандартный: сначала выполняется НЕ, затем И, и в последнюю очередь ИЛИ. Чтобы изменить порядок вычислений, необходимо использовать круглые скобки. Игнорирование приоритета — частая причина логических ошибок в отчетах.
Рассмотрим пример, где нам нужно найти товары определенной категории, которые либо имеют остаток больше нуля, либо являются услугами. Без скобок запрос может сработать некорректно, захватив лишние записи.
- 🔹 Оператор И требует одновременного выполнения всех связанных условий.
- 🔹 Оператор ИЛИ возвращает истину, если хотя бы одно из условий верно.
- 🔹 Оператор НЕ инвертирует результат, выбирая записи, не удовлетворяющие условию.
Важно группировать условия осмысленно. Чтение сложного запроса должно быть интуитивно понятным другому разработчику. Если логика становится слишком запутанной, возможно, стоит разбить запрос на несколько этапов или использовать временные таблицы.
⚠️ Внимание: Избыточное использование оператора ИЛИ на больших таблицах без надлежащих индексов может привести к серьезному замедлению работы базы данных. Всегда проверяйте план выполнения.
Операторы сравнения и работа со строками
Помимо равенства, язык запросов 1С поддерживает широкий спектр операторов сравнения. Для числовых полей и дат стандартно используются >, <, >=, <=. Однако работа со строковыми полями имеет свои особенности, связанные с кодировкой и длиной строк.
Для поиска подстроки или шаблона используется оператор ПОДОБНО. В шаблоне можно использовать символы подстановки: знак процента % заменяет любую последовательность символов, а символ подчеркивания _ заменяет ровно один любой символ.
Также существует оператор КАК (в некоторых контекстах упоминается как поиск начала строки), но ПОДОБНО является более универсальным инструментом. При использовании ПОДОБНО важно учитывать регистр символов, если в базе данных настроен регистрозависимый режим сравнения.
| Оператор | Описание | Пример использования |
|---|---|---|
= |
Равенство | ВидНоменклатуры = &Вид |
ПОДОБНО |
Поиск по маске | Наименование ПОДОБНО "%Шкаф%" |
В |
Вхождение в список | Ссылка В (&СписокСсылок) |
ЕСТЬ NULL |
Проверка на пустое значение | Комментарий ЕСТЬ NULL |
Оператор В особенно полезен, когда нужно проверить вхождение значения в заранее сформированный список. Список может быть передан как параметр типа СписокЗначений или Массив. Это позволяет избежать громоздких конструкций с множеством ИЛИ.
Условия для работы с датами и временем
Дата и время в 1С хранятся с высокой точностью, что создает определенные сложности при фильтрации. Часто разработчики хотят выбрать документы за конкретный день, но забывают, что время также является частью значения даты.
Если вы напишете условие Дата = &ДатаПараметр, где параметр равен началу дня (00:00:00), вы получите только те документы, которые проведены ровно в полночь. Все остальные документы за этот день будут отсечены.
Для корректной выборки за период всегда используйте операторы сравнения диапазонов или специализированные функции. Наиболее надежный способ — явное указание начала и конца интервала с помощью функций НачалоДня и КонецДня.
ГДЕ
Документ.Дата >= &НачалоПериода
И Документ.Дата <= &КонецПериода
Альтернативный вариант — использование оператора МЕЖДУ, который делает код более читаемым. Однако помните, что МЕЖДУ включает граничные точки. Если вам нужно исключить конец периода, придется использовать строгое неравенство <.
Нюанс високосных лет
При расчете периодов программно учитывайте, что функция КонецМесяца автоматически корректно определяет количество дней в феврале (28 или 29).
Проверка на пустые значения и ссылки
В реляционных базах данных и в 1С существует понятие NULL (Неопределено). Это не ноль и не пустая строка, а специальное состояние, означающее отсутствие значения. Для проверки на NULL нельзя использовать оператор равенства =.
В языке запросов 1С для этой цели предусмотрены специальные конструкции ЕСТЬ NULL и НЕ ЕСТЬ NULL. Попытка написать Поле = NULL всегда вернет ложь, так как неизвестное значение не может быть равно самому себе в контексте SQL-логики.
Это особенно актуально при работе с реквизитами справочников или документов, которые не являются обязательными к заполнению. Например, поиск заказов, по которым еще не указан менеджер или не заполнен комментарий.
⚠️ Внимание: Пустая строка""и значениеNULL— это разные вещи. Убедитесь, что вы ищете именно то, что нужно, особенно если в базе могут встречаться оба варианта.
Также часто возникает задача проверить, является ли ссылка пустой (ссылка на несуществующий объект). Для полей типа Ссылка проверка на NULL обычно означает проверку на пустую ссылку. Однако стоит быть осторожным при объединении таблиц, где пустые значения могут возникать из-за отсутствия совпадений в левом соединении.
☑️ Проверка условия перед запуском
Частые ошибки и оптимизация условий
Написание условия — это только полдела. Важно, чтобы это условие выполнялось быстро. Самая распространенная ошибка — наложение функций на поля таблицы в секции ГДЕ. Например, использование ГОД(Дата) = 2026.
Когда вы применяете функцию к полю таблицы, система 1С часто не может использовать индекс по этому полю. Это приводит к полному перебору всех записей таблицы (Table Scan), что катастрофически медленно на больших объемах данных.
Вместо этого следует преобразовывать параметр, а не поле. Правильный подход: сравнивать поле Дата с диапазоном, соответствующим 2026 году, который вычисляется в коде перед запросом. Так индекс по дате будет использован максимально эффективно.
Еще одна ошибка — неявное преобразование типов. Если поле имеет тип Число, а вы сравниваете его со строкой "100", это может сработать, но ценой производительности. Всегда передавайте параметры строго тех типов, которые объявлены в метаданных.
⚠️ Внимание: Интерфейсы и возможности конструктора запросов могут меняться в новых версиях платформы 1С. Всегда сверяйтесь с синтаксис-помощником вашей конкретной версии конфигурации.
Золотое правило оптимизации: никогда не применяйте функции к полям таблицы в условии ГДЕ, преобразуйте только параметры запроса.
Можно ли использовать в условии вызов функций встроенного языка?
Нет, в тексте запроса 1С доступны только встроенные функции языка запросов (например, ЕСТЬNULL, ВЫБОР, математические операции). Функции встроенного языка 1С, такие как Формат() или СокрЛ(), внутри запроса не работают.
В чем разница между ПОДОБНО и LIKE?
В языке запросов 1С оператор называется ПОДОБНО. Синтаксис LIKE используется в нативном SQL (например, в T-SQL или PL/SQL). При написании запросов внутри 1С вы должны использовать терминологию платформы 1С.
Как передать список значений в параметр запроса?
Для передачи списка используйте тип данных СписокЗначений или Массив. В тексте запроса параметр должен использоваться с оператором В. Пример: ГДЕ Ссылка В (&МойСписок).
Почему запрос не видит данные, которые есть в базе?
Проверьте права доступа пользователя. Даже если условие написано верно, механизм RLS (Record Level Security) может скрывать данные на уровне прав. Также убедитесь, что вы не фильтруете по помеченным на удаление объектам, если это не указано явно.
Можно ли писать многострочные условия?
Да, язык запросов 1С поддерживает многострочный синтаксис. Для переноса строки внутри текста запроса в коде используется символ вертикальной черты | в начале каждой новой строки, как показано в примерах выше.