Как программно установить отбор в динамическом списке на управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций на платформе 1С:Предприятие 8.3, особенно при работе с управляемыми формами, часто возникает необходимость динамически изменять данные, отображаемые в списке. Одним из мощных инструментов для этого является программная установка отборов в динамическом списке. Мы рассмотрим, как эффективно использовать этот механизм для фильтрации данных по одному или нескольким условиям, а также для различных типов значений.

Представим ситуацию: нам нужно отобразить в таблице только те документы или элементы справочников, которые соответствуют определенным критериям, заданным пользователем или логикой программы. Стандартный механизм отбора в динамическом списке, основанный на системе компоновки данных (СКД), предоставляет для этого широкие возможности. Мы разберем по шагам, как программно формировать и применять такие отборы.

Суть работы заключается в том, что мы получаем доступ к свойству Отбор динамического списка, которое является объектом типа ОтборКомпоновкиДанных. Этот объект содержит коллекцию элементов отбора Элементы, куда мы можем добавлять как отдельные условия (ЭлементОтбораКомпоновкиДанных), так и группы условий (ГруппаЭлементовОтбораКомпоновкиДанных).

Основные шаги по программной установке отбора

  1. Получение доступа к отбору динамического списка: Первым делом нам необходимо обратиться к свойству Отбор нашего динамического списка. Если динамический список называется Список, то это будет ЭлементыФормы.Список.Отбор.
  2. Очистка существующих отборов (опционально): Если нам нужно полностью переопределить отбор, а не дополнить его, то перед добавлением новых элементов целесообразно очистить текущий отбор. Это делается вызовом метода Очистить() у коллекции Элементы отбора.
  3. Создание элементов отбора: Для каждого условия отбора создается новый объект типа ЭлементОтбораКомпоновкиДанных.
  4. Настройка элемента отбора: У каждого созданного элемента отбора мы должны задать следующие основные свойства:
    • ЛевоеЗначение: Это поле компоновки данных, по которому будет производиться отбор. Обычно это строка с именем поля, например, "Контрагент", "Дата" или "Номенклатура.Наименование". Мы можем использовать объект ПолеКомпоновкиДанных для более явного указания.
    • ВидСравнения: Тип сравнения, например, ВидСравненияКомпоновкиДанных.Равно, ВидСравненияКомпоновкиДанных.Больше, ВидСравненияКомпоновкиДанных.Содержит и так далее.
    • ПравоеЗначение: Значение, с которым будет сравниваться ЛевоеЗначение. Это может быть ссылка на объект, строка, число, дата, булево значение и т.д.
    • Использование: Булево значение, указывающее, активен ли данный элемент отбора. Обычно устанавливается в Истина.
  5. Добавление элементов отбора в коллекцию: После настройки каждый элемент отбора добавляется в коллекцию Элементы свойства Отбор динамического списка.
  6. Обновление динамического списка: После всех изменений необходимо обновить данные динамического списка, вызвав метод ЭлементыФормы.Список.Обновить().

Рассмотрим подробнее каждый из этих шагов на конкретных примерах.

Простой отбор по одному полю

Предположим, нам нужно отобрать документы по конкретному контрагенту. Мы имеем динамический список с именем СписокДокументов и хотим отфильтровать его по полю "Контрагент".


// Получаем доступ к отбору динамического списка
ОтборСписка = Элементы.СписокДокументов.Отбор;

// Очищаем предыдущие отборы, если они есть
ОтборСписка.Элементы.Очистить();

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

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

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

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

// Включаем отбор
ЭлементОтбора.Использование = Истина;

// Обновляем динамический список, чтобы применились новые условия отбора
Элементы.СписокДокументов.Обновить();

В этом примере ВыбранныйКонтрагент должен быть ссылочным типом, соответствующим типу поля "Контрагент" в источнике данных динамического списка.

Отбор с использованием нескольких условий (И/ИЛИ)

Часто требуется комбинировать несколько условий. Например, отобрать документы за определенный период И по конкретному контрагенту, или документы с определенным статусом ИЛИ документы от конкретного менеджера. Для этого мы используем ГруппаЭлементовОтбораКомпоновкиДанных.

Группа элементов отбора позволяет объединять несколько условий с помощью логических операторов "И" (ИЛИ) или "ИЛИ" (ИЛИ), задаваемых свойством ВидГруппы.

Пример отбора по условию "И" (AND)

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


// Получаем доступ к отбору динамического списка
ОтборСписка = Элементы.СписокДокументов.Отбор;
ОтборСписка.Элементы.Очистить();

// Создаем группу элементов отбора
ГруппаОтбора = ОтборСписка.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ВидГруппы = ВидГруппыЭлементовОтбораКомпоновкиДанных.И; // Условие "И"
ГруппаОтбора.Использование = Истина;

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

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

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

// Обновляем динамический список
Элементы.СписокДокументов.Обновить();

Обратите внимание, что для отбора по диапазону дат мы используем два отдельных условия с БольшеИлиРавно и МеньшеИлиРавно, объединенные в одной группе "И". Функции НачалоДня() и КонецДня() очень полезны для работы с датами.

Пример отбора по условию "ИЛИ" (OR)

Теперь рассмотрим случай, когда нам нужно отобрать документы, созданные одним менеджером ИЛИ имеющие определенный статус.


// Получаем доступ к отбору динамического списка
ОтборСписка = Элементы.СписокДокументов.Отбор;
ОтборСписка.Элементы.Очистить();

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

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

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

// Обновляем динамический список
Элементы.СписокДокументов.Обновить();

Таким образом, мы видим, что использование ГруппаЭлементовОтбораКомпоновкиДанных позволяет строить достаточно сложные логические конструкции отборов.

Работа с различными типами данных и видами сравнения

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

  1. Строковые поля:
    • ВидСравненияКомпоновкиДанных.Содержит: Для поиска подстроки в строке.
    • ВидСравненияКомпоновкиДанных.НеСодержит: Если подстрока отсутствует.
    • ВидСравненияКомпоновкиДанных.НачинаетсяС: Если строка начинается с указанного значения.
    • ВидСравненияКомпоновкиДанных.ЗаканчиваетсяНа: Если строка заканчивается на указанное значение.
    • ВидСравненияКомпоновкиДанных.Равно, ВидСравненияКомпоновкиДанных.НеРавно: Для точного сравнения.
    
    // Отбор по наименованию, содержащему "тест"
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.Наименование");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
    ЭлементОтбора.ПравоеЗначение = "тест";
    
  2. Числовые поля:
    • ВидСравненияКомпоновкиДанных.Равно, ВидСравненияКомпоновкиДанных.НеРавно.
    • ВидСравненияКомпоновкиДанных.Больше, ВидСравненияКомпоновкиДанных.Меньше.
    • ВидСравненияКомпоновкиДанных.БольшеИлиРавно, ВидСравненияКомпоновкиДанных.МеньшеИлиРавно.
    
    // Отбор по сумме, которая больше 1000
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СуммаДокумента");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
    ЭлементОтбора.ПравоеЗначение = 1000;
    
  3. Даты и время:
    • ВидСравненияКомпоновкиДанных.Равно, ВидСравненияКомпоновкиДанных.НеРавно.
    • ВидСравненияКомпоновкиДанных.Между: Для отбора значений, находящихся в заданном диапазоне. В этом случае свойство ПравоеЗначение должно быть массивом из двух дат: начала и конца диапазона.
    • ВидСравненияКомпоновкиДанных.ВПериоде: Для отбора значений, попадающих в предопределенный период (День, Неделя, Месяц, Год и т.д.). Для этого используется свойство ПравоеЗначение типа СтандартныйПериод.
    
    // Отбор по дате между двумя значениями
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Между;
    ЭлементОтбора.ПравоеЗначение = Новый Массив({НачалоДня(ДатаНачала), КонецДня(ДатаОкончания)});
    
  4. Булевы поля:
    • ВидСравненияКомпоновкиДанных.Равно, ВидСравненияКомпоновкиДанных.НеРавно.
    
    // Отбор по полю "ПомеченНаУдаление"
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПомеченНаУдаление");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Ложь; // Отобразить только не помеченные на удаление
    
  5. Ссылочные поля (Справочники, Документы, Перечисления):
    • ВидСравненияКомпоновкиДанных.Равно, ВидСравненияКомпоновкиДанных.НеРавно.
    • ВидСравненияКомпоновкиДанных.ВГруппе: Для отбора элементов, принадлежащих к определенной группе справочника (включая подгруппы).
    • ВидСравненияКомпоновкиДанных.ВИерархии: Аналогично ВГруппе, но для иерархических справочников.
    • ВидСравненияКомпоновкиДанных.ВСписке: Для отбора по нескольким значениям из списка. ПравоеЗначение в этом случае должно быть Массив или СписокЗначений.
    
    // Отбор по нескольким контрагентам из списка
    СписокКонтрагентов = Новый СписокЗначений();
    СписокКонтрагентов.Добавить(Контрагент1);
    СписокКонтрагентов.Добавить(Контрагент2);
    
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ЭлементОтбора.ПравоеЗначение = СписокКонтрагентов;
    

Важные аспекты и советы

При работе с программными отборами в динамическом списке, мы рекомендуем учитывать следующие моменты:

  1. Использование ПолеКомпоновкиДанных: Всегда предпочтительнее использовать объект Новый ПолеКомпоновкиДанных("ИмяПоля") для свойства ЛевоеЗначение, нежели просто строковое имя. Это повышает надежность кода и позволяет системе лучше валидировать поля.
  2. Очистка отборов: Если ваш сценарий подразумевает полную замену отбора, не забывайте вызывать ОтборСписка.Элементы.Очистить() перед добавлением новых элементов. В противном случае новые условия будут добавляться к существующим.
  3. Актуализация данных: Всегда вызывайте ЭлементыФормы.ВашДинамическийСписок.Обновить() после изменения отбора, чтобы данные в списке были перечитаны и отображены с учетом новых условий.
  4. Производительность: Старайтесь формировать отборы таким образом, чтобы они были максимально эффективными. Слишком сложные или плохо оптимизированные отборы могут замедлить работу динамического списка, особенно при больших объемах данных.
  5. Динамическое изменение источников данных: Отборы применяются к текущему источнику данных динамического списка (запрос СКД). Если вы меняете основной запрос динамического списка, убедитесь, что поля, по которым вы устанавливаете отбор, по-прежнему существуют в новом запросе.
  6. Совместимость с пользовательскими отборами: Помните, что программный отбор может конфликтовать или комбинироваться с пользовательскими отборами, установленными через интерфейс 1С. Если вы хотите полностью контролировать отбор, возможно, потребуется отключать пользовательские настройки.
  7. Отладка: При возникновении проблем с отбором, используйте отладчик для проверки значений свойств ЛевоеЗначение, ПравоеЗначение, ВидСравнения и структуры коллекции Элементы в ОтборСписка. Это поможет выявить некорректно заданные условия.

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

← На главную