Имя: Пароль:
1C
1C 7.7
v7: И опять просроченное дебетовое сальдо
0 sung82
 
28.08.11
19:28
Надо получить отчет по просроченному дебетовому сальдо по счету 62.1 на Дату, с выводом сальдо по дебету и кредиту на Дату, просрочки св.5 дней, св.10 дней, св. года. С учетом предоставленной отсрочки платежа по договору (у одного контрагента может быть несколько договоров один без отсрочки другой с отсрочкой. У 62 счета два субконто Контрагент и Основание (Договор.)Написал следующее:
Процедура Сформировать()    
   Таб = СоздатьОбъект("Таблица");
   Дат= ДатаКонца-1;
   Таб.ИсходнаяТаблица("Таблица");
   Таб.ВывестиСекцию("Шапка");
   Таб.ПовторятьПриПечатиСтроки(3,4);    
   Таб.Опции(0,0,0,0);
   Таб.ТолькоПросмотр(1);
   ТЗ  = СоздатьОбъект("ТаблицаЗначений");
   ТЗ.НоваяКолонка("Контр","Справочник.Контрагенты");
   ТЗ.НоваяКолонка("СальдоД","Число");
   ТЗ.НоваяКолонка("СальдоК","Число");
   ТЗ.НоваяКолонка("Код","Число");
   ТЗ.НоваяКолонка("ПятьД","Число");
   ТЗ.НоваяКолонка("ПятьК","Число");
   ТЗ.НоваяКолонка("ДесятьД","Число");
   ТЗ.НоваяКолонка("ДесятьК","Число");
   ТЗ.НоваяКолонка("ГодД","Число");
   ТЗ.НоваяКолонка("ГодК","Число");
   ТЗ.НоваяКолонка("Дог");
   ТЗ.НоваяКолонка("ДоговорОтгрузки","Число");
   БИ  = СоздатьОбъект("БухгалтерскиеИтоги");    
   БИ.ИспользоватьСубконто(ВидыСубконто.Контрагенты,Контрагент);
   БИ.ИспользоватьСубконто(ВидыСубконто.Основание);
   Счет  = СчетПоКоду("62.1");
   БИ.ВыполнитьЗапрос(Дат,Дат,Счет,,,,,);    
   Ном=0;
   БИ.ВыбратьСчета(1);
   Пока БИ.ПолучитьСчет()=1 Цикл        
       Би.ВыбратьСубконто(2);
       Пока БИ.ПолучитьСубконто(2)=1 Цикл
           БИ.ВыбратьСубконто(1);
           Пока Би.ПолучитьСубконто(1)=1 Цикл                
               ТЗ.НоваяСтрока();                
               ТЗ.Контр = БИ.Субконто(1);
               ТЗ.Дог = БИ.Субконто(2);
               ТЗ.Код   = БИ.Субконто(1).Код;
               ТЗ.СальдоД = БИ.СКД();
               ТЗ.СальдоК = БИ.СКК();                
               ТЗ.ДоговорОтгрузки = БИ.Субконто(2).ЧерезДней;                            
           КонецЦикла;
       КонецЦикла;
   КонецЦикла;
   Тз.ВыбратьСтроки();    
   ТЗ.Сортировать("Код");
   Пока ТЗ.ПолучитьСтроку()=1 Цикл
       Если (ТЗ.СальдоД>0) и (Би.СНД()>Би.КО()) Тогда
           Би5 = СоздатьОбъект("БухгалтерскиеИтоги");
           Би5.ИспользоватьСубконто(ВидыСубконто.Контрагенты,Контрагент);
           Би5.ИспользоватьСубконто(ВидыСубконто.Основание);
           Би5.ВыполнитьЗапрос(Дат-ТЗ.Дог.ЧерезДней,Дат-ТЗ.Дог.ЧерезДней,Счет,,,,,);
           Би5.ВыбратьСчета(1);
           Пока Би5.ПолучитьСчет()=1 Цикл        
               Би5.ВыбратьСубконто(2);
               Пока Би5.ПолучитьСубконто(2)=1 Цикл
                   /Би5.ВыбратьСубконто(1);
                   Пока Би5.ПолучитьСубконто(1)=1 Цикл                                
                       ТЗ.ПятьД = Би5.СНД();                        
                   КонецЦикла;
               КонецЦикла;                    
           КонецЦикла;
           Ном=Ном+1;
           Таб.ВывестиСекцию("Строка");
       КонецЕсли;        
   КонецЦикла;    
   Таб.ВывестиСекцию("Подвал");
   Таб.Показать("Таблица","");
КонецПроцедуры
При формировании отчета одному Контрагенту получается, когда по всем Сальдо начальное правильное, а просроченное выдает для всех значение последнего. Что не так сделал, подскажите, пожалуйста.
1 Темный Эльф
 
28.08.11
19:41
1. У тебя второй запрос выполняется по всем договорам/контрагентам, а не по тем, что в текущей строке ТЗ.
2. У тебя запрос в цикле, т.е. бухгалтерия выпьет весь чай в городе, пока отчет сформируется. Все можно сделать одним запросом.
3. Сальдо, которое было пять дней назад - это не просроченный долг. Просрочка считается иначе.
4 Условие (Би.СНД()>Би.КО()) обращается к общим цифрам по запросу, а не по конкретному контрагенту/договору, оно не в том месте.
2 sung82
 
28.08.11
20:01
А как иначе ситается просрочка?
3 Темный Эльф
 
28.08.11
20:05
(2)Я обычно делаю запрос в разрезе организаций/договоров и документов, беру сальдо на количество дней просрочки назад отнимаю от него оплаты до текущего дня, учитываю возвраты, которые, хоть и проходят по той же корреспонденции, что и отгрузка (по крайне мере у нас), но зачитываются как оплата и получаю собственно сумму просроченного долга. Можно еще так, как в ТиС, но это конфигурацию курочить надо и за последовательностью следить.
4 sung82
 
28.08.11
20:11
Получается, что я не учел кредитовый оборот по счету на дату просрочки? Который надо отнять.
5 Темный Эльф
 
28.08.11
20:14
(4)И это тоже.
6 sung82
 
28.08.11
20:15
А что еще?
7 sung82
 
28.08.11
20:18
И как должен выглядеть мой код с учетом твоих замечаний? Если не сложно.
8 Темный Эльф
 
28.08.11
20:20
(6)См (1) и (3)
(7)Извини, сам. Я бы переписал твой код полностью, не сочти за обиду.
9 sung82
 
28.08.11
20:26
Ни какой обиды самому интересно разобраться.
Получается надо выбрирать все операции со счетом 62? Что б получить документ.
10 Темный Эльф
 
28.08.11
20:29
(9)У метода ВыполнитьЗапрос есть предпоследний параметр, в котором пишешь "Операция" или "День", хочешь ты видеть по дням или по документам. Ну и затем методы ВыбратьПериоды, ПолучитьПериод. В ЖКК про это все написано, да и в СП тоже.
11 sung82
 
28.08.11
20:38
БИ.ВыполнитьЗапрос(Дат,Дат,Счет,,,3,"Проводка","С");
12 Темный Эльф
 
28.08.11
20:42
(11)Это уже очень детально. Достаточно детализации до документов ("Операция"), или, если большое количество документов в день, то и до дня ("День"). Чем больше детализация периода, тем дольше будет выполняться цикл по периодам, а мы боремся за быстро формирующиеся отчеты. :)
13 GreyK
 
