Подобная тема много обсуждалась, но на конкретно свой вопрос ответа не нашел.
Есть справочник с иерархией элементов и регистр, в котором хранятся значения по элементам справочника. Причем значения могут относиться как и к "листовым" элементам, так и к родительским.
Если создать стандартный отчет на СКД, то получится результат как на первой картинке.
Мне же нужно, во-первых избавиться от дублирования родительского элемента в самой группе, чтобы остался только в заголовке, а из группы исчез.
Во-вторых, чтобы напротив оставшегося родителя стояла не сумма всех подчиненных, а значение из регистра, которое соответствует именно ему.
В общем, как надо показано на второй картинке.
Как избавиться от дублирования узнал здесь: http://forum.infostart.ru/forum26/topic144015/ Но вот вопрос с ресурсом не решил.
Подскажите, пожалуйста. Также прикладываю тестовую базу, где есть эти данные и отчет.
(4) horoshevall, да, на тестовой базе выглядит все круто! Правда, я вообще не понимаю, как это работает, откуда там иерархия взялась? :-)
Но на рабочей пока почему-то не взлетело. Получается, после добавления связей набора с самим собой не отбирается ни одна строка. Пока не могу понять почему, вроде бы также соединяюсь по иерарх элементу и его родителю...
(12) CyberCerber, 2 момента, которые написать забыла. 1 - в условии связи в СКД написать начальное значение связи "ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)". 2 - в запросе объединяем справочник номенклатуры с регистром цен, ссылку на номенклатуры из справочника берем - иначе не работает. Если честно, для меня это тоже магией выглядит. Но работает - это факт =) Кстати, подобный отчет для УТ 11 попробовала сделать - он во вложении.
(13) horoshevall, понял я, в чем проблема. Ваша методика работает, только если в итоге выводятся только элементы иерарх справочника и сам ресурс. Но мне еще другие поля нужны. И тогда работать перестает.
(17) CyberCerber, Можете написать, что еще вы выводите? Сейчас в отчет добавила измерение и ресурс из регистра - выводится также по иерархии номенклатуры.
(18) horoshevall, вот, переделал тестовую базу, чтобы привести пример.
Добавил в Цены номенклатуры измерение Организация. И в итоговом отчете надо вывести таблицу, где на пересечении Номенклатуры и Организации будет Цена.
(1) CyberCerber, Чтобы получить результат, как на вашей картинке, помогает:
Делаем запрос:
ВЫБРАТЬ
Цены.Цена,
НоменклатураСпр.Ссылка КАК Номенклатура,
НоменклатураСпр.Родитель КАК Родитель
ИЗ
Справочник.Номенклатура КАК НоменклатураСпр
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены КАК Цены
ПО (Цены.Номенклатура = НоменклатураСпр.Ссылка)
На закладке "Связи наборов данных" делаем связь ИсточникДанных1 с ИсточникДанных1 - Источник - "Номенклатура", приемник "Родитель". Связь обязательная. Ресурс Цена рассчитываем по "Номенклатура, Номенклатура Иерархия". В сам отчет выводите только детальные записи - без группировок по иерархии номенклатуры.
(16) CyberCerber, ну посмотри видео 110 уроков Гилева по СКД.
В твоем случае либо использовать группировки разные по разным уровням или использовать выражение вычислить. Смотри новые функции СКД 8.2.14.
Если не понятно, показывай скриншоты буду тыкать)
На картинке видно, что получилось. Вообще, очень даже неплохо, если в группе есть значение по родителю, он берет его. Но еще почему то взялись цифры, которые обвел. Там вообще ноль должен быть.
(24) CyberCerber, тут скорее всего нужно подумать над тем какие параметры вписать в эту функцию. Почитайте описание, скорее всего поймете как нужно прописать.
(26) CyberCerber, это на практике приходит. Там нужно указывать группировку по которой будет идти вычисление, также можно указать несколько колонок, чтобы в любой вариации СКД считал все корректно.
ВЫБРАТЬ
Ном.Ссылка КАК Ссылка,
ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
Справочник.Номенклатура КАК Ном
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены КАК Цены
ПО (Цены.Номенклатура = Ном.Ссылка)
УПОРЯДОЧИТЬ ПО
Ссылка ИЕРАРХИЯ УБЫВ // в консоле складывается
Показать
Далее через внешний набор (ТЗ), это на вскидку. Возможно есть и другие решения.)
можно еще попробовать через связи наборов данных, но нет времени возиться)
Оно конечно костылина страшная, но...
Т.к. папки нам нужно убрать (СКД сама их построит), то все данные должны храниться на уровне элементов, в том числе и по родительским папкам. Значит значение ресурса мы должны растиражировать для каждого уровня группировки.
В приведенном примере мы должны получить
таблицу с полями Номенклатура, РесурсУ1,РесурсУ2
Ном11, 60, 10
Ном12, 60, 20
Ном13, 60, 30
ном21, 70, 40
ном31, 70, 50
Тогда в СКД в ресурсах на группировке можно будет прописать формулу "Выбор когда уровень()=1 тогда минимум(РесурсУ1) когда Уровень()=2 тогда Минимум(РесурсУ2) ...."
Такую таблицу получить сложно, но можно.
(27) PiotrLoginov, да, методика horoshevall отлично работает на тестовой базе, но в рабочей базе, где запрос возвращает 30 000 строк, соединение таблицы с самой собой заставляет сервер уйти в глубокое раздумье, из которого он не возвращается.
Поэтому я не смог остановится на этом варианте и продолжил поиск. В итоге сделал сам более оптимальный вариант.
Но вознаграждение horoshevall сейчас отдам, т.к. она проделал самую большую работу.
А у меня еще оффтоповый вопрос...
Сейчас сверху написано:
ВОПРОС ЗАКРЫТ
За решение данного вопроса уже выдалось вознаграждение в размере 4 $m
(на решение вопроса деньги выделены от автора и: Светлый ум (1.00)).
Почему 4? Я выделял 5 монеток. А еще написано, что Светлый ум выделял. Тогда вообще не 1, а 2 монетки куда-то делись.