Все мы уже давно привыкли к отборам в отчетах на СКД и динамических списках.
Иногда хочется что-то подобное иметь в обработке, например, для подбора склада.
То есть поместить на форму поле, в которое пользователь мог бы выбрать конкретный элемент, или все элементы из группы, или все элементы из нескольких групп, не помеченных на удаление. В общем, стандартный функционал отбора.
Самый простой вариант реализации такой идеи следующий: нужно добавить реквизит с типом ДинамическийСписок по нужной нам таблице, например, по справочнику Склады. При этом сам список на форму помещать не обязательно, достаточно просто вывести отбор этого списка.
Получить все элементы, соответствующие отбору также довольно просто, например, так:
&НаКлиенте
Процедура Сформировать(Команда)
МассивВыбранныхСкладов = ПолучитьСсылкиПоОтбору(СписокСклады.Отбор, "Справочник.Склады");
КонецПроцедуры
Исходный код
Функция ПолучитьСсылкиПоОтбору(знач Отбор, ПолноеИмяМетаданных)
Схема = Новый СхемаКомпоновкиДанных;
ИсточникДанных = Схема.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных";
ИсточникДанных.ТипИсточникаДанных = "Local";
НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
НаборДанных.Запрос = "ВЫБРАТЬ * ИЗ " + ПолноеИмяМетаданных;
НаборДанных.ИсточникДанных = "ИсточникДанных";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
ИмяПоля = "Ссылка";
ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабора.Поле = ИмяПоля;
ПолеНабора.ПутьКДанным = ИмяПоля;
ГруппировкаДанных = Схема.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеГруппировки = ГруппировкаДанных.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Использование = Истина;
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
ВыбранноеПоле = ГруппировкаДанных.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;
СкопироватьЭлементКомпоновкиДанных(Отбор, Схема.НастройкиПоУмолчанию.Отбор); // эта процедура была описана в предыдущей публикации
ТаблицаИзСКД = Новый ТаблицаЗначений;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаИзСКД);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТаблицаИзСКД.ВыгрузитьКолонку(0);
КонецФункции
Вместо "фиктивного" динамического списка можно использовать компоновщик настроек.
Компоновщик нужно будет инициализировать, например так:
&НаСервере
Процедура ПриСозданииНаСервере()
КомпоновщикОтборСклады.Инициализировать(ИсточникДоступныхНастроек("Справочник.Склады"));
КонецПроцедуры
Получение элементов по отбору компоновщика аналогично получению из динамического списка
&НаКлиенте
Процедура Сформировать(Команда)
МассивВыбранныхСкладов = ПолучитьСсылкиПоОтбору(КомпоновщикОтборСклады.Настройки.Отбор, "Справочник.Склады");
КонецПроцедуры
Исходный код
&НаСервереБезКонтекста
Функция ИсточникДоступныхНастроек(ПолноеИмяМетаданных)
Схема = Новый СхемаКомпоновкиДанных;
ИсточникДанных = Схема.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных";
ИсточникДанных.ТипИсточникаДанных = "Local";
НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
НаборДанных.Запрос = "ВЫБРАТЬ * ИЗ " + ПолноеИмяМетаданных;
НаборДанных.ИсточникДанных = "ИсточникДанных";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
АдресВременногоХранилищаСхемы = ПоместитьВоВременноеХранилище(Схема, Новый УникальныйИдентификатор);
Возврат Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресВременногоХранилищаСхемы);
КонецФункции
Описанные приемы работают для управляемых форм на платформе 8.3 в режиме совместимости с 8.2.13 и выше.
Всем добра, приятного кода и красивых идей!