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