|
Дубли итогов при выборке по Иерархии | ☑ | ||
---|---|---|---|---|
0
ssserg
10.03.15
✎
08:35
|
Добрый день.
Задача такая: получить иерархически весь справочник с его элементами и группами, а также с итогами прицепленными из другой таблицы по каждому элементу, но при этом чтобы не было дублей. Если бы у меня не было числовых итогов, то всё решалось просто, в запросе написал бы: ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ и вывелась бы идеальная иерархия, вот как пример на скриншоте: https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Просто%20иерархия.png Сам справочник при этм выглядит так: https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Номенклатура.png Но так как мне нужны ещё и итоги, то вместо "Упорядочить" использую конструкцию ГДЕ Ссылка.ЭтоГруппа = ЛОЖЬ ... ИТОГИ СУММА(СуммаОстаток) ПО Ссылка ТОЛЬКО ИЕРАРХИЯ Выглядит запрос следующим образом: ВЫБРАТЬ Товары.Ссылка КАК Ссылка, ТоварыОстатки.СуммаОстаток КАК СуммаОстаток ИЗ РегистрНакопления.Товары.Остатки КАК ТоварыОстатки ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары ПО ТоварыОстатки.Номенклатура = Товары.Ссылка ГДЕ Товары.ЭтоГруппа = ЛОЖЬ УПОРЯДОЧИТЬ ПО Ссылка ИТОГИ СУММА(СуммаОстаток) ПО Ссылка ТОЛЬКО ИЕРАРХИЯ но в результате получаю, что в дереве значений в группах могут лежать эти же самые группы, содержащие при этом в себе элементы, которые должны быть вложены в корень группы. получается как на скриншоте: https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Дубли.png а должны быть так https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Как%20надо.png По ссылка маааленькая база с данными, где можно посмотреть как выполняется запрос: https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Doubles.dt P.S. Эту тему смотрел v8: Как получить нормальные итоги (иерархия элементов) а также статью к ней Книга знаний: Получение дерева групп справочниками запросом Но тамошняя функция по удалению дублей мне не подходит, т.к. она удаляет группу-дубль вместе с нужным элементом, который в неё вложен |
|||
1
ssserg
10.03.15
✎
08:39
|
парсер блин, дублирую ссылки:
https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Просто%20иерархия.png https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Номенклатура.png https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Дубли.png https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Как%20надо.png https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Doubles.dt |
|||
2
ssserg
10.03.15
✎
08:40
|
(1) твоюж медь :)
|
|||
3
Simod
10.03.15
✎
09:04
|
ВЫБРАТЬ
СправочникНоменклатура.Ссылка КАК Ссылка, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ Справочник.Номенклатура КАК СправочникНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки ПО СправочникНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура ИТОГИ СУММА(КоличествоОстаток) ПО Ссылка ТОЛЬКО ИЕРАРХИЯ http://its.1c.ru/db/metod8dev/content/2659/hdoc |
|||
4
ssserg
10.03.15
✎
09:12
|
(3)эту статью тоже читал.
от моего запроса этот отличается только тем, что у меня ещё есть секция "Упорядочить" в запросе, а также условие "Где", но от их удаления из запроса результат НЕ ПОМЕНЯЛСЯ, как были дубли так и остались (получится ли на этот раз ссылку выложить аккуратно)) https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/double_again.png |
|||
5
Simod
10.03.15
✎
09:43
|
(4) Где и как используется результат запроса?
|
|||
6
D_E_S_131
10.03.15
✎
10:19
|
(4) У тебя нет условия, что группы не будут выбираться, вот они и выходят в отчет. А еще иерархия добавляется.
|
|||
7
ssserg
10.03.15
✎
10:44
|
(6) вы потеряли нить повествования. Я его убрал, потому что товарищ в (3) предложил мне запрос без условия "где ЭтоГруппа = Ложь", а первоначально запрос выглядит так:
ВЫБРАТЬ Товары.Ссылка КАК Ссылка, ТоварыОстатки.СуммаОстаток КАК СуммаОстаток ИЗ РегистрНакопления.Товары.Остатки КАК ТоварыОстатки ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары ПО ТоварыОстатки.Номенклатура = Товары.Ссылка ГДЕ Товары.ЭтоГруппа = ЛОЖЬ УПОРЯДОЧИТЬ ПО Ссылка ИТОГИ СУММА(СуммаОстаток) ПО Ссылка ТОЛЬКО ИЕРАРХИЯ |
|||
8
D_E_S_131
10.03.15
✎
10:59
|
Видимо суть в (5). Построитель (который использует например "Консоль отчетов") нормально выводит иерархию при задании вывода группировки тип "Иерархия".
|
|||
9
ssserg
10.03.15
✎
11:04
|
(5) используется при заполнении фиксированного макета, в котором каждой строке соответствует строка из дерева значений как на картинке из первого поста, а также имеются строки-группы, содержимое которых должно суммировать в себе несколько позиций по обычным строкам.
Грубо говоря мне бы достаточно было в запросе просто получать адекватную иерархию с суммами и без дублей групп. Дерево значений то бишь. Та самая картинка из первого поста: https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/Как%20надо.png |
|||
10
ssserg
10.03.15
✎
11:05
|
(8) Нет, он не выводит нормально в том случае который описал я.
Вот он скриншот результат ещё раз: https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/double_again.png |
|||
11
D_E_S_131
10.03.15
✎
11:06
|
(10) А ты попробуй это сделать в консоли ОТЧЕТОВ и увидишь разницу. Консоль запросов не все "умеет".
|
|||
12
ssserg
10.03.15
✎
11:21
|
(11) сори, был невнимателен, но мне от того, что в консоли отчетов оно может быть выводится правильно не легче.
Я засунул запрос в код, и поставил точку останова, затем выгрузил его результат в дерево значений и вызвал метод выбрать строку: Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).ВыбратьСтроку(); после этого имею следующего вида окно: https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/noesdblsagain.png в котором видно, что всё таки дублируется группа в самой структуре дерева значений. То есть то, что в консоли отчетов может быть даже дубль группы не выводится - это прекрасно, но мне на выходе нужно Дерево значений, а не результат компоновки данных или что там получается на выхлопе у консоли. |
|||
13
D_E_S_131
10.03.15
✎
11:43
|
Нормально построить иерархию можно только с условием иерархии групп и элементов. При выводе данных куда-либо в любом случае придется отличать группировку от детальных записей. Поэтому можешь делать это самостоятельно (работая с выборкой запроса), а можешь доверить работу Построителю или СКД.
|
|||
14
Simod
10.03.15
✎
12:03
|
(9) Сделай пакетный запрос:
1) Иерархия 2) Итоги Перебирай Иерархию и соединяй с итогами в процессе выборки. |
|||
15
ssserg
10.03.15
✎
12:38
|
(13) Попробовал следующий способ через Построитель запроса и точку останова, текст запроса отрабатывал как надо в консоли отчетов и давал нужный вид отчета, но при пытке засунуть в код, он ведет себя опять не так как нужно и получается такой же результат как и обычном запросе
Построитель = Новый ПостроительОтчета; Построитель.Текст = "ВЫБРАТЬ | Товары.Ссылка КАК Ссылка, | ТоварыОстатки.СуммаОстаток КАК СуммаОстаток |ИЗ | РегистрНакопления.Товары.Остатки КАК ТоварыОстатки | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары | ПО ТоварыОстатки.Номенклатура = Товары.Ссылка |ГДЕ | Товары.ЭтоГруппа = ЛОЖЬ |ИТОГИ | СУММА(СуммаОстаток) |ПО | Ссылка ИЕРАРХИЯ"; Рез = Построитель.Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).ВыбратьСтроку(); Выглядит это безобразие так(на заднем плане видно что в консоли отчетов все ок, т.е. как будто используется некая постобработка результата): https://dl.dropboxusercontent.com/u/15525241/Дубли%20в%20иерархии/bs.png |
|||
16
ssserg
10.03.15
✎
12:47
|
(14) Не получится, т.к. проблема в том, что Иерархия не может использоваться во временной таблице
|
|||
17
Simod
10.03.15
✎
14:01
|
(16) Не временная таблица, а пакетный запрос. Разницу понимаешь?
|
|||
18
ssserg
10.03.15
✎
14:23
|
(17)
ни разу не приходилось ими пользоваться без помещениях оных во временные таблицы. Так ну ладно, взял я иерархию(действительно не ругается) - это запрос пакета 1 взял я итоги - это запрос пакета 2, а что с ними потом делать то? Как я могу обратиться к пакету 2 из результата пакета 1?? Не совсем понятно что имелось ввиду. Или имелась ввиду ситуация, что выполняем отдельно два запроса. результат первого - это иерархия с элементами, а результат второго просто итоги по каждой позиции? и в цикле по результату иерархии делаем вложенный цикл в котором перебираем элементы в поисках подходящего из второго результата запроса? |
|||
19
ssserg
12.03.15
✎
15:32
|
Решить проблему четко как я писал в заглавном посте так и не удалось.
Но зато добился требуемого мне результата другим путём: 1) Переделал запроса так, чтобы он получал суммовые итоги ТОЛЬКО по элементам, группы же при этому сумм не имели. Вывод элементов так и оставил в иерархии 2) Выгружаю запрос в дерево значений 3) В цикле прохожу по всем заглавным веткам дерева значений, в них если встречаю группу, то рекурсивно вызываю функцию, которая возвращает мне сумму по вложенным элементам(если снова попадается папка, то функция снова себя вызывает). В результате такого обхода заполняю таблицу значений вида <ЭЛЕМЕНТ> <СУММА> то есть ДЕРЕВО значений вида: <ПАПКА> -<ЭЛЕМЕНТ_1> <СУММА_1> -<ПОДПАПКА_1> --<ЭЛЕМЕНТ_1.1> <СУММА_1.1> --<ЭЛЕМЕНТ_1.2> <СУММА_1.2> я преобразовываю в ТАБЛИЦУ значений: <ПАПКА> <СУММА_1> + <СУММА_1.1> + <СУММА_1.2> <ЭЛЕМЕНТ_1> <СУММА_1> <ПОДПАПКА_1> <СУММА_1.1> + <СУММА_1.2> <ЭЛЕМЕНТ_1.1> <СУММА_1.1> <ЭЛЕМЕНТ_1.2> <СУММА_1.2> |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |