====== Необязательные параметы запроса ======
Ппоказан пример запроса с необязательным отбором по товару и складу.
Этот пример предназначен не для СКД, а для запросов в программном коде 1С:Предприятие 8.3.
Под необязательностью отбора понимается то, что при неуказанном пользователем параметре отбора запрос должен выводить все значения, которые есть в выборке, не накладывая условий, как если бы этого отбора в запросе не было вовсе.
Отбор по необязательным условиям можно произвести
* модификацией самого текста запроса (например, через СтрЗаменить). Методическая правильность этого способа может вызывать нарекания, но я допускаю, что в некоторых особо продвинутых случаях работы с запросами в 1С без этого способа не обойтись.
* проверкой параметров на пустоту (заполненность) сравнением с пустым значением в самом запросе: (&Товар = ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка) ИЛИ ... )
* передачей дополнительных параметров вида &НеПроверятьРеквизитТакойТо. Условие обратное (не проверять), т.к. такие параметры удобно объединять с основным условием по ИЛИ.
* использованием конструкции {ГДЕ ... }, которая имеется в СКД и объекте ПостроительЗапроса.
===== Тестовый пример =====
В качестве тестового примера в пустой конфигурации создадим документ ПриходнаяНакладная с табличной частью Тч и ее реквизитами Товар и Количество, реквизитом Склад в шапке. Тестовый отчет содержит реквизиты Товар, Склад и МинимальноеКоличество. Пример конфигурации с тестовыми данными (вбиты несколько документов с товарами и складами) можно скачать здесь: https://yadi.sk/d/92c3oEKWZG4ZY - для 1С:Предприятие 8.3 (8.3.4.482).
===== Использование дополнительных параметров =====
&НаКлиенте
Процедура КомандаЗапрос(Команда)
ОчиститьСообщения();
КомандаЗапросНаСервере();
КонецПроцедуры
&НаСервере
Процедура КомандаЗапросНаСервере()
// Это простой запрос - необязательность параметров задается через дополнительные параметры
// Реквизиты на форме - Товар, Склад
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриходнаяНакладнаяТч.Товар,
| ПриходнаяНакладнаяТч.Количество,
| ПриходнаяНакладнаяТч.Ссылка.Склад
|ИЗ
| Документ.ПриходнаяНакладная.Тч КАК ПриходнаяНакладнаяТч
|ГДЕ
| (&НеПроверятьТовар
| ИЛИ ПриходнаяНакладнаяТч.Товар = &Товар)
| И (&НеПроверятьСклад
| ИЛИ ПриходнаяНакладнаяТч.Ссылка.Склад = &Склад)";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Товар", Товар);
Если Не ЗначениеЗаполнено(Товар) Тогда
Запрос.УстановитьПараметр("НеПроверятьТовар", Истина);
Иначе
Запрос.УстановитьПараметр("НеПроверятьТовар", Ложь);
КонецЕсли;
Если Не ЗначениеЗаполнено(Склад) Тогда
Запрос.УстановитьПараметр("НеПроверятьСклад", Истина);
Иначе
Запрос.УстановитьПараметр("НеПроверятьСклад", Ложь);
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
вв = РезультатЗапроса.Выбрать();
Пока вв.Следующий() Цикл
Сообщить(""+вв.Склад+" "+вв.Товар+" "+вв.Количество);
КонецЦикла;
КонецПроцедуры
===== Использование объекта ПостроительЗапроса =====
&НаКлиенте
Процедура КомандаПостроитель(Команда)
ОчиститьСообщения();
КомандаПостроительНаСервере();
КонецПроцедуры
&НаСервере
Процедура КомандаПостроительНаСервере()
//Это пример использования построителя запросов.
//Реквизиты на форме - Товар, Склад, МинимальноеКоличество
пз = Новый ПостроительЗапроса;
пз.Текст =
"ВЫБРАТЬ
| ПриходнаяНакладнаяТч.Ссылка,
| ПриходнаяНакладнаяТч.НомерСтроки,
| ПриходнаяНакладнаяТч.Товар,
| ПриходнаяНакладнаяТч.Количество,
| ПриходнаяНакладнаяТч.Ссылка.Склад
|ИЗ
| Документ.ПриходнаяНакладная.Тч КАК ПриходнаяНакладнаяТч
|ГДЕ
| ПриходнаяНакладнаяТч.Ссылка.ПометкаУдаления = ЛОЖЬ
| И ПриходнаяНакладнаяТч.Ссылка.Проведен = ИСТИНА
| И ПриходнаяНакладнаяТч.Количество >= &МинимальноеКоличество
|{ГДЕ
| ПриходнаяНакладнаяТч.Товар,
| ПриходнаяНакладнаяТч.Ссылка.Склад}";
//Необязательный отбор по товару
Если ЗначениеЗаполнено(Товар) Тогда
ПЗ.Отбор.Добавить("Товар");
ПЗ.Отбор.Товар.Значение = Товар;
ПЗ.Отбор.Товар.ВидСравнения = ВидСравнения.Равно;
ПЗ.Отбор.Товар.Использование = Истина;
КонецЕсли;
//Необязательный отбор по складу
Если ЗначениеЗаполнено(Склад) Тогда
ПЗ.Отбор.Добавить("Склад");
ПЗ.Отбор.Склад.Значение = Склад;
ПЗ.Отбор.Склад.ВидСравнения = ВидСравнения.Равно;
ПЗ.Отбор.Склад.Использование = Истина;
КонецЕсли;
//Обязательный отбор по минимальному количеству
пз.Параметры.Вставить("МинимальноеКоличество", МинимальноеКоличество);
пз.Выполнить();
РезультатЗапроса = пз.Результат;
вв = РезультатЗапроса.Выбрать();
Пока вв.Следующий() Цикл
Сообщить(""+вв.Склад+" "+вв.Товар+" "+вв.Количество);
КонецЦикла;
КонецПроцедуры
Необязательные параметры передаются через выражение запроса
{ГДЕ
ПриходнаяНакладнаяТч.Товар,
ПриходнаяНакладнаяТч.Ссылка.Склад}
вместо обычной записи условий в запросе вида
ПриходнаяНакладнаяТч.Товар = &Товар
И ПриходнаяНакладнаяТч.Ссылка.Склад = &Склад
Добавляется фигурная скобка и ключевое слово ГДЕ, убирается часть вида = &Склад, добавляется закрывающая фигурная скобка, вместо И пишется запятая (см. образец).
В конструкторе запросов необязательные параметры из выражения с фигурными скобками {ГДЕ...} можно найти на вкладке Построитель - Условия.