---
title: Реализация произвольных отборов на форме
slug: общие-скд-и-отчеты/реализация-произвольных-отборов-на-форме
---

Для того, чтобы у пользователя была возомжность управлять выборкой с помощью `произвольных отборов` (например, для загрузки в табличную часть всей номенклатуры, отвечающей некоторым условиям) необходимо сделать следующее:

## Шаг 1. Создать схему компоновки данных

Макет типа `Схема компоновки данных` может распологаться в любом месте конфигурации. Главное, чтобы его можно было получить в коде.

В схеме компоновки данных определяем запрос любого вида (соединения, отборы и пр.)
![Изображение](/skd/proizvolnie-otbory/1.png)

На вкладке `Настройки` определяем состав полей, которые будут выгружены в коллекцию значений (`таблицу` или `дерево`, в зависимости от настроенных группировок)

![Изображение](/skd/proizvolnie-otbory/2.png)

![Изображение](/skd/proizvolnie-otbory/3.png)

На вкладке `Отбор` настраиваем те отборы, которые будут устанавливаться по умолчанию:

![Изображение](/skd/proizvolnie-otbory/4.png)

## Шаг 2. Настроить форму

Для того, чтобы у пользователя была возможность управлять настройками определенной схемы компоновки данных необходимо:
1. Создать реквизит формы с типом `КомпоновщикНастроекКомпоновкиДанных` (в примере имя реквизита - `КомпоновщикНастроек`). Вывести из него элемент `Отбор` коллекции `НастройкиКомпоновкиДанных`

![Изображение](/skd/proizvolnie-otbory/5.png)

2. В обработчике `ПриСозданииНаСервере` формы загружаем настройки созданной ранее схемы в компоновщик настроек
```bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем схему
    СхемаКомпоновкиДанных = Справочники.Контрагенты.ПолучитьМакет("ДанныеКонтрагентов");
    
    // Помещаем в ВХ для извлечения настроек
    АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор);
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы);
    
    // инициализируем реквизит формы с типом КомпоновщикНастроекКомпоновкиДанных
    КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
    
    // загружаем настройки из созданной схемы в реквизит формы
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    
КонецПроцедуры
```
3. В требуемый обработчик прописать выполнение нужной схемы компоновки данных с теми настройками, которые установит пользователь. Например, при изменении отборов компоновщика или при нажатии на кнопку.

```bsl
&НаКлиенте
Процедура КомпоновщикНастроекНастройкиОтборПриИзменении(Элемент)
    НайтиПоОтборамНаСервере();
КонецПроцедуры

&НаСервере
Процедура НайтиПоОтборамНаСервере()
    
    // получаем схему
    СхемаКомпоновкиДанных = Справочники.Контрагенты.ПолучитьМакет("ДанныеКонтрагентов");

    // из реквизита формы получаем настройки, которые установил пользователь
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    // Выполняем схему компоновки с нужными настройками
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
         Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    // Обязательно ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    
    ТаблицаРезультат = Новый ТаблицаЗначений; // или дерево значений, в зависимости от настроек СКД
    
    // Заполняем таблицу/дерево
    ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
    // Обрабатываем
    Для Каждого Строка Из ТаблицаРезультат Цикл
        ...
    КонецЦикла;
    
КонецПроцедуры
```

![Изображение](/skd/proizvolnie-otbory/6.gif)

[Пример схемы компоновки данных](/skd/proizvolnie-otbory/scheme.xml)

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Весь модуль формы</summary>
    
```bsl


#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    СхемаКомпоновкиДанных = Справочники.Контрагенты.ПолучитьМакет("ДанныеКонтрагентов");
    
    АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор);
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы);
    
    КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
    
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура КомпоновщикНастроекНастройкиОтборПриИзменении(Элемент)
    НайтиПоОтборамНаСервере();
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура НайтиПоОтборам(Команда)
    НайтиПоОтборамНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ПодобратьИЗакрыть(Команда)
    
    СписокВыбранных = Новый Массив;
    Для Каждого Строка Из ВыбранныеКонтрагенты Цикл
        СписокВыбранных.Добавить(Строка.Контрагент);	
    КонецЦикла;
    
    Закрыть(СписокВыбранных);
    
КонецПроцедуры

#КонецОбласти
 
#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура НайтиПоОтборамНаСервере()
    
    СхемаКомпоновкиДанных = Справочники.Контрагенты.ПолучитьМакет("ДанныеКонтрагентов");

    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
         Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    
    ТаблицаРезультат = Новый ТаблицаЗначений;
    
    ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
    
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
    ВыбранныеКонтрагенты.Очистить();
    Для Каждого Строка Из ТаблицаРезультат Цикл
        ВыбранныеКонтрагенты.Добавить().Контрагент = Строка.Ссылка;
    КонецЦикла;
    
КонецПроцедуры

#КонецОбласти


```

</details>