Имеется отчет "Дебиторская задолженность" который не формирует данные. Ошибка
Сам отчет.
В чем может быть проблема?
БИ.ИспользоватьСубконто(ВидыСубконто.Договоры,,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);
Таб.Показать(НазваниеОтчета, "");
КонецПроцедуры //СформироватьПоКонтре
ПоказатьВ чем может быть проблема?
По теме из базы знаний
Найденные решения
(7) правильно
посмотри только реквизит СрокОплаты;
есть ли на 1-м субконто, какой смысл имеет этот фрагмент кода:
пс.
Состояние(БИ.Субконто(1)); - вывод сообщения внизу окна, его правильно после БИ.ПолучитьСубконто(1) выводить
пспс
пройдись отладчиком по ходу выполнения
посмотри только реквизит СрокОплаты;
есть ли на 1-м субконто, какой смысл имеет этот фрагмент кода:
Попытка
СрокОплаты = БИ.Субконто(1).СрокОплаты;
Исключение
СрокОплаты = ВыбДнейПросрочки;
КонецПопытки;
пс.
Состояние(БИ.Субконто(1)); - вывод сообщения внизу окна, его правильно после БИ.ПолучитьСубконто(1) выводить
пспс
пройдись отладчиком по ходу выполнения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
БИ.ВыбратьСубконто(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 Тогда
Сумма = БИ.СКД()-БИ.СКК();
ИНаче
Сумма = БИ.СКК()-БИ.СКД();
Конецесли;
ПоказатьПравильно я понял?
(7) правильно
посмотри только реквизит СрокОплаты;
есть ли на 1-м субконто, какой смысл имеет этот фрагмент кода:
пс.
Состояние(БИ.Субконто(1)); - вывод сообщения внизу окна, его правильно после БИ.ПолучитьСубконто(1) выводить
пспс
пройдись отладчиком по ходу выполнения
посмотри только реквизит СрокОплаты;
есть ли на 1-м субконто, какой смысл имеет этот фрагмент кода:
Попытка
СрокОплаты = БИ.Субконто(1).СрокОплаты;
Исключение
СрокОплаты = ВыбДнейПросрочки;
КонецПопытки;
пс.
Состояние(БИ.Субконто(1)); - вывод сообщения внизу окна, его правильно после БИ.ПолучитьСубконто(1) выводить
пспс
пройдись отладчиком по ходу выполнения
(5) вот твой вопрос:
Вот твой код:
в коде написано что если у субконто Контрагенты нет реквизита СрокОплаты(подозреваю ото реквизит спр.Договоры),
то в переменную СрокОплаты заносится значение переменной ВыбДнейПросрочки, которая явно в тексте модуля не задана.
значение субконто Договоры (наверно это и есть твой справочник договоров)
доступно только после выборки второго субконто БИ:
Пока БИ.ПолучитьСубконто(2) = 1 Цикл
а СрокОплаты ты уже хочешь получить раньше на
Пока БИ.ПолучитьСубконто(1) = 1 Цикл
.
Видимо тебе надо переместить вычисление дат и сроков внутрь цикла по договорам.
Понятна твоя ошибка?
Вот не могу понять что формирует
Если СрокОплаты = 0 Тогда
СрокОплаты = 30;
На все договора это 30. А мне надо реквизит справочника Договора ЧерезДней.
Если СрокОплаты = 0 Тогда
СрокОплаты = 30;
На все договора это 30. А мне надо реквизит справочника Договора ЧерезДней.
Вот твой код:
БИ.ИспользоватьСубконто(ВидыСубконто.Контрагенты,,1);
...
Попытка
СрокОплаты = БИ.Субконто(1).СрокОплаты;
Исключение
СрокОплаты = ВыбДнейПросрочки;
КонецПопытки;
...
Если СрокОплаты = 0 Тогда
СрокОплаты = 30;
Конецесли;
Показатьв коде написано что если у субконто Контрагенты нет реквизита СрокОплаты(подозреваю ото реквизит спр.Договоры),
то в переменную СрокОплаты заносится значение переменной ВыбДнейПросрочки, которая явно в тексте модуля не задана.
значение субконто Договоры (наверно это и есть твой справочник договоров)
доступно только после выборки второго субконто БИ:
Пока БИ.ПолучитьСубконто(2) = 1 Цикл
а СрокОплаты ты уже хочешь получить раньше на
Пока БИ.ПолучитьСубконто(1) = 1 Цикл
.
Видимо тебе надо переместить вычисление дат и сроков внутрь цикла по договорам.
Понятна твоя ошибка?
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот