Почему задваиваются строки в запросе 1С при использовании АВТОУПОРЯДОЧИВАНИЕ и как сохранить иерархию при фильтрации

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

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

Разбираем причину задвоения строк при АВТОУПОРЯДОЧИВАНИЕ

Рассмотрим ситуацию, когда простейший запрос к справочнику Номенклатура начинает возвращать одинаковые записи. Проанализируем исходный код запроса:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В ИЕРАРХИИ(&Родитель)
АВТОУПОРЯДОЧИВАНИЕ

Выясним, почему добавление всего одного слова АВТОУПОРЯДОЧИВАНИЕ приводит к визуальному дублированию данных. Существует три основные причины:

  1. Особенности работы Консоли запросов. Это самая частая причина. Многие версии консолей (например, популярная версия 3.8.9) при наличии инструкции АВТОУПОРЯДОЧИВАНИЕ пытаются самостоятельно построить дерево значений в интерфейсе. Если запрос возвращает элементы, но «теряет» их родителей из-за условий фильтрации, алгоритм консоли может ошибочно вывести одну и ту же строку дважды: как рядовой элемент и как узел иерархии. Проверить это легко — попробуйте выгрузить результат этого же запроса в ТаблицаЗначений программно. Скорее всего, дублей там не будет.
  2. Специфика трансляции В ИЕРАРХИИ в SQL. На уровне СУБД оператор В ИЕРАРХИИ преобразуется в сложные соединения таблиц. Если в параметре &Родитель передан массив, в котором один элемент является дочерним по отношению к другому, платформа может найти один и тот же объект через разные пути в дереве. Без использования ключевого слова РАЗЛИЧНЫЕ это приведет к физическому появлению дублей в выборке.
  3. Логика формирования дерева. АВТОУПОРЯДОЧИВАНИЕ заставляет систему добавлять в секцию УПОРЯДОЧИТЬ ПО не только основные поля представления (код, наименование), но и ссылку. Для иерархических таблиц это включает механизм выстраивания связей «родитель-потомок», что в сочетании с определенными фильтрами в секции ГДЕ может спровоцировать некорректное отображение в плоском списке.

Проблема исчезновения групп при фильтрации

Рассмотрим другую классическую задачу: нам нужно выбрать всю номенклатуру, у которой Цвет = "Красный", но при этом сохранить иерархическую структуру (папки). Если мы напишем простой фильтр, то увидим только элементы, так как у групп справочника реквизит Цвет не заполнен или отсутствует. Рассмотрим, как это выглядит в коде:


// Неправильный подход: иерархия пропадет
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Цвет = &Красный
УПОРЯДОЧИТЬ ПО
    Наименование ИЕРАРХИЯ

В данном случае условие ГДЕ просто отсечет все папки, и УПОРЯДОЧИТЬ ПО ... ИЕРАРХИЯ не сможет восстановить структуру, так как родителей физически нет в результате запроса.

Решение №1: Использование ИТОГИ ПО ... ТОЛЬКО ИЕРАРХИЯ

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


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    Номенклатура.Наименование КАК Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Цвет = &Красный
ИТОГИ ПО
    Ссылка ТОЛЬКО ИЕРАРХИЯ

Преимущества этого метода:

Решение №2: Комбинированное условие ГДЕ

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


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    (Номенклатура.ЭтоГруппа ИЛИ Номенклатура.Цвет = &Красный)
    И Номенклатура.Ссылка В ИЕРАРХИИ(&Родитель)
УПОРЯДОЧИТЬ ПО
    Номенклатура.Наименование ИЕРАРХИЯ

В этом случае в выборку попадут все группы внутри целевого родителя и только нужные нам элементы. Однако стоит помнить, что в этом случае в списке могут остаться «пустые» группы, внутри которых нет ни одного подходящего элемента.

Рекомендации по практике

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

  1. Если вы видите дубли только в консоли запросов — скорее всего, это ошибка визуализации самой консоли из-за включенного АВТОУПОРЯДОЧИВАНИЕ. Попробуйте заменить его на явное УПОРЯДОЧИТЬ ПО или ИТОГИ.
  2. Для получения чистого дерева с сохранением иерархических связей всегда используйте ИТОГИ ПО ... ТОЛЬКО ИЕРАРХИЯ. Это избавляет от необходимости вручную прописывать логику отбора папок.
  3. Если вы используете условие В ИЕРАРХИИ и передаете туда список (массив) значений, обязательно добавляйте слово РАЗЛИЧНЫЕ в секцию ВЫБРАТЬ, чтобы избежать физического дублирования записей при совпадении веток дерева.
  4. Помните, что АВТОУПОРЯДОЧИВАНИЕ — это сервисная функция, которая делает запрос менее предсказуемым. Для сложных отчетов лучше указывать поля сортировки явно.

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

← На главную