Как правильно настроить отбор в динамическом списке 1С, используя группы "И" и "ИЛИ"?

Программист 1С v8.3 (Управляемые формы)
← К списку

При работе с динамическими списками в 1С мы часто сталкиваемся с необходимостью применения сложных условий отбора. Чтобы список отображал именно те данные, которые нам нужны, крайне важно правильно понимать и применять логику группировки условий "И" и "ИЛИ". В этой статье мы подробно разберем, как избежать распространенных ошибок и настроить фильтры максимально гибко и точно.

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

Понимание логических групп: "И" и "ИЛИ"

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

Ключевой момент – это правильная вложенность групп. Именно она позволяет создавать сложные логические конструкции, например, "А И (Б ИЛИ В)" или "(А И Б) ИЛИ В".

В чем заключается сложность с группировкой условий?

Основная проблема, с которой сталкиваются многие пользователи и разработчики, заключается в том, что по умолчанию несколько последовательно добавленных условий отбора объединяются по логике "И". Если мы просто добавляем условия одно за другим, система интерпретирует их как "Условие1 И Условие2 И Условие3".

Однако часто требуется более сложная логика, например: "Нам нужны все документы, где (Менеджер = 'Иванов' ИЛИ Менеджер = 'Петров') И Статус = 'Выполнен'". Если мы просто добавим три условия: "Менеджер = 'Иванов'", "Менеджер = 'Петров'", "Статус = 'Выполнен'", то система воспримет это как "Менеджер = 'Иванов' И Менеджер = 'Петров' И Статус = 'Выполнен'", что, очевидно, не может быть истинным, так как менеджер не может быть одновременно Ивановым и Петровым.

Для решения подобных задач нам необходимо явно указать, что часть условий должна быть объединена по "ИЛИ", а затем этот блок "ИЛИ" уже объединен по "И" с другими условиями. Это достигается путем вложения групп.

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

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

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

Таким образом, для достижения логики "Группа И должна быть в Группе ИЛИ" или наоборот, мы просто создаем нужные группы и перетаскиваем или группируем в них другие условия или группы. Это очень похоже на использование скобок в выражении: сначала вычисляется то, что в скобках, а затем результат используется в общем выражении.

Программное формирование сложного отбора

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

Рассмотрим пример, где нам нужно реализовать отбор: "Найти документы, где (Менеджер = 'Иванов' ИЛИ Менеджер = 'Петров') И Статус = 'Выполнен'".

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


// Предположим, что "ДинамическийСписок" - это объект ДинамическийСписок,
// доступный, например, в обработчике ПриСозданииНаСервере
// или ПриОткрытии формы динамического списка.
// Для примера используем переменную "ОтборСписка".
// Если вы работаете в модуле формы, то это может быть Объект.ДинамическийСписок.Отбор

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

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

// --- Шаг 1: Создаем основную группу "И" для всего отбора ---
// (Хотя по умолчанию условия добавляются по "И", явное создание группы
// делает код более читаемым и гибким для дальнейших изменений)
ГруппаОсновнаяИ = ОтборСписка.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОсновнаяИ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ГруппаОсновнаяИ.Представление = "Основная группа И"; // Для удобства отладки

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

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

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

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

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

В этом примере мы видим, как сначала создается основная группа "И", в которую затем добавляется вложенная группа "ИЛИ". В группу "ИЛИ" добавляются условия по полю Менеджер. Затем в основную группу "И" добавляется условие по полю Статус. Такая структура обеспечивает правильную логику фильтрации.

Важные аспекты и рекомендации

Давайте рассмотрим несколько дополнительных моментов, которые помогут вам более эффективно работать с отборами в динамических списках:

Правильное применение логических групп "И" и "ИЛИ" является фундаментальным навыком при работе с динамическими списками в 1С. Мы надеемся, что это подробное руководство поможет вам создавать точные и эффективные фильтры для любых задач!

← К списку