Шаблоны Joomla 2.5 здесь: http://joomla25.ru/shablony/

Отборы в динамических списках

Исходный адрес статьи: https://enter-it.ru/docs/uto-admin-guide/nastrojki/otbory-v-dinamicheskih-spiskah/?ysclid=lrhk34vatt255047270

 

Отборы в динамических списках

Отбор для динамического списка может быть установлен статически или динамически, в пользовательском интерфейсе или конфигураторе. Все варианты отборов мы рассмотрим ниже.

  • Установка отбора в пользовательском режиме
  • Установка отбора в конфигураторе
    • Фиксированный отбор
    • Динамический (программный) отбор

Установка отбора в пользовательском режиме

Динамический список в отличие от таблицы или дерева значений – более подходящее решение для реализации форм содержащих какие-либо списки, т.к. динамический список предоставляет наиболее широкий набор инструментов для работы с отбором, группировкой полей, сортировкой. Данный отбор можно установить при работе в пользовательском режиме или конфигураторе, принцип одинаков.

Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».

Рис.1 Настроить списокРис.1 Настроить список

 

Откроется окно.

Рис.2 Окно настройкиРис.2 Окно настройки

 

На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.

Рис.3 На вкладке «Отбор»Рис.3 На вкладке «Отбор»

 

Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.

Отбор также можно группировать по логическим условиям «И», «ИЛИ».

Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»

 

При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.

Рис.5 Поля быстрых отборовРис.5 Поля быстрых отборов

 

Чтобы платформа 1С автоматически создавала поля быстрых отборов, при разработке формы в конфигураторе необходимо указать группу пользовательских настроек.

Рис.6 Группа пользовательских настроекРис.6 Группа пользовательских настроек

 

Данный отбор будет сохранен только для текущего пользователя, что позволяет гибко производить кастомизированные настройки динамического списка. Однако если стоит задача сделать фиксированный отбор для определенного списка для всех пользователей системы, ее мы сможем решить только через конфигуратор.

Установка отбора в конфигураторе

Работая в конфигураторе, мы можем устанавливать отбор динамического списка двух видов – фиксированный и динамический. Фиксированный отбор настраивается один раз, динамический или программный – можно устанавливать в зависимости от каких-либо данных в системе.

Фиксированный отбор

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

Рис.7 Фиксированный отборРис.7 Фиксированный отбор

 

Откроется окно.

Рис.8 Окно динамического спискаРис.8 Окно динамического списка

 

Отбор задается так же, как в пользовательском режиме.

Рис.9 Настроить списокРис.9 Настроить список

 

Динамический (программный) отбор

Зачастую возникает необходимость устанавливать отбор программно, например, при открытии формы выбора, когда нам необходимо открыть управляемую форму с отбором. В форму передается параметр и по этому параметру устанавливается отбор. Частый пример этого – отбор элементов справочника по владельцу.

Методы

Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:


ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.

ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.

ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).

ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.

Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).

Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).

РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:

  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.

ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).

Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:


ОбщегоНазначенияКлиентСервер. УдалитьЭлементыГруппыОтбораДинамическогоСписка ()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.

ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).

Представление Тип: Строка – представление поля компоновки.

В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.

 


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

 

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».

Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных

 


	ГруппаОтбора = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;
 
	ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = "Иванов";
 
	ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = "Петров";

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».

Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».

Рис.10 Отбор в динамическом списке Рис.10 Отбор в динамическом списке

 

Для этого к тексту запроса добавляем условие «ГДЕ Истина»…

Рис.11 Условие «ГДЕ Истина»Рис.11 Условие «ГДЕ Истина»

 

…в коде:

 


	Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

 

Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:

 


	Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

 

Если этого не учесть будет ошибка, но чтобы этого избежать, можно переделать на другую реализацию. В текс запроса добавляем такое условие:

ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))

…в коде:

 


	Список.Параметры.УстановитьЗначениеПараметра("ОтборУстановлен", ФИО.Количество() > 0);
	Список.Параметры.УстановитьЗначениеПараметра("РазрешенныеФИО", ФИО);

 

где ФИО – массив.

Ка видно, 2 строки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.

 

Добавление выбранного поля

Пример добавления выбранного поля:

Копировать в буфер обмена

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

В данном примере в список выбранных полей было добавлено поле КоличествоОстаток.

Для указания взаимного расположения полей в список выбранных полей можно добавить группу выбранных полей и поместить выбранные поля в нее.

Пример:

 

  // Создадим группу полей, для того, чтобы выводить в ней склад в раздельных колонках.
 ГруппаПолей = Настройки.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
 // Установим шапку группы полей.
 ГруппаПолей.Заголовок = "Реквизиты склада";
 // Укажем размещение.
 ГруппаПолей.Расположение = РасположениеПоляКомпоновкиДанных.Горизонтально;
 
 // Добавим выбранное поле в группу для вывода в отчет.
 ВыбранноеПоле = ГруппаПолей.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад");
 
 // Добавим выбранное поле  в группу для вывода в отчет.
 ВыбранноеПоле = ГруппаПолей.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад.Код");
 // Установим заголовок поля.
 ВыбранноеПоле.Заголовок = "Код";

В данном примере создана группа выбранных полей, в нее помещено два поля. Группе указано, каким образом располагать поля, вложенные в нее. Для поля Склад.Код установлен заголовок.

Добавление отбора

Пример добавления элемента отбора:

 

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

В данном примере в отчет добавлен элемент отбора с видом сравнения «В Группе».

В отбор можно добавлять сложные условия. Делается это при помощи групп элементов отбора.

Пример добавления группового условия:

Копировать в буфер обмена

 ГруппаЭлементовОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
 ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 100;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 200;

В данном примере добавлено условие КоличествоОстаток >= 100 И КоличествоОстаток <=200.

Добавление упорядочивания

Пример добавления упорядочивания:

 

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

В данном примере показано добавление упорядочивания по полю КоличествоОстаток в убывающем порядке.

Установка параметров вывода

Пример установки параметров вывода:

 

 // Установим макет оформления.
 ЭлементОформления = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МакетОформления"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = "Море";
 
 // Укажем, что отбор не нужно выводить в отчет.
 ЭлементОформления = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВыводитьОтбор"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;

В данном примере отчету установлен макет оформления и указано, что выводить отбор в результат отчета не нужно.

Добавление условного оформления

Пример добавления условного оформления:

 

// Добавим условное оформление.
 ЭлементУсловногоОформления = Настройки.УсловноеОформление.Элементы.Добавить();
 
 // Создадим условие оформления.
 ГруппаЭлементовОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
 ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 100;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 200;
 
 // Укажем цвет.
 ЭлементОформления = ЭлементУсловногоОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветТекста"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = Новый Цвет(255, 0, 0);
 
 // Укажем, что оформление нужно применять только к одному полю.
 ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
 ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоОстаток");

В данном примере добавлено оформление на поле КоличествоОстаток. Поле будет отображаться красным цветом, в случае если его значение больше или равно 100 и меньше или равно 200.

Добавление группировки

Пример добавление группировки:

 

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

// Укажем, по каким полям нужно группировать.
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип(«ПолеГруппировкиКомпоновкиДанных»));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(«Номенклатура»);

// Укажем тип иерархии.
ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;

В данном примере добавлена группировка по полю Номенклатура с иерархией.

Заметим, что группировке нужно указать, какие поля в ней нужно выводить, как упорядочивать группировку. Если нужно, чтобы состав выводимых полей и полей упорядочивания определялся системой самостоятельно на основании полей группировки и вышестоящих группировок и отчета, то нужно добавить в выбранные поля и поля упорядочивания авто поля.

Пример добавления автополей в порядок и выбранные поля.

Копировать в буфер обмена

 // Укажем, что поля, которые нужно выводить в группировке, система должна определять самостоятельно.
Группировка.Выбор.Элементы.Добавить(Тип(«АвтоВыбранноеПолеКомпоновкиДанных»));

// Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку.
Группировка.Порядок.Элементы.Добавить(Тип(«АвтоЭлементПорядкаКомпоновкиДанных»));

Добавление детальных записей

Детальные записи являются группировкой, в которой отсутствуют поля группировки.

Пример добавления детальных записей, вложенных в группировку:

Копировать в буфер обмена

// Добавим в отчет детальные записи, вложенные в группировку.
ДетальныеЗаписи = Группировка.Структура.Добавить(Тип(«ГруппировкаКомпоновкиДанных»));

// Укажем, что поля, которые нужно выводить в детальных записях, система должна определять самостоятельно.
ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип(«АвтоВыбранноеПолеКомпоновкиДанных»));

// Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить детальные записи.
ДетальныеЗаписи.Порядок.Элементы.Добавить(Тип(«АвтоЭлементПорядкаКомпоновкиДанных»));

// Добавим детальным записям оформление.
ЭлементУсловногоОформления = ДетальныеЗаписи.УсловноеОформление.Элементы.Добавить();
// Укажем наклонный шрифт.
ЭлеменОформления = ЭлементУсловногоОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«Шрифт»));
ЭлеменОформления.Использование = Истина;
ЭлеменОформления.Значение = Новый Шрифт(,,, Истина);

В данном примере детальные записи добавлены в группировку, в детальные записи добавлены автополя выбора и порядка, указано условное оформление, которое будет действовать в этих детальных записях.

Добавление диаграммы

Пример добавления диаграммы:

 

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

 // Укажем, по какому полю нужно группировать в серии.
 ПолеГруппировки = Серия.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Склад");
 
 // Укажем, что система сама должна определять, какие поля нужно выводить в серии.
 Серия.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 
 // Укажем каким образом нужно упорядочивать данные серии
 ЭлементПорядка = Серия.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
 ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Склад");

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

Добавление таблицы

Пример добавления таблицы:

 

// Добавим в отчет таблицу
 Таблица = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
 
 // Добавим в таблицу строку
 Строка = Таблица.Строки.Добавить();
 // Укажем, что система сама должна определять, какие поля нужно выводить в группировке
 Строка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 // Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку
 Строка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
 // Укажем, по какому полю нужно группировать
 ПолеГруппировки = Строка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
 
 // Добавим в таблицу колонку
 Колонка = Таблица.Колонки.Добавить();
 // Укажем, что система сама должна определять, какие поля нужно выводить в группировке
 Колонка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 // Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку
 Колонка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
 // Укажем, по какому полю нужно группировать
 ПолеГруппировки = Колонка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Склад");

В данном примере в отчет добавлена таблица, в таблице в строках выводится группировка по полю Номенклатура, а в колонках выводится группировка по полю Склад.