Как преобразовать Таблицу Значений в Дерево Значений в 1С?

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

В процессе разработки на платформе 1С:Предприятие часто возникает задача трансформации «плоских» данных, хранящихся в ТаблицаЗначений, в иерархическую структуру ДеревоЗначений. Это необходимо для отображения данных в виде раскрывающихся групп, создания сложных отчетов или формирования интерфейсов с многоуровневой вложенностью.

Основные способы решения задачи

Рассмотрим несколько подходов, которые помогут вам решить эту задачу в зависимости от сложности ваших данных и требований к производительности.

Вариант 1: Метод «Ключ связи» (для двухуровневых структур)

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


Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи") Экспорт
    Дерево = Новый ДеревоЗначений;
    Для Каждого Колонка Из Таблица.Колонки Цикл
        Дерево.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
    КонецЦикла;

    Для Каждого СтрокаТаблицы Из Таблица Цикл
        СтрокаГруппировки = Дерево.Строки.Найти(СтрокаТаблицы[КлючСвязи], КлючСтроки, Истина);
        Если СтрокаГруппировки = Неопределено Тогда
            ЗаполнитьЗначенияСвойств(Дерево.Строки.Добавить(), СтрокаТаблицы);
        Иначе
            ЗаполнитьЗначенияСвойств(СтрокаГруппировки.Строки.Добавить(), СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;
    Возврат Дерево;
КонецФункции

Обратите внимание, что этот метод работает эффективно при небольшой вложенности и четкой структуре связей. Важно убедиться, что порядок обхода ТаблицаЗначений корректен: родительские строки должны быть обработаны раньше, чем их потомки.

Вариант 2: Метод группировки данных через обход

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

  1. Копируем исходную таблицу, оставляя только нужные для группировки колонки.
  2. Сворачиваем полученную копию для получения уникального списка групп.
  3. Циклично проходим по списку групп и для каждой из них находим детальные записи в исходной таблице через метод НайтиСтроки.

// Пример логики на сервере
лкДЗ = РеквизитФормыВЗначение("Дерево");
лкДЗ.Строки.Очистить();
лкТЗ = Таблица.Скопировать(, "Наименование, Количество");
лкТЗ.Свернуть("Наименование", "Количество");

Для каждого лкГрп Из лкТЗ Цикл
    лкНовГ = лкДЗ.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(лкНовГ, лкГрп);
    
    лкОтбор = Новый Структура("Наименование", лкГрп.Наименование);
    лкСтроки = Таблица.НайтиСтроки(лкОтбор);
    Для каждого лкРез Из лкСтроки Цикл
        лкНовД = лкНовГ.Строки.Добавить();
        ЗаполнитьЗначенияСвойств(лкНовД, лкРез);
    КонецЦикла;
КонецЦикла;
ЗначениеВРеквизитФормы(лкДЗ, "Дерево");

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

Если ваша задача — построение отчета с глубокой иерархией (например, Дата -> Менеджер -> Реализация), не спешите писать сложные циклы. Использование СКД — это профессиональный стандарт. Система позволяет:

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

Важные рекомендации

Пробуйте реализовать данные примеры, начиная с простого двухуровневого дерева. Понимание того, как работают коллекции строк ДеревоЗначений, станет фундаментом для построения любой сложной отчетности в 1С.

← На главную