Skip to content

Реализация произвольных отборов на форме

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

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

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

В схеме компоновки данных определяем запрос любого вида (соединения, отборы и пр.) Изображение

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

Изображение

Изображение

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

Изображение

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

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

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

Изображение

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

Изображение

Пример схемы компоновки данных

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