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