Предложение ГДЕ / WHERE
Предложение ГДЕ позволяет задать условие отбора данных из исходных таблиц-источников запроса. В запросе будут выбраны только те записи, для которых выполняется заданное условие.
Например, выберем товары с ценой, большей или равной определенному значению:
ВЫБРАТЬ Наименование, ЗакупочнаяЦена КАК Цена
ИЗ Справочник.Номенклатура
ГДЕ ЗакупочнаяЦена >= 1300
Результат запроса будет следующий:


Логические операторы И, ИЛИ, НЕ
В условиях можно использовать логические операторы И, ИЛИ, НЕ, с помощью которых можно строить достаточно сложные логические выражения.
Например, выберем товары, произведенные в России по цене, меньшей определенного значения:
ВЫБРАТЬ Наименование,
ЗакупочнаяЦена КАК Цена,
СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ СтранаПроисхождения = "Россия" И ЗакупочнаяЦена < 1000

В реальных задачах крайне рекомендуется уточнять у пользователей условия на такого рода неравенства, потому что пользователь часто имеет в виду «меньше или равно», а не «строго меньше». Возможно, в данном запросе товары с ценой 1000 тоже подойдут, тогда знак «<» надо заменить на «<=».
При указании нескольких логических сомножителей И, ИЛИ, НЕ целесообразно расставлять скобки, чтобы правильно определить порядок выполнения логических операций и повысить наглядность запроса.
Например, следующие два запроса могут привести к неожиданным для программиста результатам, потому что оператор И имеет больший приоритет, чем ИЛИ (а оператор НЕ имеет еще больший приоритет, чем И):
ВЫБРАТЬ Наименование,
ЗакупочнаяЦена КАК Цена,
СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ СтранаПроисхождения = "Россия" ИЛИ СтранаПроисхождения = "США"
И ЗакупочнаяЦена < 1000
В результате мы получим следующие записи:
Этот запрос будет интерпретирован системой как «Выбрать все товары из страны Россия, независимо от цены, а также товары из страны США, которые дешевле 1000». Т.е. условие по цене будет проверяться только для товаров из США, а товары из России будут включены в запрос при любой цене. Вероятно, программист имел в виду совсем другое: «Выбрать товары из России и США, которые дешевле 1000», что реализовано вторым запросом. Условие по цене будет проверяться для всех товаров, независимо от страны-производителя:
ВЫБРАТЬ Наименование,
ЗакупочнаяЦена КАК Цена,
СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ (СтранаПроисхождения = "Россия" ИЛИ СтранаПроисхождения = "США")
И ЗакупочнаяЦена < 1000
Параметры в языке запросов
Обычно требуется, чтобы параметры условий пользователь мог указать самостоятельно в каком-либо диалоге. Для этого запрос конструируется с использованием параметров.
Обратите внимание, что в следующем запросе параметр МинЦена предваряется знаком «&».
ВЫБРАТЬ Наименование, ЗакупочнаяЦена
ИЗ Справочник.Номенклатура
ГДЕ ЗакупочнаяЦена >= &МинЦена
Общая схема выполнения запроса с параметрами выглядит сле-
дующим образом:
//создание объекта Запрос с текстом запроса
Запрос = Новый Запрос("Выбрать Наименование, Цена
| ИЗ Справочник.Номенклатура
| ГДЕ Цена >= ШинЦена");
//передача параметров в запрос
Запрос.УстановитьПараметр("МинЦена",1000);
//выполнение запроса с установленными параметрами
Результат = Запрос.Выполнить();
Стоит заметить, что для многих типов данных в языке запросов нет литералов, поэтому их значения можно задать только через параметры, даже если пользователь не должен их изменять.
Ключевое слово МЕЖДУ / BETWEEN
В языке запросов есть вспомогательное ключевое слово МЕЖДУ для задания интервалов. Например, если параметр МинЦена равен 1000, а МаксЦена — 1500, тогда следующий запрос выберет товары с ценой из указанного интервала:
ВЫБРАТЬ Наименование,
ЗакупочнаяЦена КАК Цена
ИЗ Справочник.Номенклатура
ГДЕ ЗакупочнаяЦена МЕЖДУ &МинЦена И ШаксЦена
Ключевое слово МЕЖДУ введено для повышения наглядности при задании интервалов и всегда может быть заменено неравенствами. Следующий запрос полностью эквивалентен предыдущему:
ВЫБРАТЬ Наименование, ЗакупочнаяЦена
ИЗ Справочник.Номенклатура
ГДЕ ЗакупочнаяЦена >= МинЦена И ЗакупочнаяЦена <= МаксЦена
Проверка вхождения значения в список (В / IN)
В условии можно проверять значения на вхождение в некоторый список или на принадлежность группе справочника (или элементу, если иерархический справочник состоит из одних элементов). В случае иерархического справочника можно применять конструкцию В ИЕРАРХИИ для проверки вхождения в группу независимо от уровня иерархии.
Следующие запросы демонстрируют варианты использования ключевого слова В:
//выбираем товары из заданного списка
ВЫБРАТЬ Наименование, ЗакупочнаяЦена
ИЗ Справочник.Номенклатура
ГДЕ Ссылка В (&СписокВыбранныхТоваров)
//выбираем товары, принадлежащие определенной группе
//независимо от уровня, на котором они находятся
ВЫБРАТЬ Наименование, ЗакупочнаяЦена
ИЗ Справочник.Номенклатура
ГДЕ Ссылка В ИЕРАРХИИ (&ВыбраннаяГруппа)
В первом запросе параметр СписокВыбранныхТоваров является списком значений. В запросе будут выбраны только те товары, которые представлены в данном списке.
Во втором запросе параметр ВыбраннаяГруппа является группой иерархического справочника Номенклатура. В результат запроса будут включены товары, принадлежащие к заданной группе, независимо от того, на каком уровне иерархии они находятся.
В качестве списка значений, можно указывать и другой запрос, тогда сначала будет выполнен вложенный запрос, а затем основной. Например, следующий составной запрос выбирает товары, по которым есть хотя бы одна расходная накладная:
ВЫБРАТЬ Спр.Наименование, Спр.ЗакупочнаяЦена
ИЗ Справочник.Номенклатура КАК Спр
ГДЕ Спр.Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура
ИЗ Документ.РасходнаяНакладная.Состав)
Заметим, что в данном случае это было искусственное усложнение запроса. Того же результата можно добиться проще, используя разыменование полей:
ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура, Номенклатура.ЗакупочнаяЦена
ИЗ Документ.РасходнаяНакладная.Состав
Это стало возможно, потому что разыменование полей заставляет систему 1С:Предприятие 8.0 производить неявное соединение таблиц. Рекомендуется всегда пользоваться разыменованием полейтам, где это возможно, и не усложнять запросы лишними конструкциями.
Проверка ссылочного значения (ССЫЛКА / REF)
Оператор ССЫЛКА позволяет проверить, является ли значение выражения ссылкой на таблицу, указанную справа от него. Этот оператор полезен для полей, имеющих составной тип данных. Следующий запрос выбирает товары, для которых единица измерения ссылается на справочник ЕдиницыИзмерения, а не является, например, строкой.
ВЫБРАТЬ Наименование, ЕдиницаИзмерения
ИЗ Справочник.Номенклатура
ГДЕ ЕдиницаИзмерения ССЫЛКА Справочник.ЕдиницыИэмерения
Проверка пустых значений (ЕСТЬ NULL/ IS NULL)
Оператор ЕСТЬ NULL позволяет проверить значение заданного выражения на NULL.
Замечание. NULL-значения не являются нулем (0), пустой строкой («») или пробелом (« »). NULL-значения – это неуказанные, отсутствующие или неизвестные значения.
Если проверяемое значение равно NULL, то результатом оператора будет Истина, иначе — Ложь. Применение логического оператора НЕ изменяет действие оператора на обратное. Любая операция обычного сравнения (=, >, <= и т.д.) значения NULL с чем-либо еще дает результат, аналогичный Ложь.
Следующий запрос выбирает из справочника Номенклатура все товары, для которых строковое поле СтранаПроисхождения имеет NULL-значение:
ВЫБРАТЬ Наименование, СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ СтранаПроисхождения ЕСТЬ NULL
Обратите внимание, что в результате запроса присутствуют только группы справочника, так как для них поле Страна имеет NULL-значение (вообще не указывается). В результат запроса не попали товары, у которых строковое поле СтранаПроисхождения имеет значение «» (пустая строка). Как уже было сказано выше, ни ноль, ни пустая строка, ни пробел не являются NULL-значением.
Чтобы выбрать товары, у которых не указана страна (строковое поле), нужно применить обычное сравнение на пустую строку:
ВЫБРАТЬ Наименование, СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ СтранаПроисхождения = ""

