1с итоги в дереве значений

Итог по дереву

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

Показать скрытое содержание

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

  • Всего ценных бумаг, из них
    • Обращающиеся на рынке ценных бумаг, из них
      • Акции
      • Облигации
    • Необращающиеся на рынке ценных бумаг, из них
      • Акции
      • Облигации
      • Векселя

Для решения данной задачи подготовим пустое дерево значений, которое будет повторять структуру отчета.

Вот как выглядит сформированное дерево значений.

На следующем шаге получим список ценных бумаг, составляющих портфель,определим для них оценочную стоимость и занесём информацию по каждому активу в соответствующий узел, подготовленного дерева. Таким образом мы заполним его (ДЗ) детальными записями, которые и являются расшифровкой показателей первого уровня группировки. Теперь необходимо получить итоги по всем узлам или уровням заполненной информационной структуры.Для этого нам понадобится вспомогательная рекурсивная функция #0000ff» >мИтогПоРесурсу, которая приводится ниже.

Кроме этого нам потребуется еще одна вспомогательная функция #0000ff» >мРазбор . Ее назначение — прочитать входную строку, в которой перечислены имена колонок дерева значений, разделенные запятой и заполнить этими именами массив, который и является возвращаемым значением. Текст функции приводится ниже.

Ну и наконец, главная функция для подсчета итогов на всех уровнях дерева значений.

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

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

Добавить числовой реквизит формы ТекущееЗначениеПоказателя

Функция ПолучитьИмяКолонкиЧисловогоПоказателя переводит имя колонки в имя реквизита дерева, можно воспльзоваться свойством ПутьКДанным и его отработать, только нужно имя без точки.

Привет! Мне нужно написать процедуру для обхода дерева значений, вся проблема в том, что я не знаю количество уровней дерева, подскажите как реализовать обход дерева значений с неизвестным количеством уровней

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

Вот примеры такой процедуры:

Для обычного приложения:

Для управляемого приложения:

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

Оцените статью
SoftLast
Добавить комментарий