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