Необязательный параметр в запросе 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 498 10.10.17 12:33 Сейчас в теме
Нет понятия "необязательных параметров" в запросе. В СКД фигурные скобки используются для ручных настроек СКД в тексте запроса. Сам запрос про них ничего не знает. Да и в СКД то что вы хотите обычно делается через отборы СКД (это более универсальный инструмент).
Если я правильно понял вашу потребность, то можно выкрутиться через условие
&Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ИЛИ Контрагент = &Контрагент
5. qqwweerrttyy160679 9 10.10.17 12:43 Сейчас в теме
(4) Не вариант. Так если поле в таблице будет не заполено тогда он выберет только пустые строки. А мне нужно - Если выбран контрагент то выборка только по нему, а если нет то все строки и пустые и с контрагентами.
7. herfis 498 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 Сейчас в теме
Я пользуюсь такой конструкцией, работает и в параметрах виртуальных таблиц
ВЫБОР
	КОГДА &НоменклатураОтбор = ЛОЖЬ 
  	ТОГДА ИСТИНА // просто ничего не делаем с этим условием. ИСТИНА - значит всё хорошо )
ИНАЧЕ 
	Номенклатура = &Номенклатура
КОНЕЦ


	Запрос.УстановитьПараметр("Номенклатура", 		Объект.Номенклатура);
	Запрос.УстановитьПараметр("НоменклатураОтбор", 	?(ЗначениеЗаполнено(Объект.Номенклатура),Истина,Ложь));
Показать
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)