Отбор строк динамического списка


Получение строк динамического списка с примененным отбором.
ДЛЯ ПРОГРАММИСТОВ!
Очередной инструмент, цели определите сами :)

Работа с алгоритмом:
Вызывается функция ПолучитьОтборСтрокДинамическогоСписка, в которую передаются необходимые параметры. ВНИМАНИЕ: возвращаемое значение - таблица значений! Функция выполняется на сервере.

В приложении пример получения списка отобранных ссылок на примере справочника Номенклатура.

&НаСервере

Функция ПолучитьОтборСтрокДинамическогоСписка(ДинамическийСписок, ДополнительныеПоляВыбора = Неопределено, ДополнительныйОтбор = Неопределено) Экспорт

   
// Описание переменной ДополнительныйОтбор:

    //ДополнительныйОтбор = Новый ТаблицаЗначений;

    //ДополнительныйОтбор.Колонки.Добавить("ЛевоеЗначение");

    //ДополнительныйОтбор.Колонки.Добавить("ВидСравнения");

    //ДополнительныйОтбор.Колонки.Добавить("ПравоеЗначение");



    // Сформируем схему компоновки

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



   
// Заполнение запроса источника данных

   
ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();

   
ИсточникДанных.Имя = "ИсточникДанных1";

   
ИсточникДанных.ТипИсточникаДанных = "Local";



   
НаборДанныхЗапрос = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));

   
НаборДанныхЗапрос.Имя = "НаборДанных";

   
НаборДанныхЗапрос.ИсточникДанных = "ИсточникДанных1";

    Если
ДинамическийСписок.ПроизвольныйЗапрос Тогда

       
НаборДанныхЗапрос.Запрос = ДинамическийСписок.ТекстЗапроса;

    Иначе

       
НаборДанныхЗапрос.Запрос = "ВЫБРАТЬ

                                   |    *

                                   |ИЗ

                                   |    "
+ДинамическийСписок.ОсновнаяТаблица+" КАК ИсточникДанных";

    КонецЕсли;



   
// Заполнение выводимых полей и группировок

   
ВыбранноеПолеКомпоновкиДанных = СхемаКомпоновкиДанных.ВариантыНастроек.Основной.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));

   
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка");



    Если
ДополнительныеПоляВыбора <> Неопределено Тогда

        Для Каждого
ДополнительноеПолеВыбора Из ДополнительныеПоляВыбора Цикл

           
ВыбранноеПолеКомпоновкиДанных = СхемаКомпоновкиДанных.ВариантыНастроек.Основной.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));

           
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(ДополнительноеПолеВыбора);

        КонецЦикла;

    КонецЕсли;



   
ГруппировкаКомпоновкиДанных = СхемаКомпоновкиДанных.ВариантыНастроек.Основной.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));



   
АвтоВыбранноеПолеКомпоновкиДанных = СхемаКомпоновкиДанных.ВариантыНастроек.Основной.Настройки.Структура[0].Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));



   
// Сформируем настройки КД

   
ИсточникДоступныхНастроекКомпоновкиДанных = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);

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

   
КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

   
КомпоновщикНастроекКомпоновкиДанных.Инициализировать(ИсточникДоступныхНастроекКомпоновкиДанных);



   
// Сформируем отбор

   
Для Каждого ЭлементОтбора Из ДинамическийСписок.Отбор.Элементы Цикл

       
СоздатьЭлементОтбора(КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Элементы,ЭлементОтбора);

    КонецЦикла;



    Если
ДополнительныйОтбор <> Неопределено Тогда

        Для Каждого
ЭлементОтбора Из ДополнительныйОтбор Цикл

           
НовыйЭлементОтбора = КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

           
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ЭлементОтбора.ЛевоеЗначение);

            Если
ЭлементОтбора.ВидСравнения = Неопределено Тогда

               
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

            Иначе

               
НовыйЭлементОтбора.ВидСравнения = ЭлементОтбора.ВидСравнения;

            КонецЕсли;

           
НовыйЭлементОтбора.ПравоеЗначение = ЭлементОтбора.ПравоеЗначение;

        КонецЦикла;

    КонецЕсли;



   
// Получим итоговые настройки и макет

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



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

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



   
// Подготовим процессор и выполним компоновку

   
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

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



   
ТаблицаСсылок = Новый ТаблицаЗначений;

   
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

   
ПроцессорВывода.УстановитьОбъект(ТаблицаСсылок);



   
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных,Истина);



    Возврат
ТаблицаСсылок;

КонецФункции

&НаСервере

Процедура СоздатьЭлементОтбора(ЭлементыОтбора,ЭлементОтбораИсточник)

   
НовыйЭлементОтбора = ЭлементыОтбора.Добавить(Тип(ЭлементОтбораИсточник));

   
ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора,ЭлементОтбораИсточник);



    Если
Тип(ЭлементОтбораИсточник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") И ЭлементОтбораИсточник.Элементы.Количество() > 0 Тогда

        Для Каждого
ЭлементОтбора Из ЭлементОтбораИсточник.Элементы Цикл

           
СоздатьЭлементОтбора(НовыйЭлементОтбора.Элементы,ЭлементОтбора)

        КонецЦикла;

    КонецЕсли;

КонецПроцедуры
// СоздатьЭлементОтбора()

Файлы обработки:

-