Доброго времени. Сделал внешнюю обработку, на ней есть кнопка "Заполнить документы", при заполнении вытягиваются документы, по указанной в коде дате. Теперь решил сделать еще отбор по контрагенту, сделал, но вот правильно ли?
Вот код:
Сначала условие на проверку заполненности контрагента:

```1c
    Если ЗначениеЗаполнено(ЭлементыФормы.Контрагент.Значение) Тогда

    ПараметрВЗапрос = "И СчетНаОплатуПокупателю.Контрагент = &Контрагент";
    ВыбранныйКлиент = ЭлементыФормы.Контрагент.Значение;

    Иначе

    ПараметрВЗапрос = ";

    КонецЕсли;
```

Затем в запросе:

```1c
    | СчетНаОплатуПокупателю.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    | " + ПараметрВЗапрос + "
```

Ну и соответственно

```1c
    Запрос.УстановитьПараметр("Контрагент", ВыбранныйКлиент);
```

Все работает, но вдруг есть способ проще.
---
Да почему? просто в запросе:

```1c
    | СчетНаОплатуПокупателю.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    | И (&Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка) Или СчетНаОплатуПокупателю.Контрагент = &Контрагент)
```

И все
---
Можно не делать проверку заполнения:

```1c
    | СчетНаОплатуПокупателю.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    | И СчетНаОплатуПокупателю.Контрагент В ИЕРАРХИИ(&Контрагент)
```

Если контрагент будет пустой ссылкой, то запрос отберет всех
---
Коллеги, вы чего? Все же проще:
СчетНаОплатуПокупателю.Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка) Или СчетНаОплатуПокупателю.Контрагент = &Контрагент
---
Пардон, опечатался:

&Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка) Или СчетНаОплатуПокупателю.Контрагент = &Контрагент
---
sailor-cat, отберёт счета с пустыми контрагентами или с выбранным - то бишь только с выбранным, т.к. без контрагента счета не бывает))) вообще условие у Вас = бред какой-то?
---
Почему с пустыми? Говорю же, в первом сообщении опечатался
&Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка) //если параметр пустой - выбираем все
Или
СчетНаОплатуПокупателю.Контрагент = &Контрагент //отбираем по контрагенту
---
sailor-cat, Понятней не стало - запрос Вы предлагаете менять? Тогда всё просто:

```1c
    Если ЗначениеЗаполнено(ВыбранныйКонтрагент) Тогда
    Запрос.УстановитьПараметр("Контравгент", ВыбранныйКонтрагент);
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "СчетНаОплатуПокупателю.Контрагент = &Контрагент", ");
    КонецЕсли
```

Зачем текст

```1c
    &Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка)
```
 - загадка природы)))))))
---
Да почему? просто в запросе:

```1c
    | СчетНаОплатуПокупателю.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    | И (&Контрагент = Значение(Справочник.Контрагенты.ПустаяСсылка) Или СчетНаОплатуПокупателю.Контрагент = &Контрагент)
```

И все
---
sailor-cat, О, теперь дошло - так сработает)))))
---
Alex_E, (8) sailor-cat, Да, так и делаю, и все прекрасно работает. Подвяжусь к теме. А вот как в скд на 8.1 сделать? Мне надо подобное, но либо не заполнено значение- тогда без отбора, либо в списке? То есть либо не выбрали ничего, либо в список значений подобрали несколько элементов? Тут так не сработает. Понятно, что в самом запросе можно не указывать параметры запроса, указать их в компоновщике. Тогда параметры не отобразятся на закладке параметров скд. Как тут? Напоминаю 8.1
---
Не припомню, в 8.1 есть построитель?
что-то типа

```1c
    "{где Контрагент В (&Контрагенты)}"
```

Для пустого параметра условие построителя не используется, если я ничего не путаю.
---
sailor-cat, Если есть возможность и время- попробуйте. У меня не получилось. Незаполненность параметра или заполненность на 1 элемент ссылка все прекрасно работает, а вот как сделать на незаполненность или список значений в параметре...не знаю.
---
Ну, если не устраивает флажок, и есть желание извратиться, я бы предложил такую идею:

```1c
    ВЫБРАТЬ
    МАКСИМУМ(Контрагенты.Ссылка) КАК Ссылка
    ПОМЕСТИТЬ ВТ_ЕслиNullТогдаСписокПустой
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    Контрагенты.Ссылка В(&Контрагенты)
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Контрагенты.Ссылка,
    ВТ_ЕслиNullТогдаСписокПустой.Ссылка КАК Ссылка1
    ПОМЕСТИТЬ ВТ_ВесьСправочник
    ИЗ
    Справочник.Контрагенты КАК Контрагенты,
    ВТ_ЕслиNullТогдаСписокПустой КАК ВТ_ЕслиNullТогдаСписокПустой
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_ВесьСправочник.Ссылка
    ИЗ
    ВТ_ВесьСправочник КАК ВТ_ВесьСправочник
    ГДЕ
    (ВТ_ВесьСправочник.Ссылка В (&Контрагенты)
    ИЛИ ВТ_ВесьСправочник.Ссылка1 ЕСТЬ NULL )
```

Несколько кривовато написал, нужно "причесывать", но идея такая.
Смысл в чем: в виртуальную таблицу грузим справочник, по которому отбираем (с группировкой ссылок). Если список пустой - виртуальная таблица будет пустая, иначе - в ней будет одна строка со ссылкой. Дальше мы пришиваем ее ко всему справочнику. Получается, если список пустой, то ко всем строкам второй таблицы будет пришит null, если в списке что-то есть - пришивается какая-то ссылка (все равно какая). А дальше отбор.
Громоздко, но сработает.