Если стоит задача выбрать элементы с неуказанным реквизитом, имеющим ссылочный тип, тогда следует поступать по-другому. Например, требуется выбрать все товары с незаполненным полем ОсновнойПоставщик, которое является ссылкой на справочник Контрагенты.
Предлагается следующая схема для решения этой задачи:
Запрос = Новый Запрос("
| ВЫБРАТЬ Наименование, ОсновнойПоставщик
| ИЗ Справочник.Номенклатура
| ГДЕ ОсновнойПоставщик = йПустойКонтрагент ");
Запрос.УстановитьПараметр("ПустойКонтрагент",
Справочники.Контрагенты.ПустаяСсылка());
Результат = Запрос.Выполнить();
В условии запроса используется параметр ПустойКонтрагент. Этот параметр до выполнения запроса получает значение пустой ссылки на справочник Контрагенты. Для этого используется метод ПустаяСсылка объекта СправочникМенеджер.
Результат приведенного выше запроса будет следующий:
Сравнение строк (ПОДОБНО / LIKE)
Ключевое слово ПОДОБНО позволяет сравнить значение строкового выражения, указанного слева от него, со строкой шаблона, указанной справа. Если значение выражения удовлетворяет шаблону, то результатом оператора будет Истина, иначе — Ложь.
Например, следующий запрос выберет всех контрагентов, начинающихся на определенную букву:
ВЫБРАТЬ Наименование ИЗ Справочник.Контрагенты
ГДЕ Наименование ПОДОБНО "М%"
В выражении шаблона был использован служебный символ «%», обозначающий любую последовательность символов. Кроме этого, есть и другие служебные символы для задания выражения шаблона.
Следующие символы в строке шаблона являются служебными и имеют особый смысл:
Если необходимо записать один из перечисленных символов в качестве самого себя, а не в качестве служебного символа, то ему должен предшествовать спецсимвол, который определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.
Например, следующая строка обозначает любую строку, начинающуюся со знака подчеркивания «__». Так как знак подчеркивания является служебным, то для его использования в качестве именно знака подчеркивания, необходимо его экранировать другим спецсимволом, например «\»:
ВЫБРАТЬ Наименование ИЗ Справочник.СистемныеФайлы
ГДЕ Наименование ПОДОБНО "\_%" СПЕЦСИМВОЛ "\"