Как преобразовать плоскую таблицу значений в дерево без лишней иерархии?

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

Часто в процессе разработки на 1С возникает задача визуализации данных, когда плоская ТаблицаЗначений, полученная из документа или запроса, должна быть представлена пользователю в виде дерева. При попытке сделать это стандартным запросом с использованием ИТОГИ ПО, мы часто сталкиваемся с проблемой избыточной вложенности и дублированием данных в строках. Рассмотрим, как эффективно решить эту задачу.

Почему стандартный запрос создает лишние уровни?

Основная причина возникновения лишних уровней заключается в логике работы механизма ИТОГИ ПО. Система 1С воспринимает каждую группировку как новый уровень вложенности объекта ДеревоЗначений. Если вы группируете по НомерДокумента, а затем по СерияДокумента, платформа создает соответствующие узлы для каждого из этих полей. В результате, данные, которые должны были находиться на одном уровне «шапки» документа, оказываются разнесены по разным веткам дерева.

Решение 1: Предварительная подготовка данных (склейка полей)

Если визуально допустимо объединение нескольких полей в одну колонку, мы можем пойти по пути упрощения структуры запроса. Суть метода заключается в том, чтобы сформировать одно «ключевое» поле для группировки.

Проанализируем пример реализации:


// Предварительная склейка полей в Таблице Значений
ТЗ.Колонки.Добавить("КлючГруппировки");
Для Каждого Стр Из ТЗ Цикл
    Стр.КлючГруппировки = Стр.НомерДокумента + "_" + Стр.СерияДокумента;
КонецЦикла;

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

Решение 2: Построчное формирование дерева через обход

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

  1. Сортировка: Перед началом работы обязательно отсортируем исходную ТаблицуЗначений по полям группировки (например, НомерДокумента, СерияДокумента). Это критически важно для корректного сравнения соседних строк.
  2. Создание объекта: Создадим новый объект ДеревоЗначений и добавим в него необходимые колонки.
  3. Цикл обхода: Организуем обход отсортированной таблицы. Внутри цикла будем сравнивать значения группировочных полей текущей строки с предыдущей.
  4. Логика формирования:

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

Этот метод дает максимальную гибкость: вы сами управляете тем, какие данные попадают в «шапку» (родительский узел), а какие — в «табличную часть» (дочерние узлы), полностью исключая проблему дублей.

Решение 3: Использование системы компоновки данных (СКД)

Для профессиональных разработчиков использование СКД является наиболее предпочтительным инструментом. СКД позволяет гибко настраивать вывод полей для разных уровней группировки.

Как настроить СКД для решения данной задачи:

  1. Создайте группировку по иерархии (НомерДокумента, СерияДокумента).
  2. Перейдите в настройки Выбранные поля.
  3. Для группировки верхнего уровня (шапки) выберите поля Номер и Серия.
  4. Для детальных записей (товаров) укажите только Номенклатура, Цена и Количество.

При выгрузке результата работы СКД в ДеревоЗначений, система автоматически распределит данные согласно вашим настройкам, что позволит получить чистую структуру без лишнего визуального шума.

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

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

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

← На главную