gifts2017

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

         

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

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

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

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

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

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

 

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

 

 

 

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

 

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

 

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

 

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

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

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

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

 

См. также

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

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

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

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

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


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

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

Если у вас нет проблем с построением собственной иерархии, то какие могут быть проблемы с контролем иерархии?
Механизм контроля иерархии включает в себя выборку тех же данных которые необходимы для построения иерархии.
Только условие проверки другое.
18. DAnry (DAnry) 26.12.13 01:10
Век живи - век учить. Спасибо!
19. И А (mylogin) 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) 14.04.16 14:13
Я пришел к использованию справочника нПроизвольныеИерархии с иерархией элементов - для каждого отчета с произвольной иерархией, отличной от иерархии данных создал свою ветку элементов с нужными мне наименованиями, а в запросе или переборе тз(когда использую набор-данных объект и если в запросе никак) заполняю значениями подчиненных элементов поле, по которому группирую с иерархией в СКД - легко и приятно)
27. Максим Зудин (kasper076) 13.05.16 13:56
(0)
Нам потребуется заранее подготовленные две таблицы:

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

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

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

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

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

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


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

Какой еще реквизит нужен? Разве колонка "Родитель" не может выступать в этой роли ?
32. mike Figurin (drugoi_mir) 08.09.16 10:53
Тогда тебе осталось связать набор данных сам с собой. На закладке связи наборов данных.
Приемник = элемент
источник = родитель
начальное условие свзяи Значение(Справочник.номенклатура,пустаяСсылка)