Имя: Пароль:
1C
1C 7.7
v7: Бухгалтерские Итоги и Таблица Значений и Таблица Отчета
0 tuno4er
 
21.09.12
15:56
тз.ВыбратьСтроки();    
        Таб.ВывестиСекцию("Шапк|Цел_Назн");  
           ДатаД = НачДата;  
           
           Пока ДатаД <= КонДата Цикл
            Таб.ПрисоединитьСекцию("Шапк|Дата");
            ДатаД = ДатаД+1;
           КонецЦикла;
         
           Пока тз.ПолучитьСтроку() = 1 Цикл
               ДатаД = НачДата;
               Таб.ВывестиСекцию("Секция_1|Цел_Назн");
               Строчка = тз.НомерСтроки;
               Пока ДатаД <= КонДата Цикл
                   
                   Ит1=СоздатьОбъект("БухгалтерскиеИтоги");
                     Ит1.ИспользоватьПланСчетов(Константа.ПланСчетов_Бухгалтерия);
                     Ит1.ИспользоватьСубконто(ВидыСубконто.ЦелевоеНазначение, Статьи,1);
                   Ит1.ВыполнитьЗапрос( ДатаД, ДатаД, Константа._311,,,1,"Операция");
                   Ит1.ВыбратьСубконто(1);    
                   
                   Пока Ит1.ПолучитьСубконто(1) = 1 Цикл
                           текЦелНазн = Ит1.Субконто(1);
                           Если тз.ЦелНазн = текЦелНазн Тогда
                               тз.УстановитьЗначение(Строчка,"ДО", ит1.ДО("С"));
                               тз.УстановитьЗначение(Строчка,"КО", ит1.КО("С"));
                               Таб.ПрисоединитьСекцию("Секция_1|Дата");
                           Иначе                        
                               Продолжить;
                           КонецЕсли;
                       
                       КонецЦикла;                                
                       
                   ДатаД = ДатаД+1;
                 КонецЦикла;
                     

             КонецЦикла;
1 tuno4er
 
21.09.12
16:00
Имеется такой код.
Есть Целевые назначения, он должен расскидывать сумму оборота за день на каждое целевое назначение. Но в тех местах где у меня не было оборота либо за день либо за текущее целевое назначение, он мне ничего не ставит, но когда в следующей дате есть оборототы по этому целевому назначению, он мне их клеит влево, на предыдущую дату. Подскажите что мне сделать чо бы он в случае, если не было оборот ставил просто 0 или просто вставлял пустую ячейку.
2 BlackSeaCat
 
21.09.12
18:33
За ВыполнитьЗапрос() внутри двойного цикла  - расстреливать из реактивного г...вномета.
3 vladko
 
21.09.12
18:42
код конечно ужастный по алгоритмике, но в этом случае просто вставь как вариант признак, что был или нет вывод значения по статье:
Ит1.ВыбратьСубконто(1);    
БылВывод = 0;                    
                   Пока Ит1.ПолучитьСубконто(1) = 1 Цикл
                           текЦелНазн = Ит1.Субконто(1);
                           Если тз.ЦелНазн = текЦелНазн Тогда
                               тз.УстановитьЗначение(Строчка,"ДО", ит1.ДО("С"));
                                тз.УстановитьЗначение(Строчка,"КО", ит1.КО("С"));
                                Таб.ПрисоединитьСекцию("Секция_1|Дата");
БылВывод = 1;
                            Иначе                        
                                Продолжить;
                            КонецЕсли;
                       
                       КонецЦикла;
Если БылВывод = 0 тогда
Таб.ПрисоединитьСекцию("Секция_1|Дата");
КонецЕсли;

ДатаД = ДатаД+1;
4 Zhuravlik
 
21.09.12
21:13
А еще лучше перепиши)



спЦелНазн = СоздатьОбъект("СписокЗначений");
тз.Выгрузить(спЦелНазн,,, "тз.ЦелНазн");

Ит1=СоздатьОбъект("БухгалтерскиеИтоги");
Ит1.ИспользоватьПланСчетов(Константа.ПланСчетов_Бухгалтерия);
Ит1.ИспользоватьСубконто(ВидыСубконто.ЦелевоеНазначение, спЦелНазн, 2);
Ит1.ВыполнитьЗапрос( НачДата, КонДата, Константа._311,,,1,"Операция");
   Ит1.ВыбратьСубконто(1);
   Пока ИТ1.ПолучитьСубконто(1) = 1 Цикл
      текЦелНазн = Ит1.Субконто(1);
      нс = 0;
      Если тз.НайтиЗначение(текЦелНазн, нс, "ЦелНазн") = 1 Тогда
          тз.ПолучитьСтрокуПоНомеру(нс);
          тз.ДО = ИТ1.ДО();
      Иначе Продолжить;
      КонецЕсли;
      Таб.ВывестиСекцию("Секция_1|Цел_Назн");
     
      ИТ1.ВыбратьПериоды();
      Пока ИТ1.ПолучитьПериод() = 1 Цикл
        ДатаД = ИТ1.Документ.ДатаДок;
        Таб.ПрисоединитьСекцию("Секция_1|Дата");

      КонецЦикла;
   КонецЦикла;



Как-то так, если я правильно понял задачу.
5 Zhuravlik
 
21.09.12
21:14
тз.НайтиЗначение(текЦелНазн, нс, "ЦелНазн") - можно и без если, он его по-любому найдет)) Писал наспех.
6 BlackSeaCat
 
21.09.12
21:53
(4) Тоже мне, переписывальщик... становись рядом с автором!

1. Нафейхоа делать запрос с периодичностью "Операция", если явно нужны общие цифры за день? О существовании периодичности "День" вообще в курсе?

2. Зачем перебирать все субконто для каждой строки ТЗ, если можно одной строкой просто обратиться к нужному:

Если Ит1.ПолучитьСубконто(1,,тз.ЦелНазн)=1 Тогда
// выводим горизонтальную секцию
КонецЕсли;

Код принципиально писать не буду, нафиг не нужно.
7 Zhuravlik
 
21.09.12
22:13
(7) Да я и не стремился ничего переписывать, это задача для ТС. Просто показал как можно обойтись без вложенных циклов.
8 tuno4er
 
24.09.12
12:16
В ТЗ берутся данные со справочника, получается в строковом виде.
Если делать вот так - Ит1.ПолучитьСубконто(1,,тз.ЦелНазн)=1, то вообще ничего не выбирается.
Ошибка? Это не ошибка, это системная функция.