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