Имя: Пароль:
1C
1С v8
Дубли итогов при выборке по Иерархии
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
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>
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший