|
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
|
Спасибо все получилось.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |