Имя: Пароль:
1C
 
Вывод запроса с обработкой результата в табдок с иерархией
0 Кто-то-кто
 
07.08.18
21:44
Доброго времени суток. Продолжаю марафон глупых вопросов и умных ответов, но ближе к телу:

Есть запрос:

&НаСервере
Процедура СерверЗаполнитьТабличныйДокумент(АдресХранилища, ТабДок);
    
    ТЗ = ПолучитьИзВременногоХранилища(АдресХранилища);
    
                   //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Макет = Обработки.ДеревоРесурсныхСпецификаций.ПолучитьМакет("МакетРасчетПотребностей");
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Данные.Номенклатура,
        |    Данные.ЕдиницаИзмерения,
        |    Данные.Количество,
        |    Данные.Разница
        |ПОМЕСТИТЬ ТЗ
        |ИЗ
        |    &Данные КАК Данные
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ТЗ.Номенклатура КАК Спецификация,
        |    ТЗ.ЕдиницаИзмерения,
        |    ТЗ.Количество КАК Количество,
        |    СвободныеОстатки.Номенклатура КАК Номенклатура,
        |    СвободныеОстатки.Склад,
        |    СвободныеОстатки.ВНаличии КАК ВНаличии,
        |    ВЫБОР
        |        КОГДА СвободныеОстатки.ВНаличии > ТЗ.Количество
        |            ТОГДА 0
        |        ИНАЧЕ ТЗ.Количество - СвободныеОстатки.ВНаличии
        |    КОНЕЦ КАК Разница
        |ИЗ
        |    ТЗ КАК ТЗ
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки КАК СвободныеОстатки
        |        ПО ТЗ.Номенклатура = СвободныеОстатки.Номенклатура
        |ГДЕ
        |    НЕ ТЗ.Номенклатура ЕСТЬ NULL
        |
        |СГРУППИРОВАТЬ ПО
        |    ТЗ.Номенклатура,
        |    ТЗ.ЕдиницаИзмерения,
        |    ТЗ.Количество,
        |    СвободныеОстатки.Номенклатура,
        |    СвободныеОстатки.Склад,
        |    СвободныеОстатки.ВНаличии,
        |    ТЗ.Разница";
    
    Запрос.УстановитьПараметр("Данные", ТЗ);
    РезультатЗапроса = Запрос.Выполнить();
    
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
    ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
    
    ТабДок.Очистить();
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    
        ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
        ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.Вывести(ОбластьПодвалТаблицы);
    ТабДок.Вывести(ОбластьПодвал);

"Задолго до  сотворения мира" - я разбираю СтруктуруДерева, передаю в ТаблицуЗначений, умножаю на нужное мне число колонку "количество", передаю в запрос и на выходе имею запрос с обработкой результата и выводом в ТабДок.

выводятся следующие поля:

1)Спецификация - дерево, что пройдено и кинуто в ТЗ
2)ЕдИзм - понятно (дерево)
3) Кол-во - (дерево) по умолчанию 1, умножаю на вводимое от руки число
4)Номенклатура - сопоставляется по левому соединению (регистр)
5)Склад - где лежит (регистр)
6)ВНаличии - остаток (регистр)
7)Разница - 3-6 - (вычисляю)

Получаю вполне себе табдок(если выровнять по середине) с нужными данными.

Вопрос века: Спецификация (то что грузится в ТЗ из Дерева) заполняется по 4 колонкам с объявленными типами: Номенклатура, ЕдИзм, Кол-во и Разница.  Как дерево прочиталось, так и положилось

Пример - В Позицию1 входят Позиция2 и Позиция3, В Позицию2 входят Позиции с 0 по 10, в Позицию3 так же входят позиции с 0 по 10 и так далее...

Все выводится, все считается, все отлично... Объясните дураку, как сделать так чтобы все это в табдок выводилось так же в форме дерева...

Поз1+
Поз2+
  что-то1
  что-то2
  что-то3
     что-то1
     что-то2
  что-то4
Поз3+
  Что-то1
  Что-то2
    Что-то1
    Что-то2
  Что-то3

и.т.д

скд не предлагать, до...фига переписывать. хотелось бы все реализовать именно с учетом запроса с обработкой результата и выводом в табдок.
1 Cyberhawk
 
07.08.18
21:45
Какому телу?
2 Кто-то-кто
 
07.08.18
21:52
(1) Ближе к делу (телу запроса, моему трупу - тут уж кому что нравится)
3 DrShad
 
07.08.18
21:58
на СКД вообще ничего переписывать не нужно чтобы вывести твою иерархию
4 Кто-то-кто
 
07.08.18
22:01
И тем не менее, возможно ли это реализовать с учетом того что имеется?
5 DrShad
 
07.08.18
22:06
ну когда-то же, еще на клюшках, делали - значит возможно
6 AnisaL
 
07.08.18
22:09
(4) вот я недавно делала отчет с выводом в табдок с иерархией, может поможет

    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
    ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
    ОбластьПериод = Макет.ПолучитьОбласть("Период");
    ОбластьНоменклатура = Макет.ПолучитьОбласть("Номенклатура");
    ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
    
    ТабДок.Очистить();
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    ВыборкаОбщийИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    ВыборкаОбщийИтог.Следующий();        // Общий итог
    ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);

    ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());
    
    ВыборкаПериод = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаПериод.Следующий() Цикл
        
        ОбластьПериод.Параметры.Заполнить(ВыборкаПериод);
        ТабДок.Вывести(ОбластьПериод, ВыборкаПериод.Уровень());
        
        ВыборкаНоменклатура = ВыборкаПериод.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
        Пока ВыборкаНоменклатура.Следующий() Цикл
            ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура);
            ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень());    
            ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
    
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
                ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.ПоказатьУровеньГруппировокСтрок(0);
7 Кто-то-кто
 
07.08.18
22:13
(6)  в цикле выборки сделать отдельный цикл выборки по номенклатуре... и ее уже обойти по группировкам с учетом уровней, а дальше уже выводить все остальное - спасибо, это мысль!)
8 AnisaL
 
07.08.18
22:15
(7) пожалуйста :)
9 Кто-то-кто
 
07.08.18
23:05
Увы, видимо я все таки воробушек с лапками - ничего не меняется. В любом случае спасибо, буду копать дальше =)
10 Cyberhawk
 
07.08.18
23:36
Что за воробушек?
11 Кто-то-кто
 
07.08.18
23:48
Воробушек который тупой =)
12 МихаилМ
 
07.08.18
23:58
(11)
просто Вы не знакомы с азами программирования.

может Вам стоит сменить работу.
13 Кто-то-кто
 
08.08.18
00:02
(12) Ну мести улицы так же профессионально как дворник я тоже не умею и азов подметания так же не знаю) но к совету прислушаюсь, со временем) спасибо!
14 МихаилМ
 
08.08.18
00:11
(13) мести улицы можно научиться за месяц, а программировать - года за 2 минимум.
15 Кто-то-кто
 
08.08.18
00:16
Я пожалуй поучусь, время терпит. До пенсии все равно не дотяну)

Оффтоп разводить не вижу смысла. AnisaL спасибо за годную подсказку, остальным спасибо за конструктивную критику =)