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

03.07.14

Разработка - Механизмы платформы 1С

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

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Отбор строк
.epf 7,92Kb
91
91 Скачать (1 SM) Купить за 1 850 руб.

&НаСервере

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

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

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

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

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

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



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

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



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

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

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

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



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

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

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

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

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

    Иначе

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

                                   |    *

                                   |ИЗ

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

    КонецЕсли;



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

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

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



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

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

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

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

        КонецЦикла;

    КонецЕсли;



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



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



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

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

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

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

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



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

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

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

    КонецЦикла;



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

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

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

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

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

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

            Иначе

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

            КонецЕсли;

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

        КонецЦикла;

    КонецЕсли;



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

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



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

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



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

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

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



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

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

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



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



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

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

&НаСервере

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

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

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



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

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

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

        КонецЦикла;

    КонецЕсли;

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

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7443    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5942    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17663    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11221    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23756    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18828    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14729    YA_418728146    7    

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

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

Для Каждого ЭлементПараметра Из ДинамическийСписок.Параметры.Элементы Цикл
Если Не ЭлементПараметра.Использование Тогда Продолжить; КонецЕсли;
КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ЭлементПараметра.Параметр,ЭлементПараметра.Значение);
КонецЦикла;
8. Новенький_2209 21.09.12 11:01 Сейчас в теме
9. OBEH 04.12.12 16:54 Сейчас в теме
А как этот самый, полученный запросом, динамический список вывести, например, в табличный документ по нажатию кнопки?
10. Mopo3 332 04.12.12 17:39 Сейчас в теме
(9) это уже в компетенции программиста...
19. AK-74S 8 27.06.13 14:33 Сейчас в теме
(9) Ну, как-то так:
	ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ЭлементыФормы.СправочникСписок.Значение);
     ПостроительОтчета.Выполнить();

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

Сч = 0;
	
	Пока Истина Цикл
		
		Сч = Сч + 1;
		
		СтруктураДанных = Элементы.ДинамическийСписок.ДанныеСтроки(Сч);
		
		Если СтруктураДанных = Неопределено Тогда
			
			Прервать;
			
		КонецЕсли;
		
		СтруктураПередачи = Новый Структура("ВидНоменклатуры, Свойство, СвойствоСтрока, Выбран",ВидНоменклатуры,СтруктураДанных.Свойство,СтруктураДанных.СвойствоСтрока,Ложь);
	
		ИзменитьФлаг(СтруктураПередачи);		
		
		
	КонецЦикла;
	
	Элементы.ДинамическийСписок.Обновить();
	
Показать
20. dour-dead 272 18.10.13 20:25 Сейчас в теме
Спасибо огромное за пример)
21. vital1c 98 12.03.14 01:18 Сейчас в теме
Спасибо за хороший пример
22. Поручик 4692 28.04.14 12:00 Сейчас в теме
(0) Спасибо, сегодня пригодилось.
23. Поручик 4692 28.04.14 12:50 Сейчас в теме
После строки (after line)

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


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

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

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

2. "пыхтеть" - в смысле?
26. dour-dead 272 04.08.14 13:47 Сейчас в теме
в 8.3 отбор динамического списка может устанавливаться по другому, например так:

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


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

	// Сформируем отбор
	Для Каждого ЭлементОтбора Из ДинамическийСписок.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
		
		СоздатьЭлементОтбора(КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Элементы,ЭлементОтбора);
		
	КонецЦикла;
27. mni 02.12.18 10:40 Сейчас в теме
А у меня не проходит с параметром, хотя задаю их :
ПараметрСКД=КомпоновщикНастроекКомпоновкиДанных.Настройки.ПараметрыДанных.Элементы.Найти("ВидЦены");
ПараметрСКД.Использование = Истина;
ПараметрСКД.Значение = Справочники.ВидыЦен.НайтиПоНаименованию("Себестоимость");
а в результатк ошибка-
{Обработка.ПодборТоваровВДокументСписания.Форма.ФормаПодбора.Форма(1771)}: Ошибка при вызове метода контекста (Вывести)
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных,Истина);
по причине:
Ошибка вывода результата
по причине:
Ошибка при выводе результата
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных "НаборДанных"
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(15, 79)}: Не задано значение параметра "ВидЦены"
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = <<?>>&ВидЦены) КАК ЦеныНоменклатуры
может подскажите чт делать?
28. mni 02.12.18 13:19 Сейчас в теме
29. Shishkibam 4 22.05.19 22:09 Сейчас в теме
30. mwoleg 55 21.11.19 11:27 Сейчас в теме
Спасибо!
Мне очень пригодилось!
Однозначно +
31. AzagTot 41 24.09.20 01:01 Сейчас в теме
В модуле формы:

СхемаКД = Элементы.СписокНаФорме.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	НастройкиКД = Элементы.СписокНаФорме.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, НастройкиКД);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Показать

Результат - это дерево или таблица значений, сформированная по данным динамического списка с текущими настройками и отборами.
32. AzagTot 41 24.09.20 01:39 Сейчас в теме
А точнее так:

СхемаКД     = Элементы.СписокНаФорме.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	НастройкиКД = Элементы.СписокНаФорме.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, НастройкиКД,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	Результат = Новый ТаблицаЗначений;
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВывода.УстановитьОбъект(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Показать
uno-c; RWS88; treavlad; +3 Ответить
Оставьте свое сообщение