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

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

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

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

    Пока Выборка.Следующий() Цикл
    ОбластьТакая_то.Параметры.Заполнить (Выборка);
    ТабличныйДокумент.Вывести(ОбластьТакая_то);
    КонецЦикла;
```
---
Сработала вот такая конструкция

```1c
    ;

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

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

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

    Запрос.УстановитьПараметр("НачалоПериода" , Отчет.НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода" , КонецДня(Отчет.КонецПериода));
```
---
```1c
    РегистрНакопления.ОборотыСБ.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ВЫБОР КОГДА &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА ИСТИНА ИНАЧЕ Контрагент = &Контрагент КОНЕЦ) КАК ОборотыСБОбороты
```
---
ФИгурные скобки - это для построителя или скд
---
А почему должен срабатывать ? Запрос при выполнении проверяет только параметры необходимые для формирования запроса
Ваш же параметр указан как для построителя запроса, курите ман в его сторону
---
Нет понятия "необязательных параметров" в запросе. В СКД фигурные скобки используются для ручных настроек СКД в тексте запроса. Сам запрос про них ничего не знает. Да и в СКД то что вы хотите обычно делается через отборы СКД (это более универсальный инструмент).
Если я правильно понял вашу потребность, то можно выкрутиться через условие

```1c
    &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ИЛИ Контрагент = &Контрагент
```
---
Не вариант. Так если поле в таблице будет не заполено тогда он выберет только пустые строки. А мне нужно - Если выбран контрагент то выборка только по нему, а если нет то все строки и пустые и с контрагентами.
---
Ну так реализуйте ваше условие "выбран контрагент". Я ж не телепат, как оно у вас там реализуется. Сделайте

```1c
    НЕ &КонтрагентВыбран ИЛИ Контрагент = &Контрагент
```

или

```1c
    &Контрагент = Неопределено ИЛИ Контрагент = &Контрагент
```
---
Фигурные скобки для СКД, как сказано выше, тут нужно "Контрагент = &Контрагент ИЛИ &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)".
---
```1c
    РегистрНакопления.ОборотыСБ.Обороты(
    &НачалоПериода,
    &КонецПериода,
    Регистратор,
    ВЫБОР
    КОГДА &Контрагент = Неопределено ТОГДА ИСТИНА
    ИНАЧЕ Контрагент = &Контрагент
    КОНЕЦ
    ) КАК ОборотыСБОбороты
```
---
Сработала вот такая конструкция

```1c
    ;

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

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

    Если Не ЗначениеЗаполнено (Отчет.Контрагент) Тогда
    Запрос.УстановитьПараметр("НеПроверятьКонтрагента", Истина);
    Иначе
    Запрос.УстановитьПараметр("НеПроверятьКонтрагента", Ложь);
    КонецЕсли;
    ;
```
---
в типовой встречал такой вариант:

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

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

    Если Не ЗначениеЗаполнено (Отчет.Контрагент) Тогда
    Запрос.Текст=СтрЗаменить(Запрос.текст, "%допУсловие", ");
    Иначе
    Запрос.Текст=СтрЗаменить(Запрос.текст, "%допУсловие", ");
    Запрос.УстановитьПараметр("Контрагент" , Отчет.Контрагент);
    КонецЕсли;
```
---
должно же быть так:

```1c
    Иначе
    Запрос.Текст=СтрЗаменить(Запрос.текст, "%допУсловие", "%Контрагент");
```
---
мне больше вариант с заменой текста в запросе понравился т.к. с точки зрения производительности это лучше потому что уменьшает количество условий в запросе, хотя тот вариант что выбрал автор тоже приемлем и рабочий!
---
Как то так:

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

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

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

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

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

Правильный ответ в (4), (7). В (11) рабочий, но не правильный ответ. Правильно задавать контрагента в параметрах виртуальной таблицы,а не в предложении ГДЕ.
---
Я пользуюсь такой конструкцией, работает и в параметрах виртуальных таблиц

```1c
    ВЫБОР
    КОГДА &НоменклатураОтбор = ЛОЖЬ
    ТОГДА ИСТИНА // просто ничего не делаем с этим условием. ИСТИНА - значит всё хорошо )
    ИНАЧЕ
    Номенклатура = &Номенклатура
    КОНЕЦ

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