Имя: Пароль:
1C
1С v8
Динамический список: как его получить с учетом отборов пользователя?
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) благодарю, похоже это то что требуется!
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс