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

Опубликовал Олег Молочников (milkers) в раздел Программирование - Теория программирования

Хитрости компоновки данных: произвольная иерархия для внешней таблицы данных в отчетах на СКД. Столкнулся с тем, что мне надо было преобразовать заранее подготовленную таблицу данных в управленческий отчет по доходам и расходам 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) 18 23.12.13 05:21 Сейчас в теме
Для достижения полного идеала осталось только заменить"01.06.2013" на "июнь 2013".
я пока не накопал, как это сделать...
2. Дмитрий Денисов (Uncore) 506 23.12.13 05:59 Сейчас в теме
(1) dock, установить формат поля для даты в виде "ММММ гггг"
3. Артем Артеменко (dock) 18 23.12.13 06:12 Сейчас в теме
(2) Uncore, замечательное решение. только вот где это установить в СКД....
4. Сергей Ожерельев (Поручик) 3495 23.12.13 07:42 Сейчас в теме
(3) Или условное оформление поля в настройках или в оформлении поля в наборах данных
5. Владимир Литвиненко (VladimirL) 547 23.12.13 08:51 Сейчас в теме
Очень жду ваших комментариев и пожеланий

Пожелание есть. Если будет возможность, прикрепите файл отчета в качестве примера.
Также Вы упоминаете поле "контроль иерархии". Что имеется ввиду?
6. Анатолий Бритько (headMade) 131 23.12.13 09:03 Сейчас в теме
может ссылку по курсу поменяйте на оригинальную http://курсы-по-1с.рф/free/
7. Олег Молочников (milkers) 1577 23.12.13 10:49 Сейчас в теме
(5) VladimirL, Извините, но отчет сам по себе не работает, он входит в состав Настраиваемого управленческого баланса, который предоставляет агрегированные данные для отчета. А по поводу контроля иерархии подробно описано в вышеупомянутом курсе, или погуглите информацию.
8. Владимир Бегунов (VchikA) 66 23.12.13 11:49 Сейчас в теме
Убил всю прошлую неделю пытаясь сделать иерархию из запросов. Спасибо, пригодится!
9. Александр Зубцов (iov) 359 24.12.13 02:59 Сейчас в теме
Закладочку поставлю ка я тут. Почитать надо..
10. И А (mylogin) 89 24.12.13 09:49 Сейчас в теме
--В этом отчете не будет работать отбор по вхождению в иерархию. Но если это нам очень нужно, это можно легко поправить, воспользовавшись, полем контроль иерархии. Удачи.---

Вот на этом поподробнее можно? Как сделать проверку иерархии, когда источники данных - внешние объекты? Сколько ни искал, везде примеры с запросами.
11. Сисой Сисой (Сисой) 78 24.12.13 10:44 Сейчас в теме
Спасибо большое!
Когда СКД только появилась, я пытался делать иерархию в таблице - не получилось.
Теперь понятно, как надо было.
12. Олег Молочников (milkers) 1577 25.12.13 12:53 Сейчас в теме
(10) В теории там можно обойтись и без запроса, сделав третий источник данных с иерархией, и связав его, как показано в курсе, но сам не пробовал из за критической нехватки времени и отсутствия острой необходимости.
Надо попробовать, самому интересно.
13. Владимир Насыров (Spacer) 249 25.12.13 13:15 Сейчас в теме
(10) mylogin,
Вот на этом поподробнее можно? Как сделать проверку иерархии, когда источники данных - внешние объекты? Сколько ни искал, везде примеры с запросами.

Да какая разница чем является набор данных - запросом или внешним объектом?
Принципы построения собственной иерархии от этого не зависят.
В статье есть ссылочка на видеокурс. Там все хорошо рассказано.
14. Владимир Насыров (Spacer) 249 25.12.13 13:20 Сейчас в теме
В отличном курсе ... нашел решение, которое позволяет построить произвольную иерархию только на основе запросов. Попытавшись использовать аналогично внешнюю таблицу, я убил несколько дней на поиски решения.

Не пойму - в чем проблема то? Механизм построения собственной иерархии в СКД работает одинаково что для запросов, что для таблиц.
15. Владимир Насыров (Spacer) 249 25.12.13 13:30 Сейчас в теме
(5) VladimirL,
Пожелание есть. Если будет возможность, прикрепите файл отчета в качестве примера.
Также Вы упоминаете поле "контроль иерархии". Что имеется ввиду?


Вот если хотите для примера - Отчет по справочнику "Номенклатура" с иерархией по реквизиту "НоменклатурнаяГруппа". Тут есть и сама иерархия, и контроль иерархии.
Это сохраненная схема компоновки. Для просмотра создайте новый отчет, откройте схему компоновки отчета и загрузите в нее схему из данного файла.
Прикрепленные файлы:
СКД_НоменклатураИерархияПоНоменклатурнойГруппе.xml
16. И А (mylogin) 89 25.12.13 23:00 Сейчас в теме
(12) milkers, дело в том что информацию "о родителях" в моем случаи невозможно получить запросом, таблица формируется програмно.
(13) Spacer, читайте мой вопрос внимательнее. С построением собстаенной иерархии у меня проблем нет. Вопрос в контроле иерархии для возможности отбора по группам.

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

Если у вас нет проблем с построением собственной иерархии, то какие могут быть проблемы с контролем иерархии?
Механизм контроля иерархии включает в себя выборку тех же данных которые необходимы для построения иерархии.
Только условие проверки другое.
18. DAnry (DAnry) 4 26.12.13 01:10 Сейчас в теме
Век живи - век учить. Спасибо!
19. И А (mylogin) 89 26.12.13 08:56 Сейчас в теме
(17) Spacer, Вот пример. Как тут сделать отбор по конкретному узлу?
Прикрепленные файлы:
СвояИерархия.erf
20. Алексей (alest) 26.12.13 21:52 Сейчас в теме
Был нюанс: Отбор "В группе" работает, а отбор "В списке по иерархии" - НЕ РАБОТАЕТ. А отбор "Не в группе" хоть и отсекает подчиненные, но выводит саму группу!Нужно заменять эти отборы на группу отборов.
21. Алексей (alest) 26.12.13 21:54 Сейчас в теме
Вроде в разработке сложных отчетов Хрусталевой была такая тема.
22. Andrey Levchenko (4el) 23.09.14 17:50 Сейчас в теме
Спасибо за решение, на самом деле век живи век учись...

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

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

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

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

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

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

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

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

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

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

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


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

Какой еще реквизит нужен? Разве колонка "Родитель" не может выступать в этой роли ?
32. mike Figurin (drugoi_mir) 7 08.09.16 10:53 Сейчас в теме
Тогда тебе осталось связать набор данных сам с собой. На закладке связи наборов данных.
Приемник = элемент
источник = родитель
начальное условие свзяи Значение(Справочник.номенклатура,пустаяСсылка)
33. Lumis 07.02.17 11:11 Сейчас в теме
Скажите, а как быть, если один элемент может принадлежать нескольким родителям? Видела видео, где это реализовывалось, но там набор данных был запрос, и при связи в скд передавался параметр МассивСсылок
http://infostart.ru/video/w389430/
34. Max Potapov (Max.Potapov) 17.02.17 17:47 Сейчас в теме
Есть более интересное и простое решение на СКД - http://start1c.blogspot.ru/2017/01/blog-post.html