Имя: Пароль:
1C
1С v8
СКД + Иерархия элементов + Итоги показателей по иерархии
,
0 Tiger_MDR
 
04.10.17
13:41
Добрый день, форумчане!

Много лазил по форумам, читал вумные книжки, но так и не нашёл для себя решения задачи, описанной ниже. Очень надеюсь, что среди Вас найдутся более знающие и более опытные люди, чем я.

Итак, в базе есть справочник контрагентов с иерархией ЭЛЕМЕНТОВ, есть регистр накопления с показателями продаж этих контрагентов. Задача: вывести контрагентов в иерархическом виде, для каждого контрагента вывести показатель продаж, а также итоговый показатель продаж тех контрагентов, которые находятся "под ним" в структуре справочника НА ВСЕХ НИЖНИХ УРОВНЯХ.

Всю эту кухню надо реализовать на СКД, чтобы иметь возможность строить отчёт с произвольным отбором по реквизитам контрагентов, а также, чтобы можно было менять период продаж.

Например, это выглядеть должно так:

|----------------------------------------------------------|
| Уровень | Контрагент | Код | Сумма продаж | Сумма продаж |
|         |            |     | контрагента  | подчинённых  |
|         |            |     |              |    + свои    |
|----------------------------------------------------------|
|    1    | Пупкин     |  5  |     100      |     5100     |
|----------------------------------------------------------|
|    2    |   Иванов   |  7  |     1000     |     5000     |
|----------------------------------------------------------|
|    2    |   Петров   |  56 |     500      |     4000     |
|----------------------------------------------------------|
|    3    |     Ухов   |  3  |     3500     |     3500     |
|----------------------------------------------------------|

Бьюсь уже пару недель :(

Отдельно иерархию контрагентов получается сделать, показатель продаж достать по конкретному контрагенту нет проблемы. Вся проблема найти сумму по иерархии. Была бы иерархия групп и элементов справочника "Контрагенты", вопросов бы вообще не было.

Вроде, кажется, простой вопрос, а ставит в тупик.

Подбросьте идею, пожалуйста. Спасибо заранее всем откликнувшимся.
1 Happy Bear
 
04.10.17
13:44
ВычислитьВыражение пробовал?
2 DmitrO
 
04.10.17
13:48
по Пупкину Сумма продаж + свои вероятно должна быть 9100?
3 Tiger_MDR
 
04.10.17
13:58
(1) Пробовал, но как-то безуспешно. Работало только когда действительно выводил иерархически, но тогда появлялись двойные записи, т.е. под Пупкиным ещё один раз Пупкин был, а мне так не нужно.
(2) В таблице всё верно. 5100 = 3500+500+1000+100
4 DrShad
 
04.10.17
13:59
СУММА(ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ("СуммаПродаж", "Контрагент", "Иерархия"))

как-то так
5 Tiger_MDR
 
04.10.17
14:07
(4) Про такую штуковину думал, но так и не понял, в каком месте её лучше прикрутить. Ведь выводить дерево "без лишних строк" можно двумя способами:
1. Соединять набор с самим собой по полям "Ссылка"-"Родитель" на вкладке "связи наборов данных", но тогда в результат выводятся ДЕТАЛЬНЫЕ записи, где итогов иерархии нет.
2. Выводить иерархично, но определять пользовательское поле с условием отбора, но тогда выводятся не все записи: либо без "листиков", либо вообще лажа какая-то.
6 DrShad
 
04.10.17
14:15
(5) не знаю что и как ты там соединяешь, но у меня все работает
7 DrShad
 
04.10.17
14:15
а прикрутить ее в ресурс
8 YAGolova
 
04.10.17
14:22
(0) Я примерно с подобной задачей бьюсь постоянно. И ниразу ничего адекватного у меня не выходило))) Поэтому буду очень внимательно следить за этой темой. По своим изысканиям: делал и ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ и вычислитьвыражение, предварительно в запросе как то ставив метку на нужную мне запись, и экспортными функциями как то делал, иногда забиваю на скд и делаю макетом)))) Во общем все мои варианты мне не нравятся самому - поэтому каждый раз нахожусь в поиске нового варианта)
9 DrShad
 
