Подскажите пожалуйста как программно создать множественный и единичный отбор в отчете.
Отчет сделал без скд и построителя. Макетом и выводил области.
Создал в отчете реквизит тип выбрал отбор. Потом создал табличное поле в данных выбрал реквизит отбор .
В запросе получал сотрудников,подразделение,контрагент .
---
Создать поле выбора для выбора вида сравнения

Создать поле ввода, тип значения которого менять при изменении вида сравнения

Перед открытием формы заполнить поля выбора вида сравнения

```1c
    СписокВыбора = Новый СписокЗначений;
    СписокВыбора.Добавить(ВидСравнения.Равно);
    СписокВыбора.Добавить(ВидСравнения.НеРавно);
    СписокВыбора.Добавить(ВидСравнения.ВСписке);
    СписокВыбора.Добавить(ВидСравнения.НеВСписке);
    СписокВыбора.Добавить(ВидСравнения.ВИерархии);
    СписокВыбора.Добавить(ВидСравнения.НеВИерархии);
    СписокВыбора.Добавить(ВидСравнения.ВСпискеПоИерархии);
    СписокВыбора.Добавить(ВидСравнения.НеВСпискеПоИерархии);

    ЭлементыФормы.ПолеВидаСравненияНоменклатура.СписокВыбора = СписокВыбора;
    ЭлементыФормы.ПолеВидаСравненияНоменклатура.Значение = ВидСравнения.Равно;
    ЭлементыФормы.Номенклатура.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

    ЭлементыФормы.ПолеВидаСравненияКонтрагент.СписокВыбора = СписокВыбора;
    ЭлементыФормы.ПолеВидаСравненияКонтрагент.Значение = ВидСравнения.Равно;
    ЭлементыФормы.Контрагенты.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
```

Добавить обработчик ПриИзменении для полей выбора

```1c
    Процедура ПолеВидаСравненияНоменклатураПриИзменении(Элемент)
    ПриИзмененииПоляВидаСравнения(ЭтаФорма, Элемент, "Номенклатура");
    КонецПроцедуры

    Процедура ПолеВидаСравненияКонтрагентПриИзменении(Элемент)
    ПриИзмененииПоляВидаСравнения(ЭтаФорма, Элемент, "Контрагенты");
    КонецПроцедуры

    Процедура ПриИзмененииПоляВидаСравнения(Форма, Элемент, Поле) Экспорт
    Если Элемент.Значение = ВидСравнения.ВСписке
    ИЛИ Элемент.Значение = ВидСравнения.НеВСписке
    ИЛИ Элемент.Значение = ВидСравнения.ВСпискеПоИерархии
    ИЛИ Элемент.Значение = ВидСравнения.НеВСпискеПоИерархии Тогда
    Значение = Неопределено;
    Если Форма.ЭлементыФормы[Поле].ТипЗначения <> Новый ОписаниеТипов("СписокЗначений")Тогда
    Значение = Форма.ЭлементыФормы[Поле].Значение;
    Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СписокЗначений");
    Форма.ЭлементыФормы[Поле].ТипЗначенияСписка = Новый ОписаниеТипов("СправочникСсылка."+Поле);
    КонецЕсли;

    Если ЗначениеЗаполнено(Значение) Тогда
    Форма.ЭлементыФормы[Поле].Значение.Добавить(Значение);
    КонецЕсли;

    ИначеЕсли Элемент.Значение = ВидСравнения.Равно
    ИЛИ Элемент.Значение = ВидСравнения.ВИерархии
    ИЛИ Элемент.Значение = ВидСравнения.НеРавно
    ИЛИ Элемент.Значение = ВидСравнения.НеВИерархии
    Тогда
    Значение = Неопределено;
    Если Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СписокЗначений")Тогда
    Если Форма.ЭлементыФормы[Поле].Значение.Количество()>0 Тогда
    Значение = Форма.ЭлементыФормы[Поле].Значение[0].Значение;
    КонецЕсли;
    Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СправочникСсылка."+Поле);
    КонецЕсли;

    Если ЗначениеЗаполнено(Значение) Тогда
    Форма.ЭлементыФормы[Поле].Значение = Значение;
    КонецЕсли;

    КонецЕсли;
    КонецПроцедуры
```

Перед формированием отчета добавить условие в запрос в соответствии с заданными настройками

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

    Функция ПолучитьУсловиеЗапроса(Форма, Поле) Экспорт
    ФрагментУсловия = ";
    Если Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.Равно Тогда
    ФрагментУсловия = "=";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеРавно Тогда
    ФрагментУсловия = "<>";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВСписке Тогда
    ФрагментУсловия = "В";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеВСписке Тогда
    ФрагментУсловия = "НЕ В";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВИерархии Тогда
    ФрагментУсловия = "В ИЕРАРХИИ";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеВИерархии Тогда
    ФрагментУсловия = "НЕ В ИЕРАРХИИ";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВСпискеПоИерархии Тогда
    ФрагментУсловия = "В ИЕРАРХИИ";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеВСпискеПоИерархии Тогда
    ФрагментУсловия = "НЕ В ИЕРАРХИИ";
    КонецЕсли;

    Возврат ФрагментУсловия;
    КонецФункции
```

В общем случае как-то так.. В СКД проще :)
---
Антон, Вот как можно сделать, хоть тут и используется построитель, но отчет далее можно делать и не на нем:

http://novichok1c.ru/programmnoe-sozdanie-otborov-v-otchyote
---
deniseek77, Спасибо
---
Обычные формы
---
Создать поле выбора для выбора вида сравнения

Создать поле ввода, тип значения которого менять при изменении вида сравнения

Перед открытием формы заполнить поля выбора вида сравнения

```1c
    СписокВыбора = Новый СписокЗначений;
    СписокВыбора.Добавить(ВидСравнения.Равно);
    СписокВыбора.Добавить(ВидСравнения.НеРавно);
    СписокВыбора.Добавить(ВидСравнения.ВСписке);
    СписокВыбора.Добавить(ВидСравнения.НеВСписке);
    СписокВыбора.Добавить(ВидСравнения.ВИерархии);
    СписокВыбора.Добавить(ВидСравнения.НеВИерархии);
    СписокВыбора.Добавить(ВидСравнения.ВСпискеПоИерархии);
    СписокВыбора.Добавить(ВидСравнения.НеВСпискеПоИерархии);

    ЭлементыФормы.ПолеВидаСравненияНоменклатура.СписокВыбора = СписокВыбора;
    ЭлементыФормы.ПолеВидаСравненияНоменклатура.Значение = ВидСравнения.Равно;
    ЭлементыФормы.Номенклатура.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

    ЭлементыФормы.ПолеВидаСравненияКонтрагент.СписокВыбора = СписокВыбора;
    ЭлементыФормы.ПолеВидаСравненияКонтрагент.Значение = ВидСравнения.Равно;
    ЭлементыФормы.Контрагенты.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
```

Добавить обработчик ПриИзменении для полей выбора

```1c
    Процедура ПолеВидаСравненияНоменклатураПриИзменении(Элемент)
    ПриИзмененииПоляВидаСравнения(ЭтаФорма, Элемент, "Номенклатура");
    КонецПроцедуры

    Процедура ПолеВидаСравненияКонтрагентПриИзменении(Элемент)
    ПриИзмененииПоляВидаСравнения(ЭтаФорма, Элемент, "Контрагенты");
    КонецПроцедуры

    Процедура ПриИзмененииПоляВидаСравнения(Форма, Элемент, Поле) Экспорт
    Если Элемент.Значение = ВидСравнения.ВСписке
    ИЛИ Элемент.Значение = ВидСравнения.НеВСписке
    ИЛИ Элемент.Значение = ВидСравнения.ВСпискеПоИерархии
    ИЛИ Элемент.Значение = ВидСравнения.НеВСпискеПоИерархии Тогда
    Значение = Неопределено;
    Если Форма.ЭлементыФормы[Поле].ТипЗначения <> Новый ОписаниеТипов("СписокЗначений")Тогда
    Значение = Форма.ЭлементыФормы[Поле].Значение;
    Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СписокЗначений");
    Форма.ЭлементыФормы[Поле].ТипЗначенияСписка = Новый ОписаниеТипов("СправочникСсылка."+Поле);
    КонецЕсли;

    Если ЗначениеЗаполнено(Значение) Тогда
    Форма.ЭлементыФормы[Поле].Значение.Добавить(Значение);
    КонецЕсли;

    ИначеЕсли Элемент.Значение = ВидСравнения.Равно
    ИЛИ Элемент.Значение = ВидСравнения.ВИерархии
    ИЛИ Элемент.Значение = ВидСравнения.НеРавно
    ИЛИ Элемент.Значение = ВидСравнения.НеВИерархии
    Тогда
    Значение = Неопределено;
    Если Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СписокЗначений")Тогда
    Если Форма.ЭлементыФормы[Поле].Значение.Количество()>0 Тогда
    Значение = Форма.ЭлементыФормы[Поле].Значение[0].Значение;
    КонецЕсли;
    Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СправочникСсылка."+Поле);
    КонецЕсли;

    Если ЗначениеЗаполнено(Значение) Тогда
    Форма.ЭлементыФормы[Поле].Значение = Значение;
    КонецЕсли;

    КонецЕсли;
    КонецПроцедуры
