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

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);   
			
	Таб.Показать(НазваниеОтчета, "");  		
КонецПроцедуры //СформироватьПоКонтре
Показать


В чем может быть проблема?
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 Сейчас в теме
Оставьте свое сообщение
Вакансии
Разработчик 1С (от middle до senior), до 300 К gross
Санкт-Петербург
зарплата от 195 000 руб. до 300 000 руб.
Полный день

Аналитик
Москва
зарплата от 150 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб.
Полный день

Разработчик 1С:ERP WE
Москва
зарплата от 250 000 руб.
Полный день

Аналитик 1С:ЗУП
Москва
зарплата от 150 000 руб.
Полный день