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

23.12.13

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

         

     

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

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

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

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

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

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


В 

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

 

 

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

 

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

 

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

 

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

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

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

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

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

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1754    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4423    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7464    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7855    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4446    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8840    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7806    dusha0020    8    

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

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


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

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

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

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

Да какая разница чем является набор данных - запросом или внешним объектом?
Принципы построения собственной иерархии от этого не зависят.
В статье есть ссылочка на видеокурс. Там все хорошо рассказано.
11. Сисой 87 24.12.13 10:44 Сейчас в теме
Спасибо большое!
Когда СКД только появилась, я пытался делать иерархию в таблице - не получилось.
Теперь понятно, как надо было.
14. Spacer 355 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 115 14.04.16 14:13 Сейчас в теме
Я пришел к использованию справочника нПроизвольныеИерархии с иерархией элементов - для каждого отчета с произвольной иерархией, отличной от иерархии данных создал свою ветку элементов с нужными мне наименованиями, а в запросе или переборе тз(когда использую набор-данных объект и если в запросе никак) заполняю значениями подчиненных элементов поле, по которому группирую с иерархией в СКД - легко и приятно)
27. kasper076 101 13.05.16 13:56 Сейчас в теме
(0)
Нам потребуется заранее подготовленные две таблицы:

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

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

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

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

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

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


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

Какой еще реквизит нужен? Разве колонка "Родитель" не может выступать в этой роли ?
32. drugoi_mir 15 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 109 21.05.17 16:30 Сейчас в теме
А можно ли делать помимо произвольной иерархии вывод произвольных значений итогов ресурса своей иерархии?
36. lopatin 680 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 101 28.11.19 17:02 Сейчас в теме
(38) Возникла необходимость выводить произвольную иерархию, но при этом для элементов являющихся родителями необходим выводить их доп. реквизиты. Красиво это сделать не получается.
Как только реквизит выводится для элемента являющегося родителем, так элемент сразу начинает дублироваться и вкладываться в сам в себя.
Прикрепленные файлы:
39. glime 106 30.07.19 13:54 Сейчас в теме
Добрый день.
Может кто сталкивался, при настройки связей и выборе "родителя" при выходе возникает ошибка "Поле не найдено "РодительГл"".
Куда копать не пойму
41. Merkalov 8 12.12.19 14:48 Сейчас в теме
Долго же я тупил, боже!
Мне почему-то показалось что в объекте - "Иерархия" должна быть только иерархия, а в "Элементы" только элементы и естественно связь не лепилась. На самом деле в объект(таблица на вход) должна содержать и иерархию и сам элемент.
42. manserg 104 13.04.20 22:45 Сейчас в теме
Коллеги, нужна помощь!
Уже уйму времени убил на попытки вывести произвольную иерархию комплектов номенклатуры с остатками.
Конфигурация каркасная, у справочника номенклатура есть табличная часть "СоставКомплекта" где собственно перечислен состав, но при этом там могут быть и другие комплекты, т.е. структура многоуровневая.
Так же есть простейший регистр остатков товаров с измерениями склад и номенклатура и ресурсом количество.

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

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

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

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

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

P.S. Пытался формировать через ссылки элементов номенклатуры, но столкнулся с тем, что при наличии допустим остатка комплекта "Секция левая" и "Шкаф "Виктория"" который в себе содержит "Секция левая" получается задвоение строк в такой иерархии.
Победить такое поведение попытался построением сложных ключей элементов и их родителей чтобы они четко связывались без дублей, но иерархия вообще перестала строится (
Прикрепленные файлы:
44. blackviper 29.12.20 13:41 Сейчас в теме
(42) Добрый день, вы случайно не нашли решение? Тоже с этим столкнулся...
43. korol-ar 09.07.20 21:17 Сейчас в теме
45. user1050439 7 10.04.23 18:53 Сейчас в теме
Выкладываю как у меня получилось с данным примером, но с доработкой, где нужно добавлять к набору данных "объект" кастомные вещи запросом через набор-объединение.
Прикрепленные файлы:
тестИерархия_уч.erf
46. user640716_mt1710 01.03.24 14:03 Сейчас в теме
Контроль иерархии не будет работать, если собственная иерархия построена не на иерархическом справочнике, например, на иерархии строк, если тип реквизита построения своей иерархии - строка.
Оставьте свое сообщение