@black_xe

Как исключить из выборки (ГДЕ) параметр если он не заполнен?

Подскажите как исключить из выборки параметр если он не заполнен?
Сейчас получается так, что если я буду фильтровать по одному из параметров, то по остальным он будет искать как по пустым значениям т.к. они не будут заполнены.

&НаСервере
Процедура ПодобратьКурсНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	Курсы.Ссылка КАК Ссылка,
	               |	Курсы.Наименование КАК Наименование,
	               |	Курсы.Исполнитель КАК Исполнитель,
	               |	Курсы.ВидКурса КАК ВидКурса,
	               |	Курсы.ОписаниеКурса КАК ОписаниеКурса,
	               |	Курсы.ДлительностьКурса КАК ДлительностьКурса,
	               |	Курсы.СредняяСтоимость КАК СредняяСтоимость
	               |ИЗ
	               |	Справочник.Курсы КАК Курсы
	               |ГДЕ
	               |	Курсы.Исполнитель = &ПарамИсполнитель
	               |	И Курсы.Наименование ПОДОБНО &ПарамНаименованиеКурса
	               |	И Курсы.ВидКурса = &ПарамВидКурса
	               |	И Курсы.ДлительностьКурса <= &ПарамДлительностьКурса
	               |	И Курсы.СредняяСтоимость <= &ПарамСтоимость"; 
	
	Запрос.УстановитьПараметр("ПарамИсполнитель", Исполнитель);
	Запрос.УстановитьПараметр("ПарамНаименованиеКурса", НаименованиеКурса);
	Запрос.УстановитьПараметр("ПарамВидКурса", ВидКурса);
    Запрос.УстановитьПараметр("ПарамДлительностьКурса", ДлительностьКурса);
	Запрос.УстановитьПараметр("ПарамСтоимость", Стоимость);

	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	Если Выборка.Количество() > 0 Тогда 
        Пока Выборка.Следующий() Цикл
            Сообщить(
                "Курс " + Выборка.Код +        
                ", Наименование " + Выборка.Наименование +
                ", Вид курса " + Выборка.ВидКурса +         
                ", ДлительностьКурса " + Выборка.ДлительностьКурса +
                ", Преподаватель " + Выборка.Исполнитель + 
                ", Стоимость " + Выборка.СредняяСтоимость
            );
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПодобратьКурс(Команда)
	ПодобратьКурсНаСервере();
КонецПроцедуры
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
Mi11er
@Mi11er
A human...
1) Если не обрабатываете это если
Если Выборка.Количество() > 0 Тогда
То оно и не нужно, оставьте только
Пока Выборка.Следующий() Цикл

По поводу параметров, есть такой костыль
И Курсы.ВидКурса = &ПарамВидКурса
Меняем на
И &ПарамВидКурса
Дальше
Если ЗначениеЗаполнено(ВидКурса) Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&ПарамВидКурса","Курсы.ВидКурса = &ПарамВидКурса")
    Запрос.УстановитьПараметр("ПарамВидКурса", ВидКурса);
Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&ПарамВидКурса","Истина")
КонецЕсли


Так можно по каждому.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alexey-simf
Ещё можно вот так:

В тексте запроса:
ГДЕ
(НЕ &ОтборПоНоменклатуре ИЛИ Закупки.Номенклатура В (&МассивНоменклатуры))

В установке параметров должно быть:
Запрос.УстановитьПараметр("ОтборПоНоменклатуре", ЗначениеЗаполнено(МассивНоменклатуры));
Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы