Дебиторская задолженность.

1. jeniks 02.12.16 15:40 Сейчас в теме
Имеется отчет "Дебиторская задолженность" который не формирует данные. Ошибка
БИ.ИспользоватьСубконто(ВидыСубконто.Договоры,,1);			
{C:\NN\ДЕБИТОРСКАЯ ЗАДОЛЖЕННОСТЬ.ERT(70)}: Поле агрегатного объекта не обнаружено (Договоры)

Сам отчет.

Перем МинДата;//минимальная дата поиска документов
Перем Таб;                  
Перем ПервыйПоказан;
Перем БИ;
Перем СуммаДока;
Перем СумПросроч;
Перем ДокВсего;
Перем СумСФ;
Перем Сум1,Сум2,Сум3,Сум4,Сум5;
Перем СписДоков;
Перем ПоГруппе;

//---------------------------------------------------------------------------

Процедура ПриОткрытии()
	ПоГруппе = 0;
	Глубина = 6;
	Дата1 = ТекущаяДата();
	СписДоков = СоздатьОбъект("СписокЗначений");
	Дебит1 = 1;
КонецПроцедуры //ПриОткрытии


//---------------------------------------------------------------------------
Процедура Сформировать()
	Перем Непоказывать;
	
	ТЗДолг = СоздатьОбъект("ТаблицаЗначений");
	ТЗДолг.НоваяКолонка("Дата");
	ТЗДолг.НоваяКолонка("Сумма");
	ТЗДолг.НоваяКолонка("Оборот");
	ТЗК = СоздатьОбъект("ТаблицаЗначений");	
	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	ТЗ.НоваяКолонка("Контрагент");
	ТЗ.НоваяКолонка("Договор");
	ТЗ.НоваяКолонка("Дата"); //дата возникновения задолженности
	ТЗ.НоваяКолонка("Срок"); //всего долг	
	ТЗ.НоваяКолонка("Сумма"); //всего долг
	ТЗ.НоваяКолонка("Сумма2"); //2 мес
	ТЗ.НоваяКолонка("Сумма4"); // 4 мес	                            
	ТЗ.НоваяКолонка("Сумма6"); // 6 мес
	ТЗ.НоваяКолонка("Сумма12"); // год	
	ТЗ.НоваяКолонка("СуммаРаньше"); // год	
	ТЗ.НоваяКолонка("Сумма1"); // год	
	
	//Дата2 = ДобавитьМЕсяц(Дата1,-2)+1;
	//Дата4 = ДобавитьМЕсяц(Дата1,-4)+1;
	//Дата6 = ДобавитьМЕсяц(Дата1,-6)+1;	
	//Дата12 = ДобавитьМЕсяц(Дата1,-12)+1;	                       
	Если Дебит1 = 1 Тогда
		НазваниеОтчета = "Отчет о дебиторской задолженности на "+Дата1;
	ИНаче                                                          
		НазваниеОтчета = "Отчет о кредиторской задолженности на "+Дата1;	
	Конецесли;

	Таб = СоздатьОбъект("Таблица");
	Таб.ИсходнаяТаблица("Таблица");
	Таб.Опции(0, 0, 6, 0);
    Таб.ВывестиСекцию("Шапка");	
	БИ = СоздатьОбъект("БухгалтерскиеИтоги");	                  
	Если ВыбКонтрагент.Выбран() = 1 Тогда
		БИ.ИспользоватьСубконто(ВидыСубконто.Контрагенты,ВыбКонтрагент,1);
	Иначе
		БИ.ИспользоватьСубконто(ВидыСубконто.Контрагенты,,1);		
	Конецесли;
	БИ.ИспользоватьСубконто(ВидыСубконто.Договоры,,1);			
	Если Дебит1 = 1 Тогда
		БИ.ВыполнитьЗапрос("01.01.01",Дата1,"62",,, 1, "Проводка", "С");
	ИНаче                                                          
		БИ.ВыполнитьЗапрос("01.01.01",Дата1,"60",,, 1, "Проводка", "С");
	Конецесли;
	

	БИ.ВыбратьСубконто(1);
	Пока БИ.ПолучитьСубконто(1) = 1 Цикл       		
		Если Дебит1 = 1 Тогда
			Сумма = БИ.СКД();		
		ИНаче                                                          
			Сумма = БИ.СКК();		
		Конецесли;
		
		Если не (Сумма>0) Тогда
			Продолжить;
		КонецЕсли;                             
		Состояние(БИ.Субконто(1));
		Попытка 
			СрокОплаты = БИ.Субконто(1).СрокОплаты;
		Исключение
			СрокОплаты = ВыбДнейПросрочки;
		КонецПопытки;
		Дата2 = Дата1-60+1-СрокОплаты;
		Дата4 = Дата1-120+1-СрокОплаты;
		Дата6 = Дата1-180+1-СрокОплаты;
		Дата12 = Дата1-365+1-СрокОплаты;
		
		Если СрокОплаты = 0 Тогда
			СрокОплаты = 30;
		Конецесли;
		БИ.ВыбратьСубконто(2);
		Пока БИ.ПолучитьСубконто(2) = 1 Цикл
			Сумма2 = 0;			
			Сумма4 = 0;
			Сумма6 = 0;
			Сумма12 = 0;
			СуммаРаньше = 0;
			Сумма1 = 0;			
			Если Дебит1 = 1 Тогда
				Сумма = БИ.СКД()-БИ.СКК();
			ИНаче                                                          
				Сумма = БИ.СКК()-БИ.СКД();
			Конецесли;
			
			Если Сумма > 0 Тогда 	
	        	Сообщить(""+БИ.Субконто(1)+" "+БИ.Субконто(2)+" "+Сумма);					
			Иначе
				Продолжить;
			КонецЕсли;       
             
			//определим долги по периодам
			БИ.ВыбратьПериоды(1,,,);	
			ТЗДолг.УдалитьСтроки();			
			Пока БИ.ПолучитьПериод(,) = 1 Цикл
				Опер = БИ.Операция;		
				Если (Лев(Опер.Дебет.Счет,2) = "62") и (Лев(Опер.Кредит.Счет,2)="62")  Тогда				
					Продолжить;
				Конецесли;
				Если (Лев(Опер.Дебет.Счет,2) = "60") и (Лев(Опер.Кредит.Счет,2)="60")  Тогда				
					Продолжить;
				Конецесли;
				
				ТЗДолг.НоваяСтрока();
				ТЗДолг.Дата = Опер.ДатаОперации;                        				
				Если Дебит1 = 1 Тогда
					Если (Лев(Опер.Дебет.Счет,2) = "62") Тогда
						ТЗДолг.Оборот = Опер.Сумма;																		
					Иначе                                                                           
						ТЗДолг.Оборот = Опер.Сумма*(-1);																							
					Конецесли;
					ТЗДолг.Сумма = БИ.СКД()-БИ.СКК();				
				ИНаче                                                          
					Если (Лев(Опер.Кредит.Счет,2) = "60") Тогда
						ТЗДолг.Оборот = Опер.Сумма;	//увеличение долга																	
					Иначе                                                                           
						ТЗДолг.Оборот = Опер.Сумма*(-1);// уменьшение долга
					Конецесли;
					ТЗДолг.Сумма = БИ.СКК()-БИ.СКД();				
				Конецесли;
				
			КонецЦикла;                     
			
			//обработка периодов			
			_Строк = ТЗДолг.КоличествоСтрок();
			Если _Строк > 0 Тогда
				Для Сч = 1 по _Строк Цикл
					ТЗдолг.ПолучитьСтрокуПоНомеру(_Строк-Сч+1);										
					РазницаДней = Дата1 - ТЗдолг.Дата;
					Если ТЗдолг.Сумма <= 0 Тогда                 
						Прервать;            
					Конецесли;                                   
					Если (ТЗдолг.Дата < Дата12) Тогда //просрочка 12 месяца
						Если СуммаРаньше = 0 Тогда
							СуммаРаньше = ТЗдолг.Сумма;
						Конецесли;
					ИначеЕсли (ТЗдолг.Дата < Дата6)  Тогда //просрочка 6 месяцев
						Если Сумма12 = 0 Тогда
							Сумма12 = ТЗдолг.Сумма;
						Конецесли;
					ИначеЕсли (ТЗдолг.Дата < Дата4)  Тогда 
						Если Сумма6 = 0 Тогда
							Сумма6 = ТЗдолг.Сумма;
						Конецесли;
					ИначеЕсли (ТЗдолг.Дата < Дата2)  Тогда
						Если Сумма4= 0 Тогда
							Сумма4= ТЗдолг.Сумма;
						Конецесли;
					ИначеЕсли (ТЗдолг.Дата < Дата1-СрокОплаты+1) Тогда
						Если Сумма2= 0 Тогда
							Сумма2= ТЗдолг.Сумма;
						Конецесли;
					КонецЕсли;	
										
					ДатаНачала = ТЗдолг.Дата;   
				КонецЦикла;
			КонецЕсли;                              
			//Проверка по периодам
			//выравнивание
            Сп = СоздатьОбъект("СписокЗначений");
			Сп.ДобавитьЗначение(Сумма2);			
			Сп.ДобавитьЗначение(Сумма4);			
			Сп.ДобавитьЗначение(Сумма6);			
			Сп.ДобавитьЗначение(Сумма12);			
			Сп.ДобавитьЗначение(СуммаРаньше);		
			РазмерСписка = Сп.РазмерСписка();
			
			//ищем непустой минимум
			Минимум = Сумма;
			Индекс1 = 1;
			Индекс2 = 1;								
			Для Сч = 1 По РазмерСписка Цикл  
				П = Сп.ПолучитьЗначение(Сч);
				Если (П>0) Тогда				
					Если (Минимум>П) Тогда
						Минимум = П;
						Индекс1 = Сч; //запоминаем позицию минимума                    
