Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вывод в табличный документ. Динамическое формирование таблицы

Вывод в табличный документ. Динамическое формирование таблицы
Я
   lg2marvel
 
05.06.19 - 14:30
Добрый день. Нужна ваша помощь, 2-й день думаю как надурить судьбу и сделать все красиво. Вывожу результат следующей процедурой, но выводится не совсем корректно. Например:

                      Начисление     Премия           Итого начислено
ФизЛицо1     10000               10000 (итог)
ФизЛицо2     10000               5000                 15000 (итого)

А хотелось бы чтоб было как-то так:
                      Начисление     Премия           Итого начислено
ФизЛицо1     10000                                        10000 (итог)
ФизЛицо2     10000               5000                 15000 (итого)

Как правильнее это лучше сделать? Делать массив при заполнении шапки и потом сравнивать выводимые данные?

    ВыборкаПодразделения = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаПодразделения.Следующий() Цикл
        Если ВыборкаПодразделения.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда
            Область1 = ОбластьПодразделениеИерархия1;
            Область2 = ОбластьПодразделениеИерархия2;    
            Область3 = ОбластьПодразделениеИерархия3;
        Иначе
            Область1 = ОбластьПодразделение1;
            Область2 = ОбластьПодразделение2;
            Область3 = ОбластьПодразделение3;
        КонецЕсли;
        
        Область1.Параметры.Заполнить(ВыборкаПодразделения);
        ТабДок.Вывести(Область1, ВыборкаПодразделения.Уровень());
        
        ВыборкаФизлицо = ВыборкаПодразделения.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Пока ВыборкаФизлицо.Следующий() Цикл    
            ОбластьФизЛицо1.Параметры.Заполнить(ВыборкаФизлицо);
            ТабДок.Вывести(ОбластьФизЛицо1, ВыборкаФизлицо.Уровень());                        
            ТабДок.Присоединить(ОбластьФизЛицо2, ВыборкаФизлицо.Уровень());
            ТабДок.Присоединить(ОбластьФизЛицо3, ВыборкаФизлицо.Уровень());    
            
            ВыборкаНачисленияУдержанияИтог = ВыборкаФизлицо.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Пока ВыборкаНачисленияУдержанияИтог.Следующий() Цикл
                
                ТабДок.НачатьАвтогруппировкуКолонок();
                ВыборкаНачисленияУдержания = ВыборкаНачисленияУдержанияИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                Пока ВыборкаНачисленияУдержания.Следующий() Цикл
                    ОбластьФизЛицо4.Параметры.Сумма = ВыборкаНачисленияУдержания.СуммаНУ;    
                    ТабДок.Присоединить(ОбластьФизЛицо4, ВыборкаНачисленияУдержания.Уровень());  
                КонецЦикла;    
                ОбластьФизЛицо5.Параметры.Сумма = ВыборкаНачисленияУдержанияИтог.СуммаНУ;    
                ТабДок.Присоединить(ОбластьФизЛицо5, ВыборкаНачисленияУдержанияИтог.Уровень());    
                ТабДок.ЗакончитьАвтогруппировкуКолонок();
            КонецЦикла;
        КонецЦикла;    
    КонецЦикла;    


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

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

    Для каждого Колонка Из Построитель.ВыбранныеПоля Цикл
       Колонка.Представление = РезультатТЗ.Колонки[Колонка.Имя].Заголовок;
    КонецЦикла; 

    МакетТД = Новый ТабличныйДокумент;
    Построитель.Вывести(МакетТД);
    ОбластьТД = МакетТД.Область();
    ОбластьТД.ШиринаКолонки = 20;    
    МакетТД.ТолькоПросмотр = Истина;
    МакетТД.ФиксацияСверху = 4;
    МакетТД.ОтображатьЗаголовки = Истина;
    МакетТД.Показать();
        
КонецПроцедуры

Список тем форума
Рекламное место пустует  Рекламное место пустует
Читай всё полезное и впитывай, а нападки игнорируй. Здесь так принято. aka AMIGO
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.