Необязательный параметр в запросе 1С 8.3

1. qqwweerrttyy160679 9 10.10.17 12:14 Сейчас в теме
Добрый день. Обычный отчет БЕЗ СКД. Ставлю необязательный параметр в фигурные скобки {(Контрагент = &Контрагент)} и не срабатывает. Почему?

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

	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		ОбластьТакая_то.Параметры.Заполнить (Выборка);
	    ТабличныйДокумент.Вывести(ОбластьТакая_то);	
	КонецЦикла;
Показать
По теме из базы знаний
Найденные решения
11. qqwweerrttyy160679 9 10.10.17 14:23 Сейчас в теме
Сработала вот такая конструкция

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

    Запрос.УстановитьПараметр("НачалоПериода"    , Отчет.НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода"      , КонецДня(Отчет.КонецПериода));
    Запрос.УстановитьПараметр("Контрагент"            , Отчет.Контрагент);

    Если Не ЗначениеЗаполнено (Отчет.Контрагент) Тогда
            Запрос.УстановитьПараметр("НеПроверятьКонтрагента", Истина);
    Иначе 
            Запрос.УстановитьПараметр("НеПроверятьКонтрагента", Ложь);
    КонецЕсли;
   ;
Показать
Meverix; demidrole; native-api; shakmaev; user1039789; Артём74; 2PRV; +7 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. spacecraft 10.10.17 12:50 Сейчас в теме
(1)
 Запрос.Текст = "ВЫБРАТЬ
     |    ОборотыСБ.СтатьяОборотов КАК СтатьяОбр,
     |    ОборотыСБ.СуммаОборот КАК СуммаОбр,
         |    ОборотыСБ.Контрагент КАК Контрагент
     |ИЗ
     |    РегистрНакопления.ОборотыСБ.Обороты(&НачалоПериода, &КонецПериода, Регистратор";
Если ЗначениеЗаполнено(Отчет.Контрагент) Тогда
    Запрос.Текст = Запрос.Текст + ", Контрагент = &Контрагент";
    Запрос.УстановитьПараметр("Контрагент", Отчет.Контрагент);
КонецЕсли;
Запрос.Текст = Запрос.Текст + ") КАК ОборотыСБОбороты";
    
    Запрос.УстановитьПараметр("НачалоПериода"    , Отчет.НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода"      , КонецДня(Отчет.КонецПериода));
    
Показать
9. EVKash 14 10.10.17 12:53 Сейчас в теме
(1)
РегистрНакопления.ОборотыСБ.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ВЫБОР КОГДА &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА ИСТИНА ИНАЧЕ Контрагент = &Контрагент КОНЕЦ) КАК ОборотыСБОбороты
2. DenisCh 10.10.17 12:18 Сейчас в теме
ФИгурные скобки - это для построителя или скд
3. recon 38 10.10.17 12:19 Сейчас в теме
А почему должен срабатывать ? Запрос при выполнении проверяет только параметры необходимые для формирования запроса
Ваш же параметр указан как для построителя запроса, курите ман в его сторону
4. herfis 499 10.10.17 12:33 Сейчас в теме
Нет понятия "необязательных параметров" в запросе. В СКД фигурные скобки используются для ручных настроек СКД в тексте запроса. Сам запрос про них ничего не знает. Да и в СКД то что вы хотите обычно делается через отборы СКД (это более универсальный инструмент).
Если я правильно понял вашу потребность, то можно выкрутиться через условие
&Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ИЛИ Контрагент = &Контрагент
5. qqwweerrttyy160679 9 10.10.17 12:43 Сейчас в теме
(4) Не вариант. Так если поле в таблице будет не заполено тогда он выберет только пустые строки. А мне нужно - Если выбран контрагент то выборка только по нему, а если нет то все строки и пустые и с контрагентами.
7. herfis 499 10.10.17 12:48 Сейчас в теме
(5) Ну так реализуйте ваше условие "выбран контрагент". Я ж не телепат, как оно у вас там реализуется. Сделайте
НЕ &КонтрагентВыбран ИЛИ Контрагент = &Контрагент

или
&Контрагент = Неопределено ИЛИ Контрагент = &Контрагент
6. alx7304 10.10.17 12:47 Сейчас в теме
Фигурные скобки для СКД, как сказано выше, тут нужно "Контрагент = &Контрагент ИЛИ &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)".
10. DenisCh 10.10.17 13:07 Сейчас в теме
РегистрНакопления.ОборотыСБ.Обороты(
   &НачалоПериода, 
   &КонецПериода, 
   Регистратор, 
   ВЫБОР 
      КОГДА &Контрагент = Неопределено ТОГДА ИСТИНА 
      ИНАЧЕ Контрагент = &Контрагент 
   КОНЕЦ
) КАК ОборотыСБОбороты
Показать
11. qqwweerrttyy160679 9 10.10.17 14:23 Сейчас в теме
Сработала вот такая конструкция

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

    Запрос.УстановитьПараметр("НачалоПериода"    , Отчет.НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода"      , КонецДня(Отчет.КонецПериода));
    Запрос.УстановитьПараметр("Контрагент"            , Отчет.Контрагент);

    Если Не ЗначениеЗаполнено (Отчет.Контрагент) Тогда
            Запрос.УстановитьПараметр("НеПроверятьКонтрагента", Истина);
    Иначе 
            Запрос.УстановитьПараметр("НеПроверятьКонтрагента", Ложь);
    КонецЕсли;
   ;
Показать
Meverix; demidrole; native-api; shakmaev; user1039789; Артём74; 2PRV; +7 Ответить
12. 2PRV 7 11.10.17 11:13 Сейчас в теме
в типовой встречал такой вариант:
"ВЫБРАТЬ
     |    ОборотыСБ.СтатьяОборотов КАК СтатьяОбр,
     |    ОборотыСБ.СуммаОборот КАК СуммаОбр,
     |    ОборотыСБ.Контрагент КАК Контрагент
     |ИЗ
     |    РегистрНакопления.ОборотыСБ.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК ОборотыСБОбороты
     |ГДЕ
     |    %допУсловие";

    Запрос.УстановитьПараметр("НачалоПериода"    , Отчет.НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода"      , КонецДня(Отчет.КонецПериода));
    

    Если Не ЗначениеЗаполнено (Отчет.Контрагент) Тогда
            Запрос.Текст=СтрЗаменить(Запрос.текст, "%допУсловие", "");
    Иначе 
            Запрос.Текст=СтрЗаменить(Запрос.текст, "%допУсловие", "");
            Запрос.УстановитьПараметр("Контрагент"            , Отчет.Контрагент);
    КонецЕсли;
Показать
adamst; SagittariusA; +2 Ответить
14. SuperSpade 20.12.21 10:55 Сейчас в теме
(12) должно же быть так:
Иначе 
            Запрос.Текст=СтрЗаменить(Запрос.текст, "%допУсловие", "%Контрагент");
13. adamst 3 24.12.20 15:49 Сейчас в теме
мне больше вариант с заменой текста в запросе понравился т.к. с точки зрения производительности это лучше потому что уменьшает количество условий в запросе, хотя тот вариант что выбрал автор тоже приемлем и рабочий!
15. rebuzx 162 10.01.22 15:11 Сейчас в теме
Как то так:
  
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.Текст =      "ВЫБРАТЬ
     |    ОборотыСБ.СтатьяОборотов КАК СтатьяОбр,
     |    ОборотыСБ.СуммаОборот КАК СуммаОбр,
     |    ОборотыСБ.Контрагент КАК Контрагент
     |ИЗ
     |    РегистрНакопления.ОборотыСБ.Обороты(&НачалоПериода, &КонецПериода, Регистратор, {(Контрагент) КАК Контрагент} ) КАК ОборотыСБОбороты
     |{ГДЕ
     |    ОборотыСБ.Контрагент КАК Контрагент}";     

Если ЗначениеЗаполнено(Отчет.Контрагент) Тогда
    ПостроительЗапроса.Отбор.Добавить("Контрагент");
    ПостроительЗапроса.Отбор.Контрагент.Значение = Отчет.Контрагент;
    ПостроительЗапроса.Отбор.Контрагент.ВидСравнения = ВидСравнения.Равно;
    ПостроительЗапроса.Отбор.Контрагент.Использование = Истина; 
КонецЕсли;

ПостроительЗапроса.Выполнить(); 

РезультатЗапроса = ПостроительЗапроса.Результат;
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    ОбластьТакая_то.Параметры.Заполнить (Выборка);
    ТабличныйДокумент.Вывести(ОбластьТакая_то);    
КонецЦикла;
 
Показать
16. VZyryanov 10.01.22 15:39 Сейчас в теме
Я так понимаю, что вопрос задавался для того, чтобы самому на него ответить. Чужие ответы были не нужны.

Правильный ответ в (4), (7). В (11) рабочий, но не правильный ответ. Правильно задавать контрагента в параметрах виртуальной таблицы,а не в предложении ГДЕ.
17. Rafaraf 37 02.02.23 16:59 Сейчас в теме
Я пользуюсь такой конструкцией, работает и в параметрах виртуальных таблиц
ВЫБОР
	КОГДА &НоменклатураОтбор = ЛОЖЬ 
  	ТОГДА ИСТИНА // просто ничего не делаем с этим условием. ИСТИНА - значит всё хорошо )
ИНАЧЕ 
	Номенклатура = &Номенклатура
КОНЕЦ


	Запрос.УстановитьПараметр("Номенклатура", 		Объект.Номенклатура);
	Запрос.УстановитьПараметр("НоменклатураОтбор", 	?(ЗначениеЗаполнено(Объект.Номенклатура),Истина,Ложь));
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот