8.х Волшебный цикл

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем ste4kin48455, 9 фев 2016.

  1. TopicStarter Overlay
    ste4kin48455
    Offline

    ste4kin48455 Опытный в 1С

    Регистрация:
    15 дек 2014
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    Всем доброго. Формируется табличный документ с подекадными (за каждые 10 дней периода) приходами и расходами, и с суммами приходов и расходов за все декады по каждому товару. Приложен скрин с текущим результатом.

    Дальше происходит магия. Колонка с суммами приходов за все декады считается корректно по всей таблице. Колонку сумм расходов считает точно такой же код с теми же самыми процедурами, но суммы во всех строках умножаются (насколько я понял по экспериментам) на количество декад. Такое чувство, что в дело включается цикл, который при расчете сумм расходов пробегает этот процесс количество итераций, равное количеству декад. Но магия №2 в том, что этого цикла в коде нет

    Собственно:
    Код:
        ТЗСум = новый ТаблицаЗначений;
        ТЗСум.Колонки.Добавить("итогПриход");
        ТЗСум.Колонки.Добавить("ИтогРасход");
       
        для н=0 по ТЗ.количество()-1 цикл
            стр=ТЗСум.Добавить();
            стр.итогПриход = 0;
            стр.итогРасход = 0;
        КонецЦикла;
           
        для н = 1 по колДек цикл
            конПер = начПер + декада;
            ТЗдек = ЗапросОборотов(начПер, конПер);
                                               
            ТЗприх = выгрузитьКолонкуТЗВОтдельнуюТЗ(ТЗдек, 0, "приход");
           
            для к1=0 По ТЗПрих.количество()-1 цикл
                ТЗСум[к1].ИтогПриход = ТЗСум[к1].итогПриход + ТЗПрих[к1].приход;
            КонецЦикла;
                   
            ТДприх = получитьТДИзТЗ(ТЗдек, "приход");
           
            ТабДок.присоединить(ТДприх);
           
            ТЗрасх = выгрузитьКолонкуТЗВОтдельнуюТЗ(ТЗ, 1, "расход");
           
            для к2=0 По ТЗРасх.количество()-1 цикл
                ТЗСум[к2].итогРасход = ТЗСум[к2].итогРасход + ТЗРасх[к2].расход;
            КонецЦикла;
           
            ТДрасх = получитьТДИзТЗ(ТЗдек, "расход");
           
            ТабДок.присоединить(ТДрасх);       
           
            начПер = конПер;       
        КонецЦикла;
       
        ТЗСумПрих = выгрузитьКолонкуТЗВОтдельнуюТЗ(ТЗСум, 0, "итогПриход");
        ТДСумПрих = получитьТДИзТЗ(ТЗСумПрих, "ИтогПриход");
        ТабДок.присоединить(ТДСумПрих);
       
        ТЗСумРасх = выгрузитьКолонкуТЗВОтдельнуюТЗ(ТЗСум, 1, "итогРасход");
        ТДСумРасх = получитьТДИзТЗ(ТЗСумРасх, "ИтогРасход");
        ТабДок.присоединить(ТДСумРасх);
    Участвующие функции:
    Код:
    функция выгрузитьКолонкуТЗВОтдельнуюТЗ(ТЗ, ИндексКолонки, ИмяКолонки)
        Мас = ТЗ.выгрузитьКолонку(ИндексКолонки);
        ТЗКол = новый ТаблицаЗначений;
        кол = ТЗКол.колонки.Добавить(ИмяКолонки);
    
        для н=0 по мас.количество()-1 цикл
            стр = ТЗКол.Добавить();
            если имяКолонки = "товар" тогда
                стр.товар = мас[н];
            иначеЕсли имяКолонки = "приход" тогда
                стр.приход = мас[н];                       
            иначеЕсли имяКолонки = "расход" тогда
                стр.расход = мас[н];
            иначеЕсли имяКолонки = "итогПриход" тогда
                стр.ИтогПриход = мас[н];
            иначеЕсли имяКолонки = "итогРасход" тогда
                стр.ИтогРасход = мас[н];           
            КонецЕсли;       
        КонецЦикла;
       
        возврат ТЗКол;
    КонецФункции
    Код:
    функция получитьТДИзТЗ(ТЗ, имяКолонки)
        ТД = новый ТабличныйДокумент;
        макет = ЭтотОбъект.ПолучитьМакет("Макет");
       
        для каждого стр из ТЗ цикл
            область = макет.ПолучитьОбласть("строка|" + имяКолонки);
            область.Параметры.заполнить(стр);
            ТД.Вывести(Область);
        КонецЦикла;
       
        возврат ТД;
    КонецФункции

    Вложения:

  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    А значения переменных обнуляете при пересчетах ?
  3. TopicStarter Overlay
    ste4kin48455
    Offline

    ste4kin48455 Опытный в 1С

    Регистрация:
    15 дек 2014
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    попробовал пообнулять переменные -итераторы в конце процедур и функций - не помогло, да и врятли поможет. в процедурах все итераторы с разными именами. одинаковые встречаются только в функциях, но там, как я понимаю, обнулять смысла нет, так как за пределы функции выходит только возвращаемое значение, и при каждом заходе в функцию, например, цикл Для н=0 По ТЗ.Количество()-1 начинается с 0
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Отладчиком прогоните пошагово, думаю, прояснится.
  5. TopicStarter Overlay
    ste4kin48455
    Offline

    ste4kin48455 Опытный в 1С

    Регистрация:
    15 дек 2014
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    йес! исправил. в первом куске кода:
    Код:
    ТЗприх = выгрузитьКолонкуТЗВОтдельнуюТЗ(ТЗдек, 0, "приход");
    
    НО
    
    ТЗрасх = выгрузитьКолонкуТЗВОтдельнуюТЗ(!!!ТЗ!!!, 1, "расход");
    
    то есть в ТЗПрих выгружалась колонка из ТЗ с результатами запроса по данной декаде, а в ТЗрасх - колонка из ТЗ с запросом на обороты за весь период (не спрашивайте, зачем нужна эта ТЗ, пока руки не дошли переделать)

Поделиться этой страницей