Хитрости компоновки данных: произвольная иерархия для внешней таблицы данных в отчетах на СКД.

Публикация № 242824

Разработка - Математика и алгоритмы

СКД ИЕРАРХИЯ Отчет по доходам и расходам

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

Молочников Олег Spb. 2013.

Хитрости компоновки данных: произвольная иерархия для внешней таблицы данных в отчетах на СКД.

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

 

Причем в силу особенностей разработки //infostart.ru/public/85502/ структура статей может не храниться в БД и данные могут попасть в СКД только во внешней таблице.

В отличном курсе  http://xn----1-bedvffifm4g.xn--p1ai/free/ нашел решение, которое позволяет построить произвольную иерархию только на основе  запросов. Попытавшись использовать аналогично внешнюю таблицу,  я  убил несколько дней на поиски решения. Перерыв весь интернет я понял, что большинство желающих в итоге просто отступились от СКД. В итоге я решил создать гайд для вслед идущих.

Итак, упрощенно:

Нам потребуется заранее подготовленные две таблицы:

  1. Таблица значений статей доходов и расходов вида:

Период, СтатьяБаланса, Сумма.

  1. Таблица Иерархии:

СтатьяБаланса, СтатьяБалансаРодитель.

Код, передающий внешние таблицы в СКД и формирующий отчет:

         

     

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,  КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    СтруктураПараметров=Новый Структура;
    СтруктураПараметров.Вставить("Данные", ТаблЗнач);
    СтруктураПараметров.Вставить("Иерархия", ТаблИерархии);
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, СтруктураПараметров, ДанныеРасшифровки);

    ЭлементыФормы.Результат.Очистить();

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);

    ПроцессорВывода.НачатьВывод();

    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Пока ЭлементРезультата <> Неопределено Цикл
        ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    КонецЦикла;

    ПроцессорВывода.ЗакончитьВывод();


В 

 Создаем в СКД два набора данных вида объект и описываем их структуру:

 

 

Прописываем связи наборов данных:

 

Описываем ресурсы:

 

И последнее: создаем настройки для СКД:

 

Что позволит нам получить отчет как на самой верхней картинке. В этом отчете не будет работать отбор по вхождению в иерархию. Но если это нам очень нужно, это можно легко поправить, воспользовавшись, полем контроль иерархии. Удачи.

PS: Надеюсь вам понравится эта и другие мои разработки на //infostart.ru/profile/48714/.

Очень жду ваших комментариев  и пожеланий.

Молочников Олег Spb. 2013.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dock 43 23.12.13 05:21 Сейчас в теме
Для достижения полного идеала осталось только заменить"01.06.2013" на "июнь 2013".
я пока не накопал, как это сделать...
2. Uncore 1340 23.12.13 05:59 Сейчас в теме
(1) dock, установить формат поля для даты в виде "ММММ гггг"
3. dock 43 23.12.13 06:12 Сейчас в теме
(2) Uncore, замечательное решение. только вот где это установить в СКД....
4. Поручик 4460 23.12.13 07:42 Сейчас в теме
(3) Или условное оформление поля в настройках или в оформлении поля в наборах данных
Lena272; forseil; +2 Ответить
5. Vladimir Litvinenko 23.12.13 08:51 Сейчас в теме
Очень жду ваших комментариев и пожеланий

Пожелание есть. Если будет возможность, прикрепите файл отчета в качестве примера.
Также Вы упоминаете поле "контроль иерархии". Что имеется ввиду?
7. milkers 2461 23.12.13 10:49 Сейчас в теме
(5) VladimirL, Извините, но отчет сам по себе не работает, он входит в состав Настраиваемого управленческого баланса, который предоставляет агрегированные данные для отчета. А по поводу контроля иерархии подробно описано в вышеупомянутом курсе, или погуглите информацию.
15. Spacer 305 25.12.13 13:30 Сейчас в теме
(5) VladimirL,
Пожелание есть. Если будет возможность, прикрепите файл отчета в качестве примера.
Также Вы упоминаете поле "контроль иерархии". Что имеется ввиду?


Вот если хотите для примера - Отчет по справочнику "Номенклатура" с иерархией по реквизиту "НоменклатурнаяГруппа". Тут есть и сама иерархия, и контроль иерархии.
Это сохраненная схема компоновки. Для просмотра создайте новый отчет, откройте схему компоновки отчета и загрузите в нее схему из данного файла.
Прикрепленные файлы:
СКД_НоменклатураИерархияПоНоменклатурнойГруппе.xml
6. headMade 143 23.12.13 09:03 Сейчас в теме
может ссылку по курсу поменяйте на оригинальную http:// /free/
8. VchikA 71 23.12.13 11:49 Сейчас в теме
Убил всю прошлую неделю пытаясь сделать иерархию из запросов. Спасибо, пригодится!
9. iov 409 24.12.13 02:59 Сейчас в теме
Закладочку поставлю ка я тут. Почитать надо..
10. mylogin 105 24.12.13 09:49 Сейчас в теме
--В этом отчете не будет работать отбор по вхождению в иерархию. Но если это нам очень нужно, это можно легко поправить, воспользовавшись, полем контроль иерархии. Удачи.---

Вот на этом поподробнее можно? Как сделать проверку иерархии, когда источники данных - внешние объекты? Сколько ни искал, везде примеры с запросами.
12. milkers 2461 25.12.13 12:53 Сейчас в теме
(10) В теории там можно обойтись и без запроса, сделав третий источник данных с иерархией, и связав его, как показано в курсе, но сам не пробовал из за критической нехватки времени и отсутствия острой необходимости.
Надо попробовать, самому интересно.
16. mylogin 105 25.12.13 23:00 Сейчас в теме
(12) дело в том что информацию "о родителях" в моем случаи невозможно получить запросом, таблица формируется програмно.
(13) Spacer, читайте мой вопрос внимательнее. С построением собстаенной иерархии у меня проблем нет. Вопрос в контроле иерархии для возможности отбора по группам.

Разница м/у запросом и внешним объектом - таблицей, в том, что набор данных "Запрос" выполняется динамически в зависимости от переданого параметра. т.е. грубо говоря отфильтровывает лишние данные в наборе описывающий связь родитель-потомок. В случаи когда мы передаем таблицу "извне", она уже сформирована и повлиять на нее из компоновки мы не можем.
Не поленился и скачал курс, нашел урок 95, но там только пример с запросами. Если я пропустив в курсе где этот момент разбирается подскажите.
17. Spacer 305 25.12.13 23:56 Сейчас в теме
(16) mylogin,
С построением собстаенной иерархии у меня проблем нет. Вопрос в контроле иерархии для возможности отбора по группам

Если у вас нет проблем с построением собственной иерархии, то какие могут быть проблемы с контролем иерархии?
Механизм контроля иерархии включает в себя выборку тех же данных которые необходимы для построения иерархии.
Только условие проверки другое.
19. mylogin 105 26.12.13 08:56 Сейчас в теме
(17) Spacer, Вот пример. Как тут сделать отбор по конкретному узлу?
Прикрепленные файлы:
СвояИерархия.erf
13. Spacer 305 25.12.13 13:15 Сейчас в теме
(10) mylogin,
Вот на этом поподробнее можно? Как сделать проверку иерархии, когда источники данных - внешние объекты? Сколько ни искал, везде примеры с запросами.

Да какая разница чем является набор данных - запросом или внешним объектом?
Принципы построения собственной иерархии от этого не зависят.
В статье есть ссылочка на видеокурс. Там все хорошо рассказано.
11. Сисой 84 24.12.13 10:44 Сейчас в теме
Спасибо большое!
Когда СКД только появилась, я пытался делать иерархию в таблице - не получилось.
Теперь понятно, как надо было.
14. Spacer 305 25.12.13 13:20 Сейчас в теме
В отличном курсе ... нашел решение, которое позволяет построить произвольную иерархию только на основе запросов. Попытавшись использовать аналогично внешнюю таблицу, я убил несколько дней на поиски решения.

Не пойму - в чем проблема то? Механизм построения собственной иерархии в СКД работает одинаково что для запросов, что для таблиц.
18. DAnry 8 26.12.13 01:10 Сейчас в теме
Век живи - век учить. Спасибо!
20. alest 26.12.13 21:52 Сейчас в теме
Был нюанс: Отбор "В группе" работает, а отбор "В списке по иерархии" - НЕ РАБОТАЕТ. А отбор "Не в группе" хоть и отсекает подчиненные, но выводит саму группу!Нужно заменять эти отборы на группу отборов.
21. alest 26.12.13 21:54 Сейчас в теме
Вроде в разработке сложных отчетов Хрусталевой была такая тема.
22. 4el 23.09.14 17:50 Сейчас в теме
Спасибо за решение, на самом деле век живи век учись...

Но по привычке делаю иерархию таблицами значений и циклами)))... благо задачки мелкие, пока позволяют)
23. kriola 08.10.15 14:58 Сейчас в теме
Спасибо! Очень пригодилось!
24. kriola 08.10.15 14:59 Сейчас в теме
Спасибо! очень пригодилось! 5 минут и всё готово.
25. Pover 21.10.15 11:53 Сейчас в теме
Все конечно здорово, но не работает так как описано выше.
1. "СтруктураПараметров.Вставить("Иерархия", ТаблИерархии); а в схеме компоновки данных понятие ТаблИерархии не встречается.
2. На самой первой картинке с указанными полями выдается ошибка
{ВнешнийОтчет.БалансЦПР.МодульОбъекта(201)}: Ошибка при вызове метода контекста (Инициализировать)
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, СтруктураПараметров, ДанныеРасшифровки);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Не найдено поле замены "СтатьяБалансаРодитель"

Без поля СтатьяБалансаРодитель - формируется.

3. Не могу понять как вывести таблицу иерархии если в таблице значений не все статьи баланса есть?
Если вы думаете что достаточно поменять источник связи и приемник, то это не помогает.
так как вылетает ошибка

{ВнешнийОтчет.БалансЦПР.МодульОбъекта(213)}: Ошибка при вызове метода контекста (Следующий)
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
по причине:
Ошибка компоновки данных
по причине:
Ошибка получения данных
по причине:
Связь описывающая иерархический спуск должна содержать либо выражение начального значения, либо имя параметра связи "Иерархия"

Гуру, может поможете разобраться?
26. Lancelot-2M 103 14.04.16 14:13 Сейчас в теме
Я пришел к использованию справочника нПроизвольныеИерархии с иерархией элементов - для каждого отчета с произвольной иерархией, отличной от иерархии данных создал свою ветку элементов с нужными мне наименованиями, а в запросе или переборе тз(когда использую набор-данных объект и если в запросе никак) заполняю значениями подчиненных элементов поле, по которому группирую с иерархией в СКД - легко и приятно)
27. kasper076 74 13.05.16 13:56 Сейчас в теме
(0)
Нам потребуется заранее подготовленные две таблицы:

Таблица значений статей доходов и расходов вида:
Период, СтатьяБаланса, Сумма.

Однако на скрине

мы видим 4 поля.
28. drugoi_mir 11 08.09.16 08:21 Сейчас в теме
Tакой момент. Если иерархия только в пределах измерения должна строиться как это сделать? Например есть ведомость внутри неё иерархия блоков по идентификатору родителя строится. Есть вторая ведомость в ней тоже самое. При этом идентификаторы в пределах ведомости уникальны, а вне могут совпадать. Например у корневого идентификаторе родителя ="". Нужно вывести иерархию с группировкой по ведомости.

У нас таблица иерархии
ИдентификаторСтроки,
ИдентификаторИзделия,
Нонменклатура,
Ведомость

Что в условиях связи прописать?
29. dponomarchuk 08.09.16 09:09 Сейчас в теме
Добрый день!
У меня чуть другая ситуация с хранением данных, и я думаю от этого не получается настроить иерархию. Суть - изделие, состоящее из дерева комплектующих.
Связи соответствия (и остаток) хранятся в регистре накопления с 2 измерениями (изделие и комплектующая).
Как мне построить таблицу иерархии ?
Я попытался вот таким запросом

ВЫБРАТЬ РАЗЛИЧНЫЕ
	КомплектующиеИзделияОстатки.ИзделиеСН,
	КомплектующиеИзделияОстатки.КомплектующаяСН
ИЗ
	РегистрНакопления.КомплектующиеИзделия.Остатки КАК КомплектующиеИзделияОстатки


И в итоге не получается . Выходит только 1 уровень иерархии. Таблица иерархии что из себя должна представлять ? Просто всевозможнные строки "элемент-Родитель" ?
30. drugoi_mir 11 08.09.16 09:13 Сейчас в теме
(29) Должен быть признак иерархии, т.е. еще один реквизит, который указывает на родителя.
31. dponomarchuk 08.09.16 10:00 Сейчас в теме
Таблица иерархии. Колонки
1.элемент
2.Родитель

Какой еще реквизит нужен? Разве колонка "Родитель" не может выступать в этой роли ?
32. drugoi_mir 11 08.09.16 10:53 Сейчас в теме
Тогда тебе осталось связать набор данных сам с собой. На закладке связи наборов данных.
Приемник = элемент
источник = родитель
начальное условие свзяи Значение(Справочник.номенклатура,пустаяСсылка)
33. Lumis 07.02.17 11:11 Сейчас в теме
Скажите, а как быть, если один элемент может принадлежать нескольким родителям? Видела видео, где это реализовывалось, но там набор данных был запрос, и при связи в скд передавался параметр МассивСсылок
http://infostart.ru/video/w389430/
34. Max.Potapov 17.02.17 17:47 Сейчас в теме
Есть более интересное и простое решение на СКД - http://start1c.blogspot.ru/2017/01/blog-post.html
35. axae 92 21.05.17 16:30 Сейчас в теме
А можно ли делать помимо произвольной иерархии вывод произвольных значений итогов ресурса своей иерархии?
36. lopatin 571 28.05.17 18:33 Сейчас в теме
(35) Тоже интересует подобный вопрос. Требуется возможность выводить заданные значения в иерархии вместо подсчета по заранее определенному алгоритму итогов.
37. Yoda77_2 31.10.18 17:26 Сейчас в теме
У меня такая проблема: при выводе элемент иерархии выводится дополнительно в нижестоящей группировке.
Т.е и в узле иерархии, и в детализации
38. success 11.02.19 14:15 Сейчас в теме
У данного метода есть недостаток. Например имеем
ТабДанные:
Родитель Элемент ДопРеквизит
--------------------------------------------------
Родитель1 Элемент1 ДопРеквизит1
Родитель2 Элемент1 ДопРеквизит2

ТабИерархия:
Родитель Элемент
---------------------------------------------------
(пусто) Родитель1
Родитель1 Элемент1
(пусто) Родитель2
Родитель2 Элемент1

Отчет будет правильным в плане иерархии, т.е.
Родитель1
Элемент1 ДопРеквизит1
Родитель2
Элемент1 ДопРеквизит1

но колонка ДопРеквизит для Родитель2 будет равна ДопРеквизит1, т.е. из таблицы ТабДанные берется неправильная строка, поскольку связь таблиц с данными и иерархией только по полю Реквизит. Если добавляешь связь ТабДанные.Родитель = ТабИерархия.Родитель тогда иерархии нет в отчете, просто списком
kasper076; +1 Ответить
40. kasper076 74 28.11.19 17:02 Сейчас в теме
(38) Возникла необходимость выводить произвольную иерархию, но при этом для элементов являющихся родителями необходим выводить их доп. реквизиты. Красиво это сделать не получается.
Как только реквизит выводится для элемента являющегося родителем, так элемент сразу начинает дублироваться и вкладываться в сам в себя.
Прикрепленные файлы:
39. glime 98 30.07.19 13:54 Сейчас в теме
Добрый день.
Может кто сталкивался, при настройки связей и выборе "родителя" при выходе возникает ошибка "Поле не найдено "РодительГл"".
Куда копать не пойму
41. Merkalov 5 12.12.19 14:48 Сейчас в теме
Долго же я тупил, боже!
Мне почему-то показалось что в объекте - "Иерархия" должна быть только иерархия, а в "Элементы" только элементы и естественно связь не лепилась. На самом деле в объект(таблица на вход) должна содержать и иерархию и сам элемент.
42. manserg 104 13.04.20 22:45 Сейчас в теме
Коллеги, нужна помощь!
Уже уйму времени убил на попытки вывести произвольную иерархию комплектов номенклатуры с остатками.
Конфигурация каркасная, у справочника номенклатура есть табличная часть "СоставКомплекта" где собственно перечислен состав, но при этом там могут быть и другие комплекты, т.е. структура многоуровневая.
Так же есть простейший регистр остатков товаров с измерениями склад и номенклатура и ресурсом количество.

Собираю все нужные данные в следующих таблицах значений "ТаблицаОстатков" и "ТаблицаСостава".

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

В СКД сделаны настройки согласно стандартным рекомендациям по построению иерархии в СКД.

Однако вместо ожидаемой иерархии получаю плоскую таблицу.

Что я делаю не так и как правильно построить произвольную иерархию с условием что в остатках по которым она должна строиться могут быть как элементы(без состава) так и многоуровневые комплекты?

P.S. Пытался формировать через ссылки элементов номенклатуры, но столкнулся с тем, что при наличии допустим остатка комплекта "Секция левая" и "Шкаф "Виктория"" который в себе содержит "Секция левая" получается задвоение строк в такой иерархии.
Победить такое поведение попытался построением сложных ключей элементов и их родителей чтобы они четко связывались без дублей, но иерархия вообще перестала строится (
Прикрепленные файлы:
44. kuliev-emil 29.12.20 13:41 Сейчас в теме
(42) Добрый день, вы случайно не нашли решение? Тоже с этим столкнулся...
43. korol-ar 09.07.20 21:17 Сейчас в теме
Оставьте свое сообщение