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