```

Перед формированием отчета добавить условие в запрос в соответствии с заданными настройками

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

    Функция ПолучитьУсловиеЗапроса(Форма, Поле) Экспорт
    ФрагментУсловия = ";
    Если Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.Равно Тогда
    ФрагментУсловия = "=";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеРавно Тогда
    ФрагментУсловия = "<>";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВСписке Тогда
    ФрагментУсловия = "В";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеВСписке Тогда
    ФрагментУсловия = "НЕ В";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВИерархии Тогда
    ФрагментУсловия = "В ИЕРАРХИИ";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеВИерархии Тогда
    ФрагментУсловия = "НЕ В ИЕРАРХИИ";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВСпискеПоИерархии Тогда
    ФрагментУсловия = "В ИЕРАРХИИ";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеВСпискеПоИерархии Тогда
    ФрагментУсловия = "НЕ В ИЕРАРХИИ";
    КонецЕсли;

    Возврат ФрагментУсловия;
    КонецФункции
```

В общем случае как-то так.. В СКД проще :)
---
kanalya,Спасибо сейчас попробую так сделать
---
А поподробнее?что надо выбрать и по каким условиям?
---
получилось создать отбор ,только привезать его к запросу не получаеться, я так понял что нужно в запросе где условия,вставлять новые условия учитывая отборы

ГДЕ
  | ВЫБОР
  | КОГДА &СотрудникЗаполнен = ИСТИНА
  | ТОГДА Заказ.Сотрудник = &Сотрудник
  | ИНАЧЕ ИСТИНА
  | КОНЕЦ
  | И ВЫБОР
  | КОГДА &КонтрагентЗаполнен = ИСТИНА
  | ТОГДА Заказ.Контрагент = &Контрагент
  | ИНАЧЕ ИСТИНА
  | КОНЕЦ
  | И ВЫБОР
  | КОГДА &ФилиалЗаполнен = ИСТИНА
  | ТОГДА Заказ.Филиал = &Филиал
  | ИНАЧЕ ИСТИНА
  | КОНЕЦ
  | И Заказ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) И КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)
  | И Заказ.Проведен = ИСТИНА

а это код для отбора
Отбор = ВнешнийОтчетОбъект.ОтборОбщий;
 ДоступныеПоляОтбора = Отбор.ПолучитьДоступныеПоля();
 Поле = ДоступныеПоляОтбора.Добавить("Контрагент", "Контрагент",
 Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
 Поле.Отбор = Истина;
 Поле = ДоступныеПоляОтбора.Добавить("Филиал", "Филиал",
 Новый ОписаниеТипов("СправочникСсылка.Филиалы"));
 Поле.Отбор = Истина;
 Поле = ДоступныеПоляОтбора.Добавить("Сотрудник", "Сотрудник",
 Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
 Поле.Отбор = Истина;
---
подскажите пожадуйста как удалить из отбора некоторые виды сравнения?
---
```1c
    СтандартнаяОбработка = Ложь;

    СписокВыбора = Новый СписокЗначений;

    СписокВыбора.Добавить(ВидСравнения.Равно, "Равно");
    СписокВыбора.Добавить(ВидСравнения.НеРавно, "Не равно");
    СписокВыбора.Добавить(ВидСравнения.ВСписке, "В списке");
    СписокВыбора.Добавить(ВидСравнения.НеВСписке, "Не в списке");

    ВыбЭлемент = ЭтаФорма.ВыбратьИзСписка(СписокВыбора);

    ЭтаФорма.ПолеВидСравнения = ВыбЭлемент.Значение;
```