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

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

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

Постановка проблемы и анализ исходного запроса

Рассмотрим типичную ситуацию. Нам необходимо вывести в динамический список элементы и группы справочника ВидыВД, исключая те, у которых заполнена дата в реквизите НеИспользоватьДата (то есть дата использования меньше заданного параметра). Мы составляем следующий запрос для динамического списка:


ВЫБРАТЬ
    СправочникВидыВД.Ссылка КАК Ссылка,
    СправочникВидыВД.ПометкаУдаления КАК ПометкаУдаления,
    СправочникВидыВД.Родитель КАК Родитель,
    СправочникВидыВД.ЭтоГруппа КАК ЭтоГруппа,
    СправочникВидыВД.Код КАК Код,
    СправочникВидыВД.Наименование КАК Наименование,
    СправочникВидыВД.НеИспользоватьДата КАК НеИспользоватьДата
ИЗ
    Справочник.ВидыВД КАК СправочникВидыВД
ГДЕ
    (СправочникВидыВД.НеИспользоватьДата > &ДатаДо 
    ИЛИ СправочникВидыВД.НеИспользоватьДата = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))

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

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

Основная причина кроется в том, как динамический список интерпретирует данные при включенном режиме иерархии. Платформа 1С ставит приоритет на сохранение целостности структуры дерева. Давайте разберем, что происходит "под капотом":

  1. Отображение контейнеров: Если внутри группы есть хотя бы один дочерний элемент (или вложенная подгруппа), который соответствует условию фильтра, платформа обязана показать всю цепочку его родителей. Если родительская группа будет скрыта, пользователь не сможет увидеть найденный элемент в иерархическом режиме, так как дереву будет "не на чем держаться".
  2. Специфика основной таблицы: Когда у динамического списка установлена Основная таблица, система управления данными берет на себя функции по оптимизации выборки и построению дерева. Для обеспечения возможности навигации платформа может принудительно подтягивать группы-родители, игнорируя жесткие фильтры ГДЕ, если они воспринимаются системой как вспомогательные.
  3. Различие между "ГДЕ" и "Отбором": Условие в секции ГДЕ текста запроса динамического списка работает жестко только на уровне первичной выборки данных. Но механизм построения дерева (Hierarchy) накладывается поверх этого результата. Если группа попала в выборку как "родитель" для валидного элемента, она будет отображена.

Проанализируем влияние режима просмотра

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

Как решить проблему и скрыть ненужные группы

Существует несколько подходов к решению данной задачи, в зависимости от того, насколько критично сохранение иерархии.

Способ 1: Использование программной настройки отбора СКД

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


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

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

Способ 2: Корректировка иерархии в запросе

Если нам нужно, чтобы группы скрывались независимо от наличия в них элементов, мы можем попробовать изменить логику запроса, сделав выборку более сложной. Однако в динамических списках это часто приводит к потере возможности редактирования данных "в списке" (так как основная таблица может перестать определяться однозначно).

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


ГДЕ (СправочникВидыВД.НеИспользоватьДата > &ДатаДо 
    ИЛИ СправочникВидыВД.НеИспользоватьДата = ДАТАВРЕМЯ(1, 1, 1))
    И (СправочникВидыВД.ЭтоГруппа = ЛОЖЬ ИЛИ (СправочникВидыВД.ЭтоГруппа = ИСТИНА И СправочникВидыВД.НеИспользоватьДата > &ДатаДо))

Внимание: Этот метод все равно может перекрываться механизмом отрисовки дерева, если включен иерархический просмотр.

Способ 3: Программное управление режимом просмотра

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


// При установке фильтра по дате
Элементы.Список.Отображение = ОтображениеТаблицы.Список; // Переключаем в плоский вид

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

Итоги и рекомендации

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

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

← На главную