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




Хороший пример и стиль внятный. Несомненно, +!
Молодец! Возьми с полки пирожок!)) +
Странно, что мало отзывов. А пример очень полезный
Да наверно все понятно в примере, вот и нет отзывов 🙂
Материал хороший, только я не нашёл как передаются параметры из динамического списка в СКД.
(5). Если кого-то интересует, то параметры можно передавать:
dcParameter = new ПараметрКомпоновкиДанных(«period»);
periodItem = КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(dcParameter);
periodItem.Значение = ДинамическийСписок.Параметры.НайтиЗначениеПараметра(dcParameter).Значение;
periodItem.Use = true;
(5) да, с параметрами я практически увидел недочет уже после публикации.
там же где заполнение отбора:
Для Каждого ЭлементПараметра Из ДинамическийСписок.Параметры.Элементы Цикл
Если Не ЭлементПараметра.Использование Тогда Продолжить; КонецЕсли;
КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ЭлементПараметра.Параметр,ЭлементПараметра.Значение);
КонецЦикла;
Хороший пример
А как этот самый, полученный запросом, динамический список вывести, например, в табличный документ по нажатию кнопки?
(9) это уже в компетенции программиста…
Ну подскажи
эх, полный код написать не могу, нет времени на подарки…
как вариант: вывод компоновкой не в таблицу значений, а в табличный документ, возврат его с сервера на клиента, далее отображение на клиенте.
Мне не нужен полный код.
Идея с выводом «компоновкой не в таблицу значений, а в табличный документ»
имеет, конечно, право на существование. Рассматривал этот вариант. Но в
моем случае лучше из уже сформированной в результате открытия формы
таблицы значений. Никак не получается достучаться до этой таблицы по нажатию
кнопки, чтобы ее перебрать в отчет
А можно листинг кода сделать без пустых строк? А то он в 2 раза больше по высоте, чем кажется нужно.
(13) приведите код, попробуем решить проблему
(14) разукрашка…
в приложении обработка с кодом без пустых строк 🙂
(14) да, листинг в публикации надо бы поправить
все намного проще,
и не нужен не какой сервер, на сервер ты уже без контекста передаешь для обработки данные. Хотя может не отработать при установки ЛиномическийОтбор = Истина, в этом случае только через СКД и копирование параметров с ДинамическогоСписка.
Показать
(9) Ну, как-то так:
Спасибо огромное за пример)
Спасибо за хороший пример
(0) Спасибо, сегодня пригодилось.
После строки (after line)
АвтоВыбранноеПолеКомпоновкиДанных = СхемаКомпоновкиДанных.ВариантыНастроек.Основной.Настройки.Структура[0].Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));Показать полностью
Добавить (add code)
Показать полностью
Народ в зазеркалье проскочила статейка, что в 8.3.5 появился новый метод.
Написал для информации.
Автору спасибо. до 8.3.5 еще пыхтеть и пыхтеть…
(24)
1. еще не смотрел что нового в 3.5. что за метод?
2. «пыхтеть» — в смысле?
в 8.3 отбор динамического списка может устанавливаться по другому, например так:
Показать
По этому код немного надо менять
А у меня не проходит с параметром, хотя задаю их :
ПараметрСКД=КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.Элементы.Найти(«ВидЦены»);
ПараметрСКД.Использование = Истина;
ПараметрСКД.Значение = Справочники.ВидыЦен.НайтиПоНаименованию(«Себестоимость»);
а в результатк ошибка-
{Обработка.ПодборТоваровВДокументСписания.Форма.ФормаПодбора.Форма(1771)}: Ошибка при вызове метода контекста (Вывести)
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных,Истина);
по причине:
Ошибка вывода результата
по причине:
Ошибка при выводе результата
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных «НаборДанных»
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(15, 79)}: Не задано значение параметра «ВидЦены»
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = <<?>>&ВидЦены) КАК ЦеныНоменклатуры
может подскажите чт делать?
Решено
Тут есть пример отбора
Спасибо!
Мне очень пригодилось!
Однозначно +