Как отсортировать дерево значений в 1С по реквизитам колонок?

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

При разработке на платформе 1С мы часто сталкиваемся с необходимостью упорядочить данные для удобства пользователей. Однако стандартный метод Сортировать() объекта ДеревоЗначений обладает ограниченным функционалом: он работает только с колонками самого дерева и не умеет автоматически обращаться к реквизитам ссылочных типов (например, через точку Номенклатура.Артикул). Разберем, как преодолеть это ограничение и обеспечить качественную сортировку данных.

Способ №1: Использование дополнительных колонок (рекомендуемый)

Самый простой, надежный и архитектурно правильный способ — вынести необходимые для сортировки реквизиты в отдельные колонки дерева значений. Несмотря на то, что это может показаться избыточным, такой подход обладает рядом преимуществ:

  1. Вы сохраняете иерархическую структуру дерева в неизменном виде.
  2. Вам не нужно писать сложный код для восстановления связей между строками (родитель-потомок) после сортировки.
  3. Метод Сортировать() будет работать мгновенно, так как он обращается к прямому значению колонки.

Для реализации этого метода:

  1. Добавьте в ДеревоЗначений скрытые колонки для каждого реквизита, по которому требуется сортировка.
  2. При заполнении дерева данными, сразу записывайте в эти скрытые колонки значения соответствующих реквизитов объектов.
  3. В интерфейсе формы скройте эти колонки, чтобы не перегружать пользователя лишней информацией.
  4. При нажатии на заголовок таблицы вызывайте стандартный метод:

// Пример сортировки по скрытой колонке
Дерево.Строки.Сортировать("Артикул Возр");

Способ №2: Использование промежуточной Таблицы Значений и запроса

Если структура дерева динамическая или количество реквизитов слишком велико, мы можем применить метод выгрузки в ТаблицаЗначений с последующей сортировкой в запросе. Однако важно помнить: простая выгрузка «разрушает» иерархию дерева. Чтобы восстановить её, нам нужно действовать очень осторожно.

Рассмотрим алгоритм действий:

  1. Выгрузите дерево значений в ТаблицаЗначений. Обязательно сохраните служебные колонки, которые отвечают за иерархию (ссылки на родительские строки, индекс строки).
  2. Поместите полученную таблицу во временную таблицу запроса.
  3. Выполните запрос с инструкцией УПОРЯДОЧИТЬ ПО, используя обращение через точку к нужным реквизитам.
  4. Результат запроса выгрузите в новую ТаблицаЗначений.
  5. На основе отсортированной плоской таблицы заново сформируйте дерево значений, последовательно создавая строки и перенося в них данные, сохраняя иерархию родитель-потомок.

Этот способ требует написания существенного объема «обвязочного» кода и может быть медленным при работе с очень большими объемами данных (десятки тысяч строк), поэтому используйте его только в крайних случаях.

Важные советы при работе с сортировкой

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

Проанализировав ситуацию, мы видим, что создание «служебных» колонок для хранения значений реквизитов — это наиболее эффективный путь. Это позволяет избежать сложных манипуляций с восстановлением иерархии и обеспечивает быструю реакцию системы на действия пользователя.

← На главную