Имя: Пароль:
1C
1С v8
Макет. Глубина группировки.
0 antihacker
 
30.05.15
11:26
Всем привет. Ребята подскажите. Как в макет динамический добавить группы по иерархии за ранее не зная глубину иерархии ?
1 Zhuravlik
 
30.05.15
12:35
Если 1Сv8 - СКД. Если 77 - много думать головой. И что значит "макет динамический"??
2 Chameleon1980
 
30.05.15
12:57
ТабличныйДокумент.НачатьГруппуСтрок (SpreadsheetDocument.StartRowGroup)
ТабличныйДокумент (SpreadsheetDocument)
НачатьГруппуСтрок (StartRowGroup)
Синтаксис:

НачатьГруппуСтрок(<ИмяГруппы>, <ОткрытаЛиГруппа>)
Параметры:

<ИмяГруппы> (необязательный)

Тип: Строка.
Название группы.
<ОткрытаЛиГруппа> (необязательный)

Тип: Булево.
Определяет необходимость открытия группы. Истина - выведенная группа будет открыта; Ложь - группа будет выведена в свернутом виде.
Значение по умолчанию: Истина.
Описание:

Начинает новую группу строк. Можно создавать вложенные группы строк.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:

ТабДок = Новый ТабличныйДокумент;
Секция = ТабДок.ПолучитьОбласть("R1");
Секция.Область("R1C1").Текст = "Численность сотрудников";
ТабДок.Вывести(Секция);
ТабДок.НачатьГруппуСтрок("По всем подразделениям", Истина);
Всего = 0;
Для Н=1 По 3 Цикл  
    Значение = Н; Итог = 0;  
    Секция.Область("R1C1").Текст = "Отдел "+Н;
    Секция.Область("R1C2").Текст = "";
    ТабДок.Вывести(Секция);
    ТабДок.НачатьГруппуСтрок("Отдел"+Н, Истина);
    Секция.Область("R1C1").Текст = "Группа";
    Секция.Область("R1C2").Текст = "Численность";
    Секция.Область("R1C2").ГоризонтальноеПоложение =
        ГоризонтальноеПоложение.Авто;
    ТабДок.Вывести(Секция);
    ТабДок.НачатьГруппуСтрок("Группа "+Н, Истина);
    Для К=1 По 4 Цикл
        Секция.Область("R1C1").Текст = "А"+Н+К;
        Секция.Область("R1C2").Текст = Значение;
        ТабДок.Вывести(Секция);
        Итог = Итог + Значение;
        Значение = Значение + 10;
    КонецЦикла;
    ТабДок.ЗакончитьГруппуСтрок(); // окончить группу "Группа"
    ТабДок.ЗакончитьГруппуСтрок(); // окончить группу "Отдел"
    Секция.Область("R1C1").Текст = "Итого"+Н;
    Секция.Область("R1C2").Текст = Итог;
    ТабДок.Вывести(Секция);
    Секция.Область("R1C1:R1C2").Текст = "";
    ТабДок.Вывести(Секция);
    Всего = Всего + Итог;
КонецЦикла;
ТабДок.ЗакончитьГруппуСтрок(); // окончить группу "По всем отделам"
Секция.Область("R1C1").Текст = "Всего:";
Секция.Область("R1C2").Текст = Всего;
ТабДок.Вывести(Секция);
ТабДок.ИтогиСнизу = Ложь;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Истина;
ТабДок.Показать("Пример использования метода НачатьГруппуСтрок");
3 Chameleon1980
 
30.05.15
12:58
тут СП продают.
оставьте свой заказ.
4 antihacker
 
01.06.15
08:17
Вот код. Почему не группирует ? Ди названии группы вообе не выводит. Только номенклатуры


    ТабДок.НачатьАвтогруппировкуСтрок();

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

                ЗапросПродажиНоменклатур.УстановитьПараметр("СЗНоменклатур",СЗНоменклатур);
             ЗапросПродажиНоменклатур.УстановитьПараметр("СЗКонтрагенты",СЗКонтрагенты);
             ЗапросПродажиНоменклатур.УстановитьПараметр("СЗИсключенныхКонтрагентов",СЗИсключенныхКонтрагентов);

              ЗапросПродажиНоменклатур.УстановитьПараметр("ДатаНач",НачалоДня(ДатаНач));
              ЗапросПродажиНоменклатур.УстановитьПараметр("ДатаКон",КонецДня(ДатаКон));

             РезПродажиВсе=ЗапросПродажиНоменклатур.Выполнить();
            
              ВыборкаРезПродажиВсе = РезПродажиВсе.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

             Пока ВыборкаРезПродажиВсе.Следующий() Цикл

             ВыборкаНоменклатура = ВыборкаРезПродажиВсе.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

                    СтрокаТовара=МакетОтчета.ПолучитьОбласть("СтрокаТовара"); //    |СтолбецТовара
                    СтрокаТовара.Параметры.Товар=ВыборкаНоменклатура.Номенклатура;
                
                    ТабДок.Вывести(СтрокаТовара, ВыборкаНоменклатура.Уровень());

                
             КонецЦикла;

            КонецЦикла;
        //--Группировка закончено
        //-------------------------------------    
    КОНЕЦЦИКЛА;
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
5 antihacker
 
01.06.15
08:22
Понимаете я выбираю группу. А глубина может быть разными. Например в Группе1 есть группа11 и группа12. А внтури группа11 есть группа группа111 и группа112 итд. И все это надо группировать точно по такой иерархии.
6 Zhuravlik
 
01.06.15
08:24
(4) Выгрузи в отладчик в дерево значений, и посмотри чего там будет.
(5) И почему условие на итог иерархии вставлено в выборке детальных записей? Если глубина иерархии - заранее неизвестна, имхо надо что-то с рекурсией мутить.
-
И вообще - зачем так морочиться, если есть СКД?..
7 Zhuravlik
 
01.06.15
08:25
*Выгрузить в отладчике результат запроса в дерево значений
8 Zhuravlik
 
01.06.15
08:27
+ Я уж не говорю про запрос в цикле...
9 Zhuravlik
 
01.06.15
08:34
Как минимум цикл убрать, первый запрос - тоже - смысла в этом всем никакого. Создать массив групп, в запросе к "РегистрНакопления.Продажи" - условие В ИЕРАРХИИ на массив групп.
-
Это вообще что-то новое:
И Продажи.Контрагент В (&СЗКонтрагенты) И Продажи.Контрагент НЕ В (&СЗИсключенныхКонтрагентов)
Почему нельзя составить один массив, и отфильтровать по вхождению?
-
Кроме того, почему запрос к физической таблице, а не виртуальной?
-
Прорешайте Радченко, пройдите бесплатный курс по СКД - думаю это самые лучшие советы, которые тут возможно дать. Код бестолковый.
10 antihacker
 
01.06.15
11:17
Ок. Пробовал так. Тже не группирует. Что делать ?


    ТабДок.НачатьАвтогруппировкуСтрок();

     //********Идем по списку НОМЕНКЛАТУР***************
    ДЛЯ КАЖДОГО СтрНоменклатура Из ЭтаФорма.СпискоНоменклатуры ЦИКЛ        
        
    
              //--Запрос на количество продаж---------------------------------
             ЗапросПродажиНоменклатур=новый запрос;
             ЗапросПродажиНоменклатур.Текст="ВЫБРАТЬ
              |Продажи.Номенклатура.Ссылка КАК СсылкаНоменклатуры,
             |Продажи.Номенклатура.Наименование КАК Наименование,
             |Продажи.Период,
             |Продажи.Количество КАК Количество
             |    ИЗ
             |РегистрНакопления.Продажи КАК Продажи ГДЕ Продажи.Номенклатура.Ссылка В ИЕРАРХИИ(&Группа) И Продажи.Контрагент В (&СЗКонтрагенты) И Продажи.Контрагент НЕ В (&СЗИсключенныхКонтрагентов) И Продажи.Период>=&ДатаНач И Продажи.Период<=&ДатаКон
             |ИТОГИ
             |    СУММА(Количество)
             |    УПОРЯДОЧИТЬ ПО
             |  Номенклатура.ЭтоГруппа ИЕРАРХИЯ,СсылкаНоменклатуры ";


                ЗапросПродажиНоменклатур.УстановитьПараметр("Группа",СтрНоменклатура.Номенклатура.Ссылка);
             ЗапросПродажиНоменклатур.УстановитьПараметр("СЗКонтрагенты",СЗКонтрагенты);
             ЗапросПродажиНоменклатур.УстановитьПараметр("СЗИсключенныхКонтрагентов",СЗИсключенныхКонтрагентов);

              ЗапросПродажиНоменклатур.УстановитьПараметр("ДатаНач",НачалоДня(ДатаНач));
              ЗапросПродажиНоменклатур.УстановитьПараметр("ДатаКон",КонецДня(ДатаКон));

             РезПродажиВсе=ЗапросПродажиНоменклатур.Выполнить();
            
              ВыборкаРезПродажиВсе = РезПродажиВсе.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

             Пока ВыборкаРезПродажиВсе.Следующий() Цикл


                    СтрокаТовара=МакетОтчета.ПолучитьОбласть("СтрокаТовара"); //    |СтолбецТовара
                    СтрокаТовара.Параметры.Товар=ВыборкаРезПродажиВсе.Наименование;
                
                    ТабДок.Вывести(СтрокаТовара, ВыборкаРезПродажиВсе.Уровень());

                


            КонецЦикла;
        //--Группировка закончено
        //-------------------------------------    
    КОНЕЦЦИКЛА;
    ТабДок.ЗакончитьАвтогруппировкуСтрок();