04.10.17
15:18
http://SSMaker.ru/a31174bf/

вот вам пример в УПП, иерархия контрагентов построена через реквизит ГоловнойКонтрагент
10 mistеr
 
04.10.17
15:18
(0) > справочник контрагентов с иерархией ЭЛЕМЕНТОВ

У вас там МММ что ли?
11 DrShad
 
04.10.17
15:23
(10) тебе действительно интересно или выпендриться решил? у нас не МММ
12 Tiger_MDR
 
04.10.17
15:56
(10) Не МММ, но задача есть и я её хочу решить. :)
(9) Т.е. если, к примеру, попытаться не использовать стандартную иерархию по родителю, а сделать свою, но тоже по родителю, то будет нужный результат? Фокус-то как раз в иерархии ЭЛЕМЕНТОВ. Завтра попробую замострячить. :)
13 Tiger_MDR
 
04.10.17
15:59
(9) Кстати, суммы в Вашем скриншоте не так рассчитываются, как мне нужно. Думаю, вряд ли получится. Но попробую.
14 DrShad
 
04.10.17
16:03
(13) уверен что не так? если что пиши на мыло
15 DmitrO
 
04.10.17
16:06
(3)а, ну да, ок..
Но тогда почему по Иванову 5000, подчиненных нет, а своих только 1000.
16 Tiger_MDR
 
04.10.17
16:14
(15) Уууу... Это да. Напротив Иванова в последней колонке должна быть 1000. Остальное, вроде, нормально. Спасибо за поправочку.
17 ДемонМаксвелла
 
04.10.17
16:15
колонку справа можно посчитать и без скд, чисто в запросе.
18 Tiger_MDR
 
04.10.17
16:16
(17) С трудом представляю себе такой запрос.
19 ДемонМаксвелла
 
04.10.17
16:19
(18) соединить табличку с самой собой по условию, что поле1.Родитель=Поле1 или поле1.родитель.родитель=поле1 ...
20 Tiger_MDR
 
04.10.17
16:20
(19) Количество уровней справочника "Контрагенты" не ограничено.
21 ДемонМаксвелла
 
04.10.17
16:20
(20) в конце концов, для универсальности, запрос можно собрать кодом
22 DrShad
 
04.10.17
16:21
(19) давай запрос, ща проверим твои расчеты )))
23 DrShad
 
04.10.17
16:21
(21) вот как раз для универсальности и сделано на СКД
24 ДемонМаксвелла
 
04.10.17
16:22
(22) мне такое не надо, спасибо.

нужно правда учесть, что при большом справочнике такой запрос будет очень долго выполняться
25 DrShad
 
04.10.17
16:24
(24) замеры показать?
26 Tiger_MDR
 
04.10.17
16:24
Я простых вопросов не задаю. Это уже крайняя мера для меня - идти на форум и задавать вопрос. Это мой первый вопрос. Обычно, решение нахожу достаточно быстро, но это не тот случай. :(

(24) а справочник очень большой. Может достигать 100000 контрагентов и уровней ой-ёй-ёй сколько...
27 ДемонМаксвелла
 
04.10.17
16:24
(25) давай
28 DrShad
 
04.10.17
16:25
29 ДемонМаксвелла
 
04.10.17
16:27
(28) сколько элементов и уровней?
30 Tiger_MDR
 
04.10.17
16:27
(28) DrShad, можешь схему СКД выложить?
31 DrShad
 
04.10.17
16:29
(29) 546 элементов, вложенность не ограничена, но в данном примере у меня 5
32 ДемонМаксвелла
 
04.10.17
16:31
(31) не, это детсад. на 100 000 элементов и скд будет долго считать, хотя и быстрее, имхо, чем запрос с соединением таблицы самой на себя.
33 DrShad
 
04.10.17
16:32
(32) один хрен быстрее чем даже составной запрос собранный программно
34 ДемонМаксвелла
 
04.10.17
16:34
(33) пожалуй, да.
35 Tiger_MDR
 
04.10.17
16:36
Программно запрос составлять тоже непонятно, как, т.к. пользователь может выбрать любой элемент из этих 100000, а отчёт должен будет вывести ему данные только по этой иерархии. Вышестоящие контрагенты ему в отчёте будут не нужны. Это, кстати, ещё один гемор, который надо лечить.
36 Tiger_MDR
 
04.10.17
16:38
Любит СКД выводить вышестоящие уровни, если использовать стандартную группировку по иерархии.
37 DrShad
 
04.10.17
16:43
http://my-files.ru/yd9dnd

тут схема
38 Tiger_MDR
 
04.10.17
16:44
(37) Спасибо! Поковыряюсь. ;)
39 DrShad
 
04.10.17
16:45
(38) удачи
40 ДемонМаксвелла
 
04.10.17
16:46
(35) лично мне непонятно, что вам может быть тут непонятно. при сборке запроса вычисляется существующее количество уровней иерархии справочника и в зависимости от вычисленного числа уровней собирается условие соединения таблиц
41 Tiger_MDR
 
04.10.17
16:55
(40) Не приходилось ни разу менять текст запроса СКД после нажатия пользователем кнопочки "Сформировать". Попробую и этот вариант. Спасибо.
42 DrShad
 
04.10.17
16:57
(41) вот не нужно этим извращаться
43 Tiger_MDR
 
04.10.17
16:59
(42) А вдруг я ещё тот извращенец? )))))))))
44 Tiger_MDR
 
04.10.17
17:03
Мне это может пригодиться в следующем отчёте, который по своей сути является следующей стадией извращения над этим отчётом. Там надо будет эти же показатели, только за несколько периодов и ещё с отбором по значениям этих самых показателей (+ нулевые тоже будут нужны!).
45 mistеr
 
04.10.17
20:24
(11) Мне действительно интересно. Я такое встречал только в двух местах: в МММ-подобных схемах и у терминальщиков-обнальщиков.
46 Tiger_MDR
 
05.10.17
08:03
DrShad, спасибо за выражение:

ВЫЧИСЛИТЬВЫРАЖЕНИЕ("СУММА(СуммаПродажи)", "Контрагент", "ГруппировкаНеРесурса")

Вот именно в таком синтаксисе у меня заработал ресурс так, как надо.

Но в целом компоновку пришлось переделать, т.к. группировка по реквизиту мне не подходит.
47 Tiger_MDR
 
05.10.17
10:35
Ладно. Результат я получил примерно такой:

|----------------------------------------------------------|
| Уровень | Контрагент | Код | Сумма продаж | Сумма продаж |
|         |            |     | контрагента  | подчинённых  |
|         |            |     |              |    + свои    |
|----------------------------------------------------------|
|    1    | Сухов      |  50 |      0       |     205      |
|----------------------------------------------------------|
|    2    |  Лапин     |  53 |      0       |     205      |
|----------------------------------------------------------|
|    3    |   Шишкин   |  6  |      0       |     205      |
|----------------------------------------------------------|
|    4    |    Пупкин  |  5  |      70      |     205      |
|----------------------------------------------------------|
|    5    |     Иванов |  7  |     100      |     100      |
|----------------------------------------------------------|
|    5    |     Петров |  56 |      15      |      35      |
|----------------------------------------------------------|
|    6    |      Ухов  |  3  |      20      |      20      |
|----------------------------------------------------------|

В параметрах отчёта пользователь указал, что выводить нужно по тем контрагентам, которые под Шишкиным.
Вопрос: как избавиться от Сухова, Лапина и самого Шишкина, которых в отчёт не просили выводить. :)
Можно даже оставить Шишкина - это не будет проблемой или ошибкой.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн