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