//						Сообщить(""+Минимум+" "+Индекс1);
					КонецеслИ;					
					Индекс2 = Сч;													
				КонецеслИ;
			КонецЦикла;
			Если Минимум = Сумма Тогда //старые долги  
				Сп.УстановитьЗначение(Индекс2,Минимум);				
				Для Сч = 1 По Индекс2-1 Цикл  
					Сп.УстановитьЗначение(Сч,0);
				КонецЦикла;
			Иначе
				//сокращаем модули идем в обратном порядке
				Cч = РазмерСписка;
				Пока Cч>0 Цикл
					П = Сп.ПолучитьЗначение(Cч); //последний		
					Если Cч=Индекс2 Тогда
						Сп.УстановитьЗначение(Cч,Минимум);						
					ИначеЕсли Сч>=Индекс1 Тогда
						Сп.УстановитьЗначение(Cч,0);						
					Иначе						
						Если П>Минимум Тогда 
							Разница = П-Минимум;
							Сп.УстановитьЗначение(Сч,Разница);
							Минимум = Минимум+Разница;
						КонецеслИ;					
					КонецеслИ;					         				
					Cч = Cч-1;
				КонецЦикла;               
			Конецесли;

			ТЗ.НоваяСтрока();
			ТЗ.Контрагент = БИ.Субконто(1);
			ТЗ.Договор = БИ.Субконто(2);			
			ТЗ.Дата = ДатаНачала;
			ТЗ.Сумма = Сумма;
			ТЗ.Срок = СрокОплаты;
			ТЗ.Сумма2 = Сп.ПолучитьЗначение(1);
			ТЗ.Сумма4 = Сп.ПолучитьЗначение(2);
			ТЗ.Сумма6 = Сп.ПолучитьЗначение(3);
			ТЗ.Сумма12 = Сп.ПолучитьЗначение(4);
			ТЗ.СуммаРаньше = Сп.ПолучитьЗначение(5);
			ТЗ.Сумма1 = Сумма - ТЗ.Сумма2-ТЗ.Сумма4-ТЗ.Сумма6 - ТЗ.Сумма12-ТЗ.СуммаРаньше;
		КонецЦикла;			
	КонецЦикла;
	ТЗ.Выгрузить(ТЗК);
	ТЗК.Свернуть("Контрагент","Сумма1,Сумма2,Сумма4,Сумма6,Сумма12,СуммаРаньше,Сумма");
	
	ТЗ.ВыбратьСтроки();
	Контр = ПолучитьПустоеЗначение("");
	Пока ТЗ.ПолучитьСтроку() = 1 Цикл
		Если Контр<>ТЗ.Контрагент Тогда
		 	Контр = ТЗ.Контрагент;        
		 	Стр = 0;
		 	ТЗК.НайтиЗначение(Контр,Стр,"Контрагент");
		 	ТЗК.ПолучитьСтрокуПоНомеру(Стр);
			Таб.ВывестиСекцию("Контрагент");		 	
		Конецесли;                                     
		Таб.ВывестиСекцию("Договор");
	КонецЦикла;
	
	Таб.ВывестиСекцию("Подвал");
	Таб.ТолькоПросмотр(1);   
			
	Таб.Показать(НазваниеОтчета, "");  		
КонецПроцедуры //СформироватьПоКонтре
Показать


В чем может быть проблема?
По теме из базы знаний
Найденные решения
8. teller 07.12.16 16:22 Сейчас в теме
(7) правильно
посмотри только реквизит СрокОплаты;
есть ли на 1-м субконто, какой смысл имеет этот фрагмент кода:
        
Попытка 
            СрокОплаты = БИ.Субконто(1).СрокОплаты;
        Исключение
            СрокОплаты = ВыбДнейПросрочки;
КонецПопытки;


пс.
Состояние(БИ.Субконто(1)); - вывод сообщения внизу окна, его правильно после БИ.ПолучитьСубконто(1) выводить

пспс
пройдись отладчиком по ходу выполнения
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. teller 02.12.16 15:53 Сейчас в теме
на первый взгляд неожиданно, а что отладчик скажет на ВидыСубконто.Договоры в строке БИ.ИспользоватьСубконто(ВидыСубконто.Договоры,,1) ?
7. jeniks 07.12.16 14:11 Сейчас в теме
	БИ.ВыбратьСубконто(2);
		Пока БИ.ПолучитьСубконто(2) = 1 Цикл
			Сумма2 = 0;			
			Сумма4 = 0;
			Сумма6 = 0;
			Сумма12 = 0;
			СуммаРаньше = 0;
			Сумма1 = 0;	
			
			Если не (Сумма>0) Тогда
			Продолжить;
		КонецЕсли;                             
	Состояние(БИ.Субконто(1));
		Попытка 
			СрокОплаты = БИ.Субконто(1).СрокОплаты;
		Исключение
			СрокОплаты = ВыбДнейПросрочки;
		КонецПопытки;
	
		Дата2 = Дата1-60+1-СрокОплаты;
		Дата4 = Дата1-120+1-СрокОплаты;
		Дата6 = Дата1-180+1-СрокОплаты;
		Дата12 = Дата1-365+1-СрокОплаты;
		
		Если СрокОплаты = 0 Тогда
			СрокОплаты = 30;
		Конецесли;
			
			
			
			Если Дебит1 = 1 Тогда
				Сумма = БИ.СКД()-БИ.СКК();
			ИНаче                                                          
				Сумма = БИ.СКК()-БИ.СКД();
			Конецесли;
Показать

Правильно я понял?
8. teller 07.12.16 16:22 Сейчас в теме
(7) правильно
посмотри только реквизит СрокОплаты;
есть ли на 1-м субконто, какой смысл имеет этот фрагмент кода:
        
Попытка 
            СрокОплаты = БИ.Субконто(1).СрокОплаты;
        Исключение
            СрокОплаты = ВыбДнейПросрочки;
КонецПопытки;


пс.
Состояние(БИ.Субконто(1)); - вывод сообщения внизу окна, его правильно после БИ.ПолучитьСубконто(1) выводить

пспс
пройдись отладчиком по ходу выполнения
11. falcon 09.12.16 00:15 Сейчас в теме
(7)
сначала добавить к датам срокоплаты, а только потом проверить срок на равенство нулю... это такой тактический ход?

Если не (Сумма>0) - читаемый код, не твой конек ))

зы. правильно пишется: дебЕт
3. jeniks 02.12.16 16:05 Сейчас в теме
ВидыСубконто.ДоговораПростогоТоварищества = Договоры простого товарищества
ВидыСубконто.ДоговорКомиссионера = Договор комиссионера
ВидыСубконто.ДоговорКомитента = Договор комитента

Просто Договора нет.
4. teller 02.12.16 17:05 Сейчас в теме
(3) в чем тогда вопрос? если в твоей конфигурации нет вида субконто Договоры
5. jeniks 07.12.16 11:57 Сейчас в теме
Это подправил. Вот не могу понять что формирует
Если СрокОплаты = 0 Тогда
СрокОплаты = 30;
На все договора это 30. А мне надо реквизит справочника Договора ЧерезДней.
6. teller 07.12.16 12:42 Сейчас в теме
(5) вот твой вопрос:
Вот не могу понять что формирует
Если СрокОплаты = 0 Тогда
СрокОплаты = 30;
На все договора это 30. А мне надо реквизит справочника Договора ЧерезДней.


Вот твой код:
    БИ.ИспользоватьСубконто(ВидыСубконто.Контрагенты,,1);
...
       Попытка 
            СрокОплаты = БИ.Субконто(1).СрокОплаты;
        Исключение
            СрокОплаты = ВыбДнейПросрочки;
        КонецПопытки;
...
       Если СрокОплаты = 0 Тогда
            СрокОплаты = 30;
        Конецесли;
Показать


в коде написано что если у субконто Контрагенты нет реквизита СрокОплаты(подозреваю ото реквизит спр.Договоры),
то в переменную СрокОплаты заносится значение переменной ВыбДнейПросрочки, которая явно в тексте модуля не задана.

значение субконто Договоры (наверно это и есть твой справочник договоров)
доступно только после выборки второго субконто БИ:
Пока БИ.ПолучитьСубконто(2) = 1 Цикл

а СрокОплаты ты уже хочешь получить раньше на
Пока БИ.ПолучитьСубконто(1) = 1 Цикл
.
Видимо тебе надо переместить вычисление дат и сроков внутрь цикла по договорам.
Понятна твоя ошибка?
9. jeniks 08.12.16 08:00 Сейчас в теме
10. teller 08.12.16 14:07 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот