Имя: Пароль:
1C
 
Добавление вывода процентов в отчете на базе Универсального отчета УТ 10.3
0 animatic
 
28.08.15
16:59
Нужно добавить в этот отчет проценты, чтобы для каждого интервала выводился процент от общей суммы задолженности по контрагенту. Чет не разберусь, есть ли возможность именно в нем добавить, если добавляю в запросе, потом эти проценты суммируются по каждому полю и выводят не правильные значения. Как вообще можно добавить вывод процентов в отчетах на базе Универсального отчета.
1 animatic
 
28.08.15
16:59
*Отчет Дебиторская задолженность по срокам долга
2 Nuobu
 
28.08.15
17:03
(0) В итогах пробовал писать не сумму, а среднее?
3 animatic
 
28.08.15
17:04
(2) Пробовал, но тогда же усредненное значение будет
4 Nuobu
 
28.08.15
17:07
(3) А тебе какое нужно?
5 animatic
 
28.08.15
17:27
(4) процент по контрагенту, если выводишь договора, то по каждому договору, а со средним получается, посчитает по договорам, а потом усредненный у контрагента покажет. А если не выводить договора то сразу усредненный.
6 Nuobu
 
28.08.15
17:29
(5) То есть данные разные покажет?
7 animatic
 
28.08.15
17:30
[img]http://i.imgur.com/g1f7Y6Z.jpg[/img]
вот что выдает, чепуха какая-то получается
8 Nuobu
 
28.08.15
17:32
(7) В самом запросе правильно процент считается?
9 animatic
 
28.08.15
17:40
ТекстЗапросаПоОстаткам =
    "ВЫБРАТЬ
    |    ВзаиморасчетыПоДокументамОстатки.Организация,
    |    ВзаиморасчетыПоДокументамОстатки.Контрагент,
    |    ВзаиморасчетыПоДокументамОстатки.ДоговорКонтрагента,
    |    ВзаиморасчетыПоДокументамОстатки.Сделка,
    |    ВзаиморасчетыПоДокументамОстатки.ДокументРасчетовСКонтрагентом,
    |    ВзаиморасчетыПоДокументамОстатки.СуммаВзаиморасчетовОстаток КАК ОстатокДолга0
    |ИЗ
    |    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(
    |            &ДатаОстатков,
    |            {(Организация).* КАК Организация, (Контрагент).* КАК Контрагент, (ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка}) КАК ВзаиморасчетыПоДокументамОстатки
    |ГДЕ
    |    ВзаиморасчетыПоДокументамОстатки.СуммаВзаиморасчетовОстаток > 0
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    ВзаиморасчетыБезДокументовОстатки.Организация,
    |    ВзаиморасчетыБезДокументовОстатки.Контрагент,
    |    ВзаиморасчетыБезДокументовОстатки.ДоговорКонтрагента,
    |    ВзаиморасчетыБезДокументовОстатки.Сделка,
    |    НЕОПРЕДЕЛЕНО,
    |    ВзаиморасчетыБезДокументовОстатки.СуммаВзаиморасчетовОстаток
    |ИЗ
    |    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(
    |            &ДатаОстатков,
    |            (НЕ ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом) {(Организация).* КАК Организация, (Контрагент).* КАК Контрагент, (ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка}) КАК ВзаиморасчетыБезДокументовОстатки
    |ГДЕ
    |    ВзаиморасчетыБезДокументовОстатки.СуммаВзаиморасчетовОстаток > 0";
    
    ТекстЗапросаПоОборотам =
    "ВЫБРАТЬ
    |    ВзаиморасчетыПоДокументамОбороты.Организация,
    |    ВзаиморасчетыПоДокументамОбороты.Контрагент,
    |    ВзаиморасчетыПоДокументамОбороты.ДоговорКонтрагента,
    |    ВзаиморасчетыПоДокументамОбороты.Сделка,
    |    ВзаиморасчетыПоДокументамОбороты.ДокументРасчетовСКонтрагентом,
    |    ВЫБОР
    |        КОГДА ВзаиморасчетыПоДокументамОбороты.СуммаВзаиморасчетовПриход > 0
    |            ТОГДА ВзаиморасчетыПоДокументамОбороты.СуммаВзаиморасчетовПриход
    |        ИНАЧЕ 0
    |    КОНЕЦ - ВЫБОР
    |        КОГДА ВзаиморасчетыПоДокументамОбороты.СуммаВзаиморасчетовРасход < 0
    |            ТОГДА ВзаиморасчетыПоДокументамОбороты.СуммаВзаиморасчетовРасход
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК УвеличениеДолга1
    |ИЗ
    |    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(
    |            &НачалоИнтервала1,
    |            &КонецИнтервала1,
    |            ,
    |            {(Организация).* КАК Организация, (Контрагент).* КАК Контрагент, (ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка}) КАК ВзаиморасчетыПоДокументамОбороты
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    ВзаиморасчетыБезДокументовОбороты.Организация,
    |    ВзаиморасчетыБезДокументовОбороты.Контрагент,
    |    ВзаиморасчетыБезДокументовОбороты.ДоговорКонтрагента,
    |    ВзаиморасчетыБезДокументовОбороты.Сделка,
    |    НЕОПРЕДЕЛЕНО,
    |    ВЫБОР
    |        КОГДА ВзаиморасчетыБезДокументовОбороты.СуммаВзаиморасчетовПриход > 0
    |            ТОГДА ВзаиморасчетыБезДокументовОбороты.СуммаВзаиморасчетовПриход
    |        ИНАЧЕ 0
    |    КОНЕЦ - ВЫБОР
    |        КОГДА ВзаиморасчетыБезДокументовОбороты.СуммаВзаиморасчетовРасход < 0
    |            ТОГДА ВзаиморасчетыБезДокументовОбороты.СуммаВзаиморасчетовРасход
    |        ИНАЧЕ 0
    |    КОНЕЦ
    |ИЗ
    |    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(
    |            &НачалоИнтервала1,
    |            &КонецИнтервала1,
    |            ,
    |            (НЕ ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом)
    |            {(Организация).* КАК Организация, (Контрагент).* КАК Контрагент, (ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка}) КАК ВзаиморасчетыБезДокументовОбороты";
    
    КолИнтервалов = ТабИнтервалы.Количество();
    
    ТекстЗапросаОстатокИОбороты =
    "ВЫБРАТЬ
    |    Остатки.Организация,
    |    Остатки.Контрагент,
    |    Остатки.ДоговорКонтрагента,
    |    Остатки.Сделка,
    |    Остатки.ДокументРасчетовСКонтрагентом,
    |    Остатки.ОстатокДолга0";
    Для Ном = 1 По КолИнтервалов - 1 Цикл
        ОборотыНом = "Обороты" + Ном;
        ТекстЗапросаОстатокИОбороты = ТекстЗапросаОстатокИОбороты + ",
        |    ЕСТЬNULL(Обороты" + Ном + ".УвеличениеДолга" + Ном + ", 0) КАК УвеличениеДолга" + Ном;
    КонецЦикла;
    ТекстЗапросаОстатокИОбороты = ТекстЗапросаОстатокИОбороты + "
    |ИЗ
    |    (" + ТекстЗапросаПоОстаткам + ") КАК Остатки";
    Для Ном = 1 По КолИнтервалов - 1 Цикл
        ТекстЗапросаПоОборотамИнтервала = СтрЗаменить(ТекстЗапросаПоОборотам, "УвеличениеДолга1", "УвеличениеДолга" + Ном);
        ТекстЗапросаПоОборотамИнтервала = СтрЗаменить(ТекстЗапросаПоОборотамИнтервала, "&НачалоИнтервала1", "&НачалоИнтервала" + Ном);
        ТекстЗапросаПоОборотамИнтервала = СтрЗаменить(ТекстЗапросаПоОборотамИнтервала, "&КонецИнтервала1", "&КонецИнтервала" + Ном);
        ОборотыНом = "Обороты" + Ном;
        ТекстЗапросаОстатокИОбороты = ТекстЗапросаОстатокИОбороты + "
        |ЛЕВОЕ СОЕДИНЕНИЕ
        |    (" + ТекстЗапросаПоОборотамИнтервала + ") КАК " + ОборотыНом + "
        |    ПО
        |        Остатки.Организация = " + ОборотыНом + ".Организация
        |            И Остатки.Контрагент = " + ОборотыНом + ".Контрагент
        |            И Остатки.ДоговорКонтрагента = " + ОборотыНом + ".ДоговорКонтрагента
        |            И Остатки.Сделка = " + ОборотыНом + ".Сделка
        |            И Остатки.ДокументРасчетовСКонтрагентом = " + ОборотыНом + ".ДокументРасчетовСКонтрагентом";
    КонецЦикла;
    
    ТекстЗапросаОстаткиПоПериодам =
    "ВЫБРАТЬ
    |    ОстатокИОбороты.Организация,
    |    ОстатокИОбороты.Контрагент,
    |    ОстатокИОбороты.ДоговорКонтрагента,
    |    ОстатокИОбороты.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
    |    ОстатокИОбороты.Сделка,
    |    ОстатокИОбороты.ДокументРасчетовСКонтрагентом,
    |    ОстатокИОбороты.ОстатокДолга0";
    Для Ном = 1 По КолИнтервалов - 1 Цикл
        ВыражениеОстатка = "ОстатокИОбороты.ОстатокДолга0";
        Для й = 1 По Ном Цикл
            ВыражениеОстатка = ВыражениеОстатка + " - ОстатокИОбороты.УвеличениеДолга" + й;
        КонецЦикла;
        ТекстЗапросаОстаткиПоПериодам = ТекстЗапросаОстаткиПоПериодам + ",
        |    ВЫБОР
        |        КОГДА " + ВыражениеОстатка + " > 0
        |            ТОГДА " + ВыражениеОстатка + "
        |        ИНАЧЕ 0
        |    КОНЕЦ КАК ОстатокДолга" + Ном;
    КонецЦикла;
    ТекстЗапросаОстаткиПоПериодам = ТекстЗапросаОстаткиПоПериодам + "
    |ИЗ
    |    (" + ТекстЗапросаОстатокИОбороты + ") КАК ОстатокИОбороты";
    
    ТекстПоказателей = "
    |    ОстаткиПоПериодам.ОстатокДолга0 КАК ОстатокДолга";
    Для Ном = 1 По КолИнтервалов - 1 Цикл
        ТекстПоказателей = ТекстПоказателей + ",
        |    ОстаткиПоПериодам.ОстатокДолга" + (Ном - 1) + " - ОстаткиПоПериодам.ОстатокДолга" + Ном + " КАК ОстатокПериода" + Ном;
        
        // Добавлено
        ТекстПоказателей = ТекстПоказателей + ",
        |    (ОстаткиПоПериодам.ОстатокДолга" + (Ном - 1) + " - ОстаткиПоПериодам.ОстатокДолга" + Ном + ") * 100 /  ОстаткиПоПериодам.ОстатокДолга0 КАК ПроцентПериода" + Ном;
        // КонецДобавлено
        
    КонецЦикла;
    Если КолИнтервалов > 0 Тогда
        ТекстПоказателей = ТекстПоказателей + ",
        |    ОстаткиПоПериодам.ОстатокДолга" + (КолИнтервалов - 1) + " КАК ОстатокПериода" + КолИнтервалов;
        
        // Добавлено
        ТекстПоказателей = ТекстПоказателей + ",
        |    ОстаткиПоПериодам.ОстатокДолга" + (КолИнтервалов - 1) + " * 100 /  ОстаткиПоПериодам.ОстатокДолга0 КАК ПроцентПериода" + КолИнтервалов;
        // КонецДобавлено
        
    КонецЕсли;
    
    ТекстЗапроса =
    "ВЫБРАТЬ
    |    ОстаткиПоПериодам.Организация КАК Организация,
    |    ПРЕДСТАВЛЕНИЕ(ОстаткиПоПериодам.Организация) КАК ОрганизацияПредставление,
    |    ОстаткиПоПериодам.Контрагент КАК Контрагент,
    |    ПРЕДСТАВЛЕНИЕ(ОстаткиПоПериодам.Контрагент) КАК КонтрагентПредставление,
    |    ОстаткиПоПериодам.ДоговорКонтрагента КАК ДоговорКонтрагента,
    |    ПРЕДСТАВЛЕНИЕ(ОстаткиПоПериодам.ДоговорКонтрагента) КАК ДоговорКонтрагентаПредставление,
    |    ОстаткиПоПериодам.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
    |    ПРЕДСТАВЛЕНИЕ(ОстаткиПоПериодам.ДоговорКонтрагента.ВалютаВзаиморасчетов) КАК ВалютаВзаиморасчетовПредставление,
    |    ОстаткиПоПериодам.Сделка КАК Сделка,
    |    ПРЕДСТАВЛЕНИЕ(ОстаткиПоПериодам.Сделка) КАК СделкаПредставление,
    |    ОстаткиПоПериодам.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом,
    |    ПРЕДСТАВЛЕНИЕ(ОстаткиПоПериодам.ДокументРасчетовСКонтрагентом) КАК ДокументРасчетовСКонтрагентомПредставление,"
    + ТекстПоказателей + "
    |    //ПОЛЯ_СВОЙСТВА
    |    //ПОЛЯ_КАТЕГОРИИ
    |{ВЫБРАТЬ
    |    Организация.*,
    |    Контрагент.*,
    |    ДоговорКонтрагента.*,
    |    ВалютаВзаиморасчетов.*,
    |    Сделка.*,
    |    ДокументРасчетовСКонтрагентом.*,"
    + ТекстПоказателей + "
    |    //ПСЕВДОНИМЫ_СВОЙСТВА
    |    //ПСЕВДОНИМЫ_КАТЕГОРИИ
    |}
    |ИЗ
    |    (" + ТекстЗапросаОстаткиПоПериодам + ") КАК ОстаткиПоПериодам
    |    //СОЕДИНЕНИЯ
    |{ГДЕ"
    + ТекстПоказателей + "
    |    //УСЛОВИЯ_СВОЙСТВА
    |    //УСЛОВИЯ_КАТЕГОРИИ
    |}
    |{УПОРЯДОЧИТЬ ПО
    |    Организация.*,
    |    Контрагент.*,
    |    ДоговорКонтрагента.*,
    |    Сделка.*,
    |    ДокументРасчетовСКонтрагентом.*,
    |    ВалютаВзаиморасчетов.*,
    |    ОстатокДолга";
    Для Ном = 1 По КолИнтервалов Цикл
        ТекстЗапроса = ТекстЗапроса + ",
        |    ОстатокПериода" + Ном;
    КонецЦикла;
    ТекстЗапроса = ТекстЗапроса + "
    |    //ПСЕВДОНИМЫ_СВОЙСТВА
    |    //ПСЕВДОНИМЫ_КАТЕГОРИИ
    |}
    |ИТОГИ
    |    СУММА(ОстатокДолга)";
    Для Ном = 1 По КолИнтервалов Цикл
        ТекстЗапроса = ТекстЗапроса + ",
        |    СУММА(ОстатокПериода" + Ном + ")";
        
        // Добавлено
        ТекстЗапроса = ТекстЗапроса + ",
        |    СРЕДНЕЕ(ПроцентПериода" + Ном + ")";
        // КонецДобавлено
        
    КонецЦикла;
    ТекстЗапроса = ТекстЗапроса + "
    |    //ИТОГИ_СВОЙСТВА                  
    |    //ИТОГИ_КАТЕГОРИИ
    |ПО                        
    |    ОБЩИЕ
    |{ИТОГИ ПО
    |    Организация.*,
    |    Контрагент.*,
    |    ДоговорКонтрагента.*,
    |    Контрагент.*,
    |    Сделка.*,
    |    ДокументРасчетовСКонтрагентом.*,
    |    ВалютаВзаиморасчетов.*
    |    //ПСЕВДОНИМЫ_СВОЙСТВА
    |    //ПСЕВДОНИМЫ_КАТЕГОРИИ
    |}";
Вот что добавил в стандартном запросе этого отчета. Проблема в итогах, в среднеем, но если ставить сумма, то тоже не правильно, получается процент никак не посчитать в этом отчете.
10 animatic
 
28.08.15
17:53
есть идеи как можно реализовать данную задачу?
11 animatic
 
28.08.15
19:49
Подсмотрел в отчете по валовой прибыли. В итогах вместо Среднее или Сумма, туже формулу по получению процентов только для итогов прописал:
Для Ном = 1 По КолИнтервалов Цикл
        ТекстЗапроса = ТекстЗапроса + ",
        |    СУММА(ОстатокПериода" + Ном + ")";
        
        // Добавлено
        ТекстЗапроса = ТекстЗапроса + ",
        |    100 * ВЫБОР
        |    КОГДА СУММА(ОстатокДолга) <> 0
        |        ТОГДА (СУММА(ОстатокПериода" + Ном + ")) / СУММА(ОстатокДолга)
        |    ИНАЧЕ 0
        |КОНЕЦ КАК ПроцентПериода" + Ном;
        // КонецДобавлено
        
    КонецЦикла;

Так уже получше, но возникает проблема, когда проценты слишком маленькие за счет округления в общем 100 процентов не выходит.
12 animatic
 
28.08.15
20:02
или я уже перегрелся и нормально, так короче работает