gifts2017

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

Опубликовал Никита (Mopo3) в раздел Программирование - Практика программирования

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

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

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

&НаСервере

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

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

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

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

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

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



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

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



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

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

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

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



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

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

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

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

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

    Иначе

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

                                   |    *

                                   |ИЗ

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

    КонецЕсли;



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

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

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



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

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

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

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

        КонецЦикла;

    КонецЕсли;



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



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



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

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

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

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

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



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

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

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

    КонецЦикла;



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

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

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

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

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

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

            Иначе

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

            КонецЕсли;

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

        КонецЦикла;

    КонецЕсли;



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

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



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

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



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

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

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



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

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

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



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



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

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

&НаСервере

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

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

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



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

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

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

        КонецЦикла;

    КонецЕсли;

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Отбор строк
.epf 7,92Kb
17.04.12
83
.epf 7,92Kb 83 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Максим *** (premier) 18.04.12 10:12
Хороший пример и стиль внятный. Несомненно, +!
2. Сергей П (SerebanSK) 09.07.12 14:08
Молодец! Возьми с полки пирожок!)) +
3. Сергей Куликов (ksvd) 12.07.12 22:31
Странно, что мало отзывов. А пример очень полезный
4. Никита (Mopo3) 13.07.12 11:09
Да наверно все понятно в примере, вот и нет отзывов :)
5. Пимшин 1 (Pim) 19.07.12 12:47
Материал хороший, только я не нашёл как передаются параметры из динамического списка в СКД.
6. Пимшин 1 (Pim) 19.07.12 13:28
(5). Если кого-то интересует, то параметры можно передавать:

dcParameter = new ПараметрКомпоновкиДанных("period");
periodItem = КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(dcParameter);
periodItem.Значение = ДинамическийСписок.Параметры.НайтиЗначениеПараметра(dcParameter).Значение;
periodItem.Use = true;
7. Никита (Mopo3) 19.07.12 16:59
(5) да, с параметрами я практически увидел недочет уже после публикации.
там же где заполнение отбора:

Для Каждого ЭлементПараметра Из ДинамическийСписок.Параметры.Элементы Цикл
Если Не ЭлементПараметра.Использование Тогда Продолжить; КонецЕсли;
КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ЭлементПараметра.Параметр,ЭлементПараметра.Значение);
КонецЦикла;
8. Игорь Хитров (Новенький_2209) 21.09.12 11:01
9. OBEH (OBEH) 04.12.12 16:54
А как этот самый, полученный запросом, динамический список вывести, например, в табличный документ по нажатию кнопки?
10. Никита (Mopo3) 04.12.12 17:39
(9) это уже в компетенции программиста...
11. OBEH (OBEH) 04.12.12 17:46
12. Никита (Mopo3) 04.12.12 21:12
эх, полный код написать не могу, нет времени на подарки...
как вариант: вывод компоновкой не в таблицу значений, а в табличный документ, возврат его с сервера на клиента, далее отображение на клиенте.
13. OBEH (OBEH) 05.12.12 03:54
Мне не нужен полный код.
Идея с выводом "компоновкой не в таблицу значений, а в табличный документ"
имеет, конечно, право на существование. Рассматривал этот вариант. Но в
моем случае лучше из уже сформированной в результате открытия формы
таблицы значений. Никак не получается достучаться до этой таблицы по нажатию
кнопки, чтобы ее перебрать в отчет
14. Сергей Старых (tormozit) 07.12.12 13:04
А можно листинг кода сделать без пустых строк? А то он в 2 раза больше по высоте, чем кажется нужно.
15. Никита (Mopo3) 07.12.12 15:14
(13) приведите код, попробуем решить проблему
16. Никита (Mopo3) 07.12.12 15:14
(14) разукрашка...
в приложении обработка с кодом без пустых строк :)
17. krein (krein) 12.01.13 20:00
(14) да, листинг в публикации надо бы поправить
18. Стас Стас (glime) 11.06.13 20:48
все намного проще,
и не нужен не какой сервер, на сервер ты уже без контекста передаешь для обработки данные. Хотя может не отработать при установки ЛиномическийОтбор = Истина, в этом случае только через СКД и копирование параметров с ДинамическогоСписка.

Сч = 0;
	
	Пока Истина Цикл
		
		Сч = Сч + 1;
		
		СтруктураДанных = Элементы.ДинамическийСписок.ДанныеСтроки(Сч);
		
		Если СтруктураДанных = Неопределено Тогда
			
			Прервать;
			
		КонецЕсли;
		
		СтруктураПередачи = Новый Структура("ВидНоменклатуры, Свойство, СвойствоСтрока, Выбран",ВидНоменклатуры,СтруктураДанных.Свойство,СтруктураДанных.СвойствоСтрока,Ложь);
	
		ИзменитьФлаг(СтруктураПередачи);		
		
		
	КонецЦикла;
	
	Элементы.ДинамическийСписок.Обновить();
	
...Показать Скрыть
19. Андрей Клапанов (AK-74S) 27.06.13 14:33
(9) Ну, как-то так:
	ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ЭлементыФормы.СправочникСписок.Значение);
     ПостроительОтчета.Выполнить();

    Выборка = ПостроительОтчета.Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        ...
...Показать Скрыть
20. {ÐƦǑƝȊ} mx (dour-dead) 18.10.13 20:25
Спасибо огромное за пример)
21. Виталий Гуляев (vital1c) 12.03.14 01:18
Спасибо за хороший пример
22. Сергей Ожерельев (Поручик) 28.04.14 12:00
(0) Спасибо, сегодня пригодилось.
23. Сергей Ожерельев (Поручик) 28.04.14 12:50
После строки (after line)

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


Добавить (add code)
Код
      //Заполнение параметров
   Если ДинамическийСписок.Параметры.Элементы.Количество() > 0 Тогда
      ПараметрыДанных = СхемаКомпоновкиДанных.ВариантыНастроек.Основной.Настройки.ПараметрыДанных.Элементы;
      Для каждого СтрокаПараметров Из ДинамическийСписок.Параметры.Элементы Цикл
         ПараметрСКД = СхемаКомпоновкиДанных.Параметры.Добавить();
         ПараметрСКД.Имя = Строка(СтрокаПараметров.Параметр);
         ПараметрСКД.Использование = ИспользованиеПараметраКомпоновкиДанных.Авто;
         ПараметрСКД.ОграничениеИспользования = Ложь;
         ПараметрСКД.ВключатьВДоступныеПоля = Ложь;
         
         ЗаполнитьЗначенияСвойств(ПараметрыДанных.Добавить(), СтрокаПараметров);
      КонецЦикла;
   КонецЕсли; 
Показать полностью
24. Алексей Захаров (almas) 19.07.14 11:33
Народ в зазеркалье проскочила статейка, что в 8.3.5 появился новый метод.
Написал для информации.

Автору спасибо. до 8.3.5 еще пыхтеть и пыхтеть...
25. Никита (Mopo3) 19.07.14 13:54
(24)

1. еще не смотрел что нового в 3.5. что за метод?

2. "пыхтеть" - в смысле?
26. {ÐƦǑƝȊ} mx (dour-dead) 04.08.14 13:47
в 8.3 отбор динамического списка может устанавливаться по другому, например так:

	//ОтборДинамическогоСписка = Форма.Отчеты.Отбор;
	ОтборДинамическогоСписка = Форма.Отчеты.КомпоновщикНастроек.Настройки.Отбор;
	
	ОтборДинамическогоСписка.Элементы.Очистить();
	
	ОтборВидОтчета        = ОтборДинамическогоСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборОрганизация      = ОтборДинамическогоСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборДатаНачала       = ОтборДинамическогоСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборДатаОкончания1   = ОтборДинамическогоСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборДатаОкончания2   = ОтборДинамическогоСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	
	ОтборВидОтчета.ЛевоеЗначение      = Новый ПолеКомпоновкиДанных("НаименованиеОтчета");
	ОтборОрганизация.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("Организация");
	ОтборДатаНачала.ЛевоеЗначение     = Новый ПолеКомпоновкиДанных("ДатаНачала");
	ОтборДатаОкончания1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаОкончания");
	ОтборДатаОкончания2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаОкончания");
	
...Показать Скрыть


По этому код немного надо менять

	// Сформируем отбор
	Для Каждого ЭлементОтбора Из ДинамическийСписок.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
		
		СоздатьЭлементОтбора(КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Элементы,ЭлементОтбора);
		
	КонецЦикла;
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа