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







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

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

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

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

 

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

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

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

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

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

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

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

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

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

         

     

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

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

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

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

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

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

В 

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

 

 

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

 

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

 

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

 

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

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

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

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

41 Comments

  1. dock

    Для достижения полного идеала осталось только заменить»01.06.2013″ на «июнь 2013».

    я пока не накопал, как это сделать…

    Reply
  2. Uncore

    (1) dock, установить формат поля для даты в виде «ММММ гггг»

    Reply
  3. dock

    (2) Uncore, замечательное решение. только вот где это установить в СКД….

    Reply
  4. Поручик

    (3) Или условное оформление поля в настройках или в оформлении поля в наборах данных

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

    Пожелание есть. Если будет возможность, прикрепите файл отчета в качестве примера.

    Также Вы упоминаете поле «контроль иерархии». Что имеется ввиду?

    Reply
  6. headMade

    может ссылку по курсу поменяйте на оригинальную http:// /free/

    Reply
  7. milkers

    (5) VladimirL, Извините, но отчет сам по себе не работает, он входит в состав Настраиваемого управленческого баланса, который предоставляет агрегированные данные для отчета. А по поводу контроля иерархии подробно описано в вышеупомянутом курсе, или погуглите информацию.

    Reply
  8. VchikA

    Убил всю прошлую неделю пытаясь сделать иерархию из запросов. Спасибо, пригодится!

    Reply
  9. iov

    Закладочку поставлю ка я тут. Почитать надо..

    Reply
  10. mylogin

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

    Вот на этом поподробнее можно? Как сделать проверку иерархии,

    Reply
  11. Сисой

    Спасибо большое!

    Когда СКД только появилась, я пытался делать иерархию в таблице — не получилось.

    Теперь понятно, как надо было.

    Reply
  12. milkers

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

    Надо попробовать, самому интересно.

    Reply
  13. Spacer

    (10) mylogin,

    Вот на этом поподробнее можно? Как сделать проверку иерархии, когда источники данных — внешние объекты? Сколько ни искал, везде примеры с запросами.

    Да какая разница чем является набор данных — запросом или внешним объектом?

    Принципы построения собственной иерархии от этого не зависят.

    В статье есть ссылочка на видеокурс. Там все хорошо рассказано.

    Reply
  14. Spacer
    В отличном курсе … нашел решение, которое позволяет построить произвольную иерархию только на основе запросов. Попытавшись использовать аналогично внешнюю таблицу, я убил несколько дней на поиски решения.

    Не пойму — в чем проблема то? Механизм построения собственной иерархии в СКД работает одинаково что для запросов, что для таблиц.

    Reply
  15. Spacer

    (5) VladimirL,

    Пожелание есть. Если будет возможность, прикрепите файл отчета в качестве примера.

    Также Вы упоминаете поле «контроль иерархии». Что имеется ввиду?

    Вот если хотите для примера — Отчет по справочнику «Номенклатура» с иерархией по реквизиту «НоменклатурнаяГруппа». Тут есть и сама иерархия, и контроль иерархии.

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

    Reply
  16. mylogin

    (12) дело в том что информацию «о родителях» в моем случаи невозможно получить запросом, таблица формируется програмно.

    (13) Spacer, читайте мой вопрос внимательнее. С построением собстаенной иерархии у меня проблем нет. Вопрос в контроле иерархии для возможности отбора по группам.

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

    Не поленился и скачал курс, нашел урок 95, но там только пример с запросами. Если я пропустив в курсе где этот момент разбирается подскажите.

    Reply
  17. Spacer

    (16) mylogin,

    С построением собстаенной иерархии у меня проблем нет. Вопрос в контроле иерархии для возможности отбора по группам

    Если у вас нет проблем с построением собственной иерархии, то какие могут быть проблемы с контролем иерархии?

    Механизм контроля иерархии включает в себя выборку тех же данных которые необходимы для построения иерархии.

    Только условие проверки другое.

    Reply
  18. DAnry

    Век живи — век учить. Спасибо!

    Reply
  19. mylogin

    (17) Spacer, Вот пример. Как тут сделать отбор по конкретному узлу?

    Reply
  20. alest

    Был нюанс: Отбор «В группе» работает, а отбор «В списке по иерархии» — НЕ РАБОТАЕТ. А отбор «Не в группе» хоть и отсекает подчиненные, но выводит саму группу!Нужно заменять эти отборы на группу отборов.

    Reply
  21. alest

    Вроде в разработке сложных отчетов Хрусталевой была такая тема.

    Reply
  22. 4el

    Спасибо за решение, на самом деле век живи век учись…

    Но по привычке делаю иерархию таблицами значений и циклами)))… благо задачки мелкие, пока позволяют)

    Reply
  23. kriola

    Спасибо! Очень пригодилось!

    Reply
  24. kriola

    Спасибо! очень пригодилось! 5 минут и всё готово.

    Reply
  25. Pover

    Все конечно здорово, но не работает так как описано выше.

    1. «СтруктураПараметров.Вставить(«Иерархия», ТаблИерархии); а в схеме компоновки данных понятие ТаблИерархии не встречается.

    2. На самой первой картинке с указанными полями выдается ошибка

    {ВнешнийОтчет.БалансЦПР.МодульОбъекта(201)}: Ошибка при вызове метода контекста (Инициализировать)

    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, СтруктураПараметров, ДанныеРасшифровки);

    по причине:

    Ошибка компоновки данных

    по причине:

    Ошибка инициализации

    по причине:

    Не найдено поле замены «СтатьяБалансаРодитель»

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

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

    Если вы думаете что достаточно поменять источник связи и приемник, то это не помогает.

    так как вылетает ошибка

    {ВнешнийОтчет.БалансЦПР.МодульОбъекта(213)}: Ошибка при вызове метода контекста (Следующий)

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

    по причине:

    Ошибка компоновки данных

    по причине:

    Ошибка получения данных

    по причине:

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

    Гуру, может поможете разобраться?

    Reply
  26. Lancelot-2M

    Я пришел к использованию справочника нПроизвольныеИерархии с иерархией элементов — для каждого отчета с произвольной иерархией, отличной от иерархии данных создал свою ветку элементов с нужными мне наименованиями, а в запросе или переборе тз(когда использую набор-данных объект и если в запросе никак) заполняю значениями подчиненных элементов поле, по которому группирую с иерархией в СКД — легко и приятно)

    Reply
  27. kasper076

    (0)

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

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

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

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



    мы видим 4 поля.

    Reply
  28. drugoi_mir

    Tакой момент. Если иерархия только в пределах измерения должна строиться как это сделать? Например есть ведомость внутри неё иерархия блоков по идентификатору родителя строится. Есть вторая ведомость в ней тоже самое. При этом идентификаторы в пределах ведомости уникальны, а вне могут совпадать. Например у корневого идентификаторе родителя =»». Нужно вывести иерархию с группировкой по ведомости.

    У нас таблица иерархии

    ИдентификаторСтроки,

    ИдентификаторИзделия,

    Нонменклатура,

    Ведомость

    Что в условиях связи прописать?

    Reply
  29. dponomarchuk

    Добрый день!

    У меня чуть другая ситуация с хранением данных, и я думаю от этого не получается настроить иерархию. Суть — изделие, состоящее из дерева комплектующих.

    Связи соответствия (и остаток) хранятся в регистре накопления с 2 измерениями (изделие и комплектующая).

    Как мне построить таблицу иерархии ?

    Я попытался вот таким запросом

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

    И в итоге не получается . Выходит только 1 уровень иерархии. Таблица иерархии что из себя должна представлять ? Просто всевозможнные строки «элемент-Родитель» ?

    Reply
  30. drugoi_mir

    (29) Должен быть признак иерархии, т.е. еще один реквизит, который указывает на родителя.

    Reply
  31. dponomarchuk

    Таблица иерархии. Колонки

    1.элемент

    2.Родитель

    Какой еще реквизит нужен? Разве колонка «Родитель» не может выступать в этой роли ?

    Reply
  32. drugoi_mir

    Тогда тебе осталось связать набор данных сам с собой. На закладке связи наборов данных.

    Приемник = элемент

    источник = родитель

    начальное условие свзяи Значение(Справочник.номенклатура,пустаяСсылка)

    Reply
  33. Lumis

    Скажите, а как быть, если один элемент может принадлежать нескольким родителям? Видела видео, где это реализовывалось, но там набор данных был запрос, и при связи в скд передавался параметр МассивСсылок

    http://infostart.ru/video/w389430/

    Reply
  34. Max.Potapov

    Есть более интересное и простое решение на СКД — http://start1c.blogspot.ru/2017/01/blog-post.html

    Reply
  35. axae

    А можно ли делать помимо произвольной иерархии вывод произвольных значений итогов ресурса своей иерархии?

    Reply
  36. lopatin

    (35) Тоже интересует подобный вопрос. Требуется возможность выводить заданные значения в иерархии вместо подсчета по заранее определенному алгоритму итогов.

    Reply
  37. Yoda77_2

    У меня такая проблема: при выводе элемент иерархии выводится дополнительно в нижестоящей группировке.

    Т.е и в узле иерархии, и в детализации

    Reply
  38. success

    У данного метода есть недостаток. Например имеем

    ТабДанные:

    Родитель Элемент ДопРеквизит

    —————————————————

    Родитель1 Элемент1 ДопРеквизит1

    Родитель2 Элемент1 ДопРеквизит2

    ТабИерархия:

    Родитель Элемент

    —————————————————

    (пусто) Родитель1

    Родитель1 Элемент1

    (пусто) Родитель2

    Родитель2 Элемент1

    Отчет будет правильным в плане иерархии, т.е.

    Родитель1

    Элемент1 ДопРеквизит1

    Родитель2

    Элемент1 ДопРеквизит1

    но колонка ДопРеквизит для Родитель2 будет равна ДопРеквизит1, т.е. из таблицы ТабДанные берется неправильная строка, поскольку связь таблиц с данными и иерархией только по полю Реквизит. Если добавляешь связь ТабДанные.Родитель = ТабИерархия.Родитель тогда иерархии нет в отчете, просто списком

    Reply
  39. glime

    Добрый день.

    Может кто сталкивался, при настройки связей и выборе «родителя» при выходе возникает ошибка «Поле не найдено «РодительГл»».

    Куда копать не пойму

    Reply
  40. kasper076

    (38) Возникла необходимость выводить произвольную иерархию, но при этом для элементов являющихся родителями необходим выводить их доп. реквизиты. Красиво это сделать не получается.

    Как только реквизит выводится для элемента являющегося родителем, так элемент сразу начинает дублироваться и вкладываться в сам в себя.

    Reply
  41. Merkalov

    Долго же я тупил, боже!

    Мне почему-то показалось что в объекте — «Иерархия» должна быть только иерархия, а в «Элементы» только элементы и естественно связь не лепилась. На самом деле в объект(таблица на вход) должна содержать и иерархию и сам элемент.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *