This commit is contained in:
wakadakawaka 2025-08-20 09:07:33 +05:00
parent f81c8d265b
commit 7733f6ff5d
7 changed files with 187 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 851 KiB

View File

@ -0,0 +1,187 @@
---
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)
<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>