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

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

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

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

&НаСервере

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Иначе

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

                                   |    *

                                   |ИЗ

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

    КонецЕсли;

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

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

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

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

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

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

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

        КонецЦикла;

    КонецЕсли;

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

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

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

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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

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

            Иначе

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

            КонецЕсли;

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

        КонецЦикла;

    КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере

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

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

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

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

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

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

        КонецЦикла;

    КонецЕсли;

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

30 Comments

  1. premierex

    Хороший пример и стиль внятный. Несомненно, +!

    Reply
  2. SerebanSK

    Молодец! Возьми с полки пирожок!)) +

    Reply
  3. ksvd

    Странно, что мало отзывов. А пример очень полезный

    Reply
  4. Mopo3

    Да наверно все понятно в примере, вот и нет отзывов 🙂

    Reply
  5. Pim

    Материал хороший, только я не нашёл как передаются параметры из динамического списка в СКД.

    Reply
  6. Pim

    (5). Если кого-то интересует, то параметры можно передавать:

    dcParameter = new ПараметрКомпоновкиДанных(«period»);

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

    periodItem.Значение = ДинамическийСписок.Параметры.НайтиЗначениеПараметра(dcParameter).Значение;

    periodItem.Use = true;

    Reply
  7. Mopo3

    (5) да, с параметрами я практически увидел недочет уже после публикации.

    там же где заполнение отбора:

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

    Если Не ЭлементПараметра.Использование Тогда Продолжить; КонецЕсли;

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

    КонецЦикла;

    Reply
  8. Новенький_2209

    Хороший пример

    Reply
  9. OBEH

    А как этот самый, полученный запросом, динамический список вывести, например, в табличный документ по нажатию кнопки?

    Reply
  10. Mopo3

    (9) это уже в компетенции программиста…

    Reply
  11. OBEH

    Ну подскажи

    Reply
  12. Mopo3

    эх, полный код написать не могу, нет времени на подарки…

    как вариант: вывод компоновкой не в таблицу значений, а в табличный документ, возврат его с сервера на клиента, далее отображение на клиенте.

    Reply
  13. OBEH

    Мне не нужен полный код.

    Идея с выводом «компоновкой не в таблицу значений, а в табличный документ»

    имеет, конечно, право на существование. Рассматривал этот вариант. Но в

    моем случае лучше из уже сформированной в результате открытия формы

    таблицы значений. Никак не получается достучаться до этой таблицы по нажатию

    кнопки, чтобы ее перебрать в отчет

    Reply
  14. tormozit

    А можно листинг кода сделать без пустых строк? А то он в 2 раза больше по высоте, чем кажется нужно.

    Reply
  15. Mopo3

    (13) приведите код, попробуем решить проблему

    Reply
  16. Mopo3

    (14) разукрашка…

    в приложении обработка с кодом без пустых строк 🙂

    Reply
  17. krein

    (14) да, листинг в публикации надо бы поправить

    Reply
  18. glime

    все намного проще,

    и не нужен не какой сервер, на сервер ты уже без контекста передаешь для обработки данные. Хотя может не отработать при установки ЛиномическийОтбор = Истина, в этом случае только через СКД и копирование параметров с ДинамическогоСписка.

    Сч = 0;
    
    Пока Истина Цикл
    
    Сч = Сч + 1;
    
    СтруктураДанных = Элементы.ДинамическийСписок.ДанныеСтроки(Сч);
    
    Если СтруктураДанных = Неопределено Тогда
    
    Прервать;
    
    КонецЕсли;
    
    СтруктураПередачи = Новый Структура(«ВидНоменклатуры, Свойство, СвойствоСтрока, Выбран»,ВидНоменклатуры,СтруктураДанных.Свойство,СтруктураДанных.СвойствоСтрока,Ложь);
    
    ИзменитьФлаг(СтруктураПередачи);
    
    
    КонецЦикла;
    
    Элементы.ДинамическийСписок.Обновить();
    

    Показать

    Reply
  19. AK-74S

    (9) Ну, как-то так:

     ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ЭлементыФормы.СправочникСписок.Значение);
    ПостроительОтчета.Выполнить();
    
    Выборка = ПостроительОтчета.Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    …
    
    Reply
  20. dour-dead

    Спасибо огромное за пример)

    Reply
  21. vital1c

    Спасибо за хороший пример

    Reply
  22. Поручик

    (0) Спасибо, сегодня пригодилось.

    Reply
  23. Поручик

    После строки (after line)

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

    Показать полностью

    Добавить (add code)

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

    Показать полностью

    Reply
  24. almas

    Народ в зазеркалье проскочила статейка, что в 8.3.5 появился новый метод.

    Написал для информации.

    Автору спасибо. до 8.3.5 еще пыхтеть и пыхтеть…

    Reply
  25. Mopo3

    (24)

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

    2. «пыхтеть» — в смысле?

    Reply
  26. dour-dead

    в 8.3 отбор динамического списка может устанавливаться по другому, например так:

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

    Показать

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

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

    А у меня не проходит с параметром, хотя задаю их :

    ПараметрСКД=КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.Элементы.Найти(«ВидЦены»);

    ПараметрСКД.Использование = Истина;

    ПараметрСКД.Значение = Справочники.ВидыЦен.НайтиПоНаименованию(«Себестоимость»);

    а в результатк ошибка-

    {Обработка.ПодборТоваровВДокументСписания.Форма.ФормаПодбора.Форма(1771)}: Ошибка при вызове метода контекста (Вывести)

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

    по причине:

    Ошибка вывода результата

    по причине:

    Ошибка при выводе результата

    по причине:

    Ошибка получения данных

    по причине:

    Ошибка создания набора данных «НаборДанных»

    по причине:

    Ошибка при исполнении запроса набора данных

    по причине:

    {(15, 79)}: Не задано значение параметра «ВидЦены»

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = <<?>>&ВидЦены) КАК ЦеныНоменклатуры

    может подскажите чт делать?

    Reply
  28. mni

    Решено

    Reply
  29. Shishkibam

    Тут есть пример отбора https://infofront.su/1c-otbor-v-dinamicheskom-spiske-programmno/

    Reply
  30. mwoleg

    Спасибо!

    Мне очень пригодилось!

    Однозначно +

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *