Столкнулся с тем, что мне надо было преобразовать заранее подготовленную таблицу данных в управленческий отчет по доходам и расходам c промежуточными итогами по иерархии статей.
Молочников Олег Spb. 2013.
Хитрости компоновки данных: произвольная иерархия для внешней таблицы данных в отчетах на СКД.
Столкнулся с тем, что мне надо было преобразовать заранее подготовленную таблицу данных в управленческий отчет по доходам и расходам следующего вида:
Причем в силу особенностей разработки //infostart.ru/public/85502/ структура статей может не храниться в БД и данные могут попасть в СКД только во внешней таблице.
В отличном курсе http://xn—-1-bedvffifm4g.xn--p1ai/free/ нашел решение, которое позволяет построить произвольную иерархию только на основе запросов. Попытавшись использовать аналогично внешнюю таблицу, я убил несколько дней на поиски решения. Перерыв весь интернет я понял, что большинство желающих в итоге просто отступились от СКД. В итоге я решил создать гайд для вслед идущих.
Итак, упрощенно:
Нам потребуется заранее подготовленные две таблицы:
- Таблица значений статей доходов и расходов вида:
Период, СтатьяБаланса, Сумма.
- Таблица Иерархии:
СтатьяБаланса, СтатьяБалансаРодитель.
Код, передающий внешние таблицы в СКД и формирующий отчет:
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
СтруктураПараметров=Новый Структура;
СтруктураПараметров.Вставить("Данные", ТаблЗнач);
СтруктураПараметров.Вставить("Иерархия", ТаблИерархии);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, СтруктураПараметров, ДанныеРасшифровки);
ЭлементыФормы.Результат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
ПроцессорВывода.НачатьВывод();
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока ЭлементРезультата <> Неопределено Цикл
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
В
Создаем в СКД два набора данных вида объект и описываем их структуру:
Прописываем связи наборов данных:
Описываем ресурсы:
И последнее: создаем настройки для СКД:
Что позволит нам получить отчет как на самой верхней картинке. В этом отчете не будет работать отбор по вхождению в иерархию. Но если это нам очень нужно, это можно легко поправить, воспользовавшись, полем контроль иерархии. Удачи.
PS: Надеюсь вам понравится эта и другие мои разработки на //infostart.ru/profile/48714/.
Очень жду ваших комментариев и пожеланий.
Молочников Олег Spb. 2013.
Для достижения полного идеала осталось только заменить»01.06.2013″ на «июнь 2013».
я пока не накопал, как это сделать…
(1) dock, установить формат поля для даты в виде «ММММ гггг»
(2) Uncore, замечательное решение. только вот где это установить в СКД….
(3) Или условное оформление поля в настройках или в оформлении поля в наборах данных
Пожелание есть. Если будет возможность, прикрепите файл отчета в качестве примера.
Также Вы упоминаете поле «контроль иерархии». Что имеется ввиду?
может ссылку по курсу поменяйте на оригинальнуюhttp:// /free/
(5) VladimirL, Извините, но отчет сам по себе не работает, он входит в состав Настраиваемого управленческого баланса, который предоставляет агрегированные данные для отчета. А по поводу контроля иерархии подробно описано в вышеупомянутом курсе, или погуглите информацию.
Убил всю прошлую неделю пытаясь сделать иерархию из запросов. Спасибо, пригодится!
Закладочку поставлю ка я тут. Почитать надо..
—В этом отчете не будет работать отбор по вхождению в иерархию. Но если это нам очень нужно, это можно легко поправить, воспользовавшись, полем контроль иерархии. Удачи.—
Вот на этом поподробнее можно? Как сделать проверку иерархии,
Спасибо большое!
Когда СКД только появилась, я пытался делать иерархию в таблице — не получилось.
Теперь понятно, как надо было.
(10) В теории там можно обойтись и без запроса, сделав третий источник данных с иерархией, и связав его, как показано в курсе, но сам не пробовал из за критической нехватки времени и отсутствия острой необходимости.
Надо попробовать, самому интересно.
(10) mylogin,
Да какая разница чем является набор данных — запросом или внешним объектом?
Принципы построения собственной иерархии от этого не зависят.
В статье есть ссылочка на видеокурс. Там все хорошо рассказано.
Не пойму — в чем проблема то? Механизм построения собственной иерархии в СКД работает одинаково что для запросов, что для таблиц.
(5) VladimirL,
Также Вы упоминаете поле «контроль иерархии». Что имеется ввиду?
Вот если хотите для примера — Отчет по справочнику «Номенклатура» с иерархией по реквизиту «НоменклатурнаяГруппа». Тут есть и сама иерархия, и контроль иерархии.
Это сохраненная схема компоновки. Для просмотра создайте новый отчет, откройте схему компоновки отчета и загрузите в нее схему из данного файла.
(12) дело в том что информацию «о родителях» в моем случаи невозможно получить запросом, таблица формируется програмно.
(13) Spacer, читайте мой вопрос внимательнее. С построением собстаенной иерархии у меня проблем нет. Вопрос в контроле иерархии для возможности отбора по группам.
Разница м/у запросом и внешним объектом — таблицей, в том, что набор данных «Запрос» выполняется динамически в зависимости от переданого параметра. т.е. грубо говоря отфильтровывает лишние данные в наборе описывающий связь родитель-потомок. В случаи когда мы передаем таблицу «извне», она уже сформирована и повлиять на нее из компоновки мы не можем.
Не поленился и скачал курс, нашел урок 95, но там только пример с запросами. Если я пропустив в курсе где этот момент разбирается подскажите.
(16) mylogin,
Если у вас нет проблем с построением собственной иерархии, то какие могут быть проблемы с контролем иерархии?
Механизм контроля иерархии включает в себя выборку тех же данных которые необходимы для построения иерархии.
Только условие проверки другое.
Век живи — век учить. Спасибо!
(17) Spacer, Вот пример. Как тут сделать отбор по конкретному узлу?
Был нюанс: Отбор «В группе» работает, а отбор «В списке по иерархии» — НЕ РАБОТАЕТ. А отбор «Не в группе» хоть и отсекает подчиненные, но выводит саму группу!Нужно заменять эти отборы на группу отборов.
Вроде в разработке сложных отчетов Хрусталевой была такая тема.
Спасибо за решение, на самом деле век живи век учись…
Но по привычке делаю иерархию таблицами значений и циклами)))… благо задачки мелкие, пока позволяют)
Спасибо! Очень пригодилось!
Спасибо! очень пригодилось! 5 минут и всё готово.
Все конечно здорово, но не работает так как описано выше.
1. «СтруктураПараметров.Вставить(«Иерархия», ТаблИерархии); а в схеме компоновки данных понятие ТаблИерархии не встречается.
2. На самой первой картинке с указанными полями выдается ошибка
{ВнешнийОтчет.БалансЦПР.МодульОбъекта(201)}: Ошибка при вызове метода контекста (Инициализировать)
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, СтруктураПараметров, ДанныеРасшифровки);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Не найдено поле замены «СтатьяБалансаРодитель»
Без поля СтатьяБалансаРодитель — формируется.
3. Не могу понять как вывести таблицу иерархии если в таблице значений не все статьи баланса есть?
Если вы думаете что достаточно поменять источник связи и приемник, то это не помогает.
так как вылетает ошибка
{ВнешнийОтчет.БалансЦПР.МодульОбъекта(213)}: Ошибка при вызове метода контекста (Следующий)
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
по причине:
Ошибка компоновки данных
по причине:
Ошибка получения данных
по причине:
Связь описывающая иерархический спуск должна содержать либо выражение начального значения, либо имя параметра связи «Иерархия»
Гуру, может поможете разобраться?
Я пришел к использованию справочника нПроизвольныеИерархии с иерархией элементов — для каждого отчета с произвольной иерархией, отличной от иерархии данных создал свою ветку элементов с нужными мне наименованиями, а в запросе или переборе тз(когда использую набор-данных объект и если в запросе никак) заполняю значениями подчиненных элементов поле, по которому группирую с иерархией в СКД — легко и приятно)
(0)
Таблица значений статей доходов и расходов вида:
Период, СтатьяБаланса, Сумма.
Однако на скрине
мы видим 4 поля.
Tакой момент. Если иерархия только в пределах измерения должна строиться как это сделать? Например есть ведомость внутри неё иерархия блоков по идентификатору родителя строится. Есть вторая ведомость в ней тоже самое. При этом идентификаторы в пределах ведомости уникальны, а вне могут совпадать. Например у корневого идентификаторе родителя =»». Нужно вывести иерархию с группировкой по ведомости.
У нас таблица иерархии
ИдентификаторСтроки,
ИдентификаторИзделия,
Нонменклатура,
Ведомость
Что в условиях связи прописать?
Добрый день!
У меня чуть другая ситуация с хранением данных, и я думаю от этого не получается настроить иерархию. Суть — изделие, состоящее из дерева комплектующих.
Связи соответствия (и остаток) хранятся в регистре накопления с 2 измерениями (изделие и комплектующая).
Как мне построить таблицу иерархии ?
Я попытался вот таким запросом
И в итоге не получается . Выходит только 1 уровень иерархии. Таблица иерархии что из себя должна представлять ? Просто всевозможнные строки «элемент-Родитель» ?
(29) Должен быть признак иерархии, т.е. еще один реквизит, который указывает на родителя.
Таблица иерархии. Колонки
1.элемент
2.Родитель
Какой еще реквизит нужен? Разве колонка «Родитель» не может выступать в этой роли ?
Тогда тебе осталось связать набор данных сам с собой. На закладке связи наборов данных.
Приемник = элемент
источник = родитель
начальное условие свзяи Значение(Справочник.номенклатура,пустаяСсылка)
Скажите, а как быть, если один элемент может принадлежать нескольким родителям? Видела видео, где это реализовывалось, но там набор данных был запрос, и при связи в скд передавался параметр МассивСсылок
http://infostart.ru/video/w389430/
Есть более интересное и простое решение на СКД —http://start1c.blogspot.ru/2017/01/blog-post.html
А можно ли делать помимо произвольной иерархии вывод произвольных значений итогов ресурса своей иерархии?
(35) Тоже интересует подобный вопрос. Требуется возможность выводить заданные значения в иерархии вместо подсчета по заранее определенному алгоритму итогов.
У меня такая проблема: при выводе элемент иерархии выводится дополнительно в нижестоящей группировке.
Т.е и в узле иерархии, и в детализации
У данного метода есть недостаток. Например имеем
ТабДанные:
Родитель Элемент ДопРеквизит
—————————————————
Родитель1 Элемент1 ДопРеквизит1
Родитель2 Элемент1 ДопРеквизит2
ТабИерархия:
Родитель Элемент
—————————————————
(пусто) Родитель1
Родитель1 Элемент1
(пусто) Родитель2
Родитель2 Элемент1
Отчет будет правильным в плане иерархии, т.е.
Родитель1
Элемент1 ДопРеквизит1
Родитель2
Элемент1 ДопРеквизит1
но колонка ДопРеквизит для Родитель2 будет равна ДопРеквизит1, т.е. из таблицы ТабДанные берется неправильная строка, поскольку связь таблиц с данными и иерархией только по полю Реквизит. Если добавляешь связь ТабДанные.Родитель = ТабИерархия.Родитель тогда иерархии нет в отчете, просто списком
Добрый день.
Может кто сталкивался, при настройки связей и выборе «родителя» при выходе возникает ошибка «Поле не найдено «РодительГл»».
Куда копать не пойму
(38) Возникла необходимость выводить произвольную иерархию, но при этом для элементов являющихся родителями необходим выводить их доп. реквизиты. Красиво это сделать не получается.
Как только реквизит выводится для элемента являющегося родителем, так элемент сразу начинает дублироваться и вкладываться в сам в себя.
Долго же я тупил, боже!
Мне почему-то показалось что в объекте — «Иерархия» должна быть только иерархия, а в «Элементы» только элементы и естественно связь не лепилась. На самом деле в объект(таблица на вход) должна содержать и иерархию и сам элемент.