28.08.11
20:44
(0) Во первых процедуру запроса можно создать одну.
Во вторых эту процедуру, можно вызывать много раз, пока или закончатся периоды запросо, или долги контров.
Принцип надеюсь понятен?
14 sung82
 
28.08.11
20:52
Далее
БИ.ВыбратьСубконто(ВидыСубконто.Контрагенты,0,0,,1);
Пока БИ.ПолучитьСубконто(ВидыСубконто.Контрагенты) =1 Цикл
ТекКонтрагент=БИ.Субконто(ВидыСубконто.Контрагенты);
       // Общая Задолженность
       ТекСКДПоКонтрагенту=БИ.СКДРС("С");
       ТекСККПоКонтрагенту=БИ.СККРС("С");        
       Тз.НоваяСтрока();        
       ТЗ.СальдоД=ТекСКДПоКонтрагенту;
       ТЗ.СальдоК=ТекСККПоКонтрагенту;
       
       БИ.ВыбратьСубконто(ВидыСубконто.Основание);
       Пока БИ.ПолучитьСубконто(ВидыСубконто.Основание)=1 Цикл
           ТекДоговор=БИ.Субконто(ВидыСубконто.Основание);
           
           ПерваяОтгрузкаПоДоговору=0;
           ТекСальдоОплатПоДоговору=БИ.СНК("С");
           
           БИ.ВыбратьПериоды();
           Пока БИ.ПолучитьПериод()=1 Цикл
?
15 Темный Эльф
 
28.08.11
21:18
(14)Сначала нужно получить сальдо на текущую дату минус срок просрочки. Для этого спозиционироваться на эту дату (если периодичность "День") или первый документ на/после этой даты. Можно просто сравнением дат в цикле. Выражение Би.Начдата в цикле по периодам даст тебе текущую дату выборки, а би.операция.документ - текущий документ.
16 sung82
 
29.08.11
16:55
Спасибо все получилось.