|
Динамический список: как его получить с учетом отборов пользователя? | ☑ | ||
---|---|---|---|---|
0
vs33
12.02.15
✎
13:36
|
Есть форма списка документов. На ней динамический список соответственно привязан к запросу по документам.
Пользователь ставить отборы на список и получает другой набор документов. Как мне программно получить тот список документов, который пользователь видит у себя с учетом всех отборов? В динамическом списке нет ни обходов, ни выгрузки (с учетом отборов). Решение наложить на запрос все отборы, которые установил пользователь не предлагать - очень гемморойно формировать конструкцию "ГДЕ" по всем возможным типам полей и видам сравнения (сейчас я так и делаю, но решение очень корявое и объемное по реализации). Есть ли какое-то красивое решение задачи? |
|||
1
Goggy
12.02.15
✎
13:39
|
Почему не реализовать отбор уже на форме?
|
|||
2
Goggy
12.02.15
✎
13:51
|
// ПРОЦЕДУРЫ И ФУНКЦИИ РАБОТЫ С ДИНАМИЧЕСКИМИ СПИСКАМИ
// Удаляет элемент отбора динамического списка // //Параметры: //Список - обрабатываемый динамический список, //ИмяПоля - имя поля компоновки, отбор по которому нужно удалить // Процедура УдалитьЭлементОтбораСписка(Список, ИмяПоля) Экспорт ПолеКомпоновки = Новый ПолеКомпоновкиДанных(ИмяПоля); Счетчик = 1; Пока Счетчик <= Список.Отбор.Элементы.Количество() Цикл ЭлементОтбора = Список.Отбор.Элементы[Счетчик - 1]; Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") И ЭлементОтбора.ЛевоеЗначение = ПолеКомпоновки Тогда Список.Отбор.Элементы.Удалить(ЭлементОтбора); Иначе Счетчик = Счетчик + 1; КонецЕсли; КонецЦикла; КонецПроцедуры // УдалитьЭлементОтбораСписка() // Устанавливает элемент отбор динамического списка // //Параметры: //Список - обрабатываемый динамический список, //ИмяПоля - имя поля компоновки, отбор по которому нужно установить, //ВидСравнения - вид сравнения отбора, по умолчанию - Равно, //ПравоеЗначение - значение отбора // Процедура УстановитьЭлементОтбораСписка(Список, ИмяПоля, ПравоеЗначение, ВидСравнения = Неопределено) Экспорт ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); ЭлементОтбора.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения); ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = ПравоеЗначение; ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; КонецПроцедуры // УстановитьЭлементОтбораСписка() // Изменяет элемент отбора динамического списка // //Параметры: //Список - обрабатываемый динамический список, //ИмяПоля - имя поля компоновки, отбор по которому нужно установить, //ВидСравнения - вид сравнения отбора, по умолчанию - Равно, //ПравоеЗначение - значение отбора, //Установить - признак необходимости установить отбор // Процедура ИзменитьЭлементОтбораСписка(Список, ИмяПоля, ПравоеЗначение = Неопределено, Установить = Ложь, ВидСравнения = Неопределено, ОтборПоПериоду = Ложь) Экспорт УдалитьЭлементОтбораСписка(Список, ИмяПоля); Если Установить Тогда Если ОтборПоПериоду Тогда УстановитьЭлементОтбораСписка(Список, ИмяПоля, ПравоеЗначение.ДатаНачала, ВидСравненияКомпоновкиДанных.БольшеИлиРавно); УстановитьЭлементОтбораСписка(Список, ИмяПоля, ПравоеЗначение.ДатаОкончания, ВидСравненияКомпоновкиДанных.МеньшеИлиРавно); Иначе УстановитьЭлементОтбораСписка(Список, ИмяПоля, ПравоеЗначение, ВидСравнения); КонецЕсли; КонецЕсли; КонецПроцедуры // ИзменитьЭлементОтбораСписка() |
|||
3
Fragster
гуру
12.02.15
✎
14:11
|
||||
4
vs33
12.02.15
✎
14:52
|
(2) Это работа с отборами формы. А мне нужно получить уже результат отбора на списке.
|
|||
5
vs33
12.02.15
✎
14:55
|
(3) а вот это уже интересно... скорее бы
одинэс-овцы что-то не доработали с этими динамическими списками, а понатыкали уже их везде |
|||
6
ShoGUN
12.02.15
✎
14:58
|
Тема про динамические списки всплывает каждый день :-) Ждите обновлений.
|
|||
7
Diman000
12.02.15
✎
15:21
|
У меня такая есть функция. На полную универсально есессно не претендую.
Функция ПолучитьДанныеДинСписка(ДинСписок, СтрокаПолей) Экспорт СКД = Новый СхемаКомпоновкиДанных; Источник = СКД.ИсточникиДанных.Добавить(); Источник.Имя = "ЛокальнаяБаза"; Источник.СтрокаСоединения = ""; Источник.ТипИсточникаДанных = "Local"; // скопируем текст запроса из динамического списка НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "Основной"; НаборДанных.ИсточникДанных = "ЛокальнаяБаза"; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; НаборДанных.Запрос = ДинСписок.ТекстЗапроса; ТекстЗапроса = ДинСписок.ТекстЗапроса; СКД.НаборыДанных.Основной.Запрос = ТекстЗапроса; // добавляем поля МассивПолей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаПолей); Для каждого Поле Из МассивПолей Цикл ПолеСКД = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеСКД.Заголовок = Поле; ПолеСКД.ПутьКДанным = Поле; ПолеСКД.Поле = Поле; КонецЦикла; НастройкиКомпоновкиДанных = СКД.НастройкиПоУмолчанию; //добавим поля в группировку детальных записей ГруппировкаДетальная = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); Для каждого Поле Из МассивПолей Цикл ВыбранноеПоле = ГруппировкаДетальная.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Заголовок = Поле; ВыбранноеПоле.Использование = Истина; ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(Поле); КонецЦикла; // подготовим таблицу и процессор вывода результата СКД в таблицу значений Таб = Новый ТаблицаЗначений; ПроцессорВыводаВТЗ = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВыводаВТЗ.УстановитьОбъект(Таб); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию); // загрузим настройки из настроек динамического списка Для Каждого ЭлементОтбораДС Из ДинСписок.Отбор.Элементы Цикл ЭлементОтбораСКД = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(ЭлементОтбораСКД, ЭлементОтбораДС); КонецЦикла; Для Каждого ЗначениеПараметраДС Из ДинСписок.Параметры.Элементы Цикл ЗначениеПараметраСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Добавить(); ЗаполнитьЗначенияСвойств(ЗначениеПараметраСКД, ЗначениеПараметраДС); КонецЦикла; МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД,КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки); Таб = ПроцессорВыводаВТЗ.Вывести(ПроцессорКомпоновкиДанных); Возврат Таб; КонецФункции // ПолучитьДанныеДинСписка() |
|||
8
vs33
12.02.15
✎
15:59
|
(7) благодарю, похоже это то что требуется!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |