Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с обработкой
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
ackiy
дравствуйте. Работаю я сисадмином на которой занимаются кредитами. Время от времени поступаю задания по 1С. И вот от шефа поступило задание.

Есть обработка она считает количество дней прострочки(по формуле ТаблЗн.Дней) и сумму прострочки по кредиту по двум счетам 376 и 373.

Так же она может выводить отчет: по основной сумме кредита (376 счет) (телу) или по основной с процентами (376 и 373).
Проблема в том что при выводе отчета по основной сумме неправильно считается дни прострочки т.к. не учитывается при этом 373 счет.
Я недавно только начал программировать в 1с и с БухИтогами пока не разобрался.
Помогите сделать так что бы расчет дней прострочки всегда шел по двум счетам.
Заранее Спасибо.

Перем Кол1, Кол2, Кол3, Кол4;

Процедура ПриОткрытии()
   Осн=1;      
   Фирма=Константа.БазФирма;
Конецпроцедуры
//*******************************************
Процедура Сформировать()
  
   Док=СоздатьОбъект("Документ.Надання_позикиСтарый");
   Док2=СоздатьОбъект("Документ.Надання_позики");

   Кол1=0;
   Кол2=0;
   Кол3=0;
   Кол4=0;  
      
   Таб = СоздатьОбъект("Таблица");  
   Таб.Опции(0,0,0,0,"Должники");
   Таб.ИсходнаяТаблица("Таблица");
   Таб.ТолькоПросмотр(1);
   Таб.ПараметрыСтраницы(1,,,,,,,,,1,,);
    Таб.ПовторятьПриПечатиСтроки(3,4);  
  
   Таб.ВывестиСекцию("Шапка");
  
   ТаблЗн=СоздатьОбъект("ТаблицаЗначений");
   Табл=СоздатьОбъект("ТаблицаЗначений");
  
//Создание колонок промежуточной ТЗ    


   ТаблЗн.НоваяКолонка("Сот","Справочник.ЧленыКС");
   ТаблЗн.НоваяКолонка("Док","Документ");
   ТаблЗн.НоваяКолонка("СуммаПозыки","Число",14,2);
   ТаблЗн.НоваяКолонка("Задолженность","Число",14,2);
   ТаблЗн.НоваяКолонка("СуммаДБ","Число",14,2);
   ТаблЗн.НоваяКолонка("Дней","Число",10,2);
   ТаблЗн.НоваяКолонка("Процент","Число",8,2);
   ТаблЗн.НоваяКолонка("ДатаВыдачи","Дата");
   ТаблЗн.НоваяКолонка("Дн1","Число",10,2);
   ТаблЗн.НоваяКолонка("Дн2","Число",10,2);
   ТаблЗн.НоваяКолонка("Дн3","Число",10,2);
   ТаблЗн.НоваяКолонка("Дн4","Число",10,2);
   ТаблЗн.НоваяКолонка("КЛ","Строка");
  
//Создание колонок промежуточной ТЗ      


//Создание ОбЪекта БИ и инициализация Субконто  

   Ит = СоздатьОбъект("БухгалтерскиеИтоги");  
   Если Фирма.Выбран()=1 Тогда
      Ит.ИспользоватьРазделительУчета(Фирма);
   КонецЕсли;  
   Ит.ИспользоватьСубконто(ВидыСубконто.ЧленыКС,Сотрудник);    
    Ит.ИспользоватьСубконто(ВидыСубконто.Документ);      
   Если Осн=1 Тогда
      Ит.ВыполнитьЗапрос(КонДата,КонДата,"376");  
   Иначе
      Ит.ВыполнитьЗапрос(КонДата,КонДата,"376,373");  
   КонецЕсли;                        
  
//Создание ОбЪекта БИ и инициализация Субконто    
  
Ит.ВыбратьСубконто(1);
   Пока Ит.ПолучитьСубконто(1) = 1 Цикл
      Если Ит.СКД()-Ит.СКК()=0 Тогда
         Продолжить;
      КонецЕсли;              
      Если Ит.СКД()=0 Тогда
         Продолжить;
      КонецЕсли;              
      Ит.ВыбратьСубконто(2);
      Пока Ит.ПолучитьСубконто(2) = 1 Цикл
        
        
         Если Ит.СКД()<=0 Тогда
            Продолжить;
         КонецЕсли;              
         Если ПустоеЗначение(Ит.Субконто(2))=1 Тогда
            Сообщить("Позика  на суму "+Ит.СКД()+" "+Ит.Субконто(1)+" не зв'язана з документом і не буде врахована цим звітом");
            Продолжить;
         КонецЕсли;  
         ТаблЗн.НоваяСтрока();
         ТаблЗн.Сот = Ит.Субконто(1);
         Сот=СокрЛП(ТаблЗн.Сот.Наименование);
         ТаблЗн.КЛ =  Строка(ТаблЗн.Сот);
         ТаблЗн.Задолженность = Ит.СКД();
         ТаблЗн.Док = Ит.Субконто(2);
         Если  Ит.Субконто(2).Вид()="Надання_позикиСтарый" Тогда
            Док.НайтиДокумент(Ит.Субконто(2));
            ТаблЗн.СуммаПозыки=Док.Сумма;
            ТаблЗн.Процент=Док.Процент;
            Документ=Док.ТекущийДокумент();
            Док.ВыгрузитьТабличнуюЧасть(Табл);
  
            
         ИначеЕсли  Ит.Субконто(2).Вид()="Надання_позики" Тогда
            
         Док2.НайтиДокумент(Ит.Субконто(2));  
         Документ=Док2.ТекущийДокумент();
         ДатаРК = 0;  
        
         Если документ.ВидВозврата=Перечисление.ВозвратКредита.КредитнаяЛиния Тогда
          РК = создатьобъект("Документ.РасходныйКассовыйСтарый");  
          РК.ВыбратьДокументы(документ.ДатаДок, КонДата);
          Пока РК.ПолучитьДокумент()=1 Цикл
           Если РК.родитель = документ  Тогда
            ДатаРК = РК.ДатаДок;  
           КонецЕсли;  
          КонецЦикла;  

          
          ТаблЗн.КЛ =  Строка(ТаблЗн.КЛ) + "!Кр. Л.! <--";
          
          Ит1 = СоздатьОбъект("БухгалтерскиеИтоги");
          Ит1.ИспользоватьСубконто(ВидыСубконто.Документ,Документ);      
          Ит1.ВыполнитьЗапрос(,ДатаРК,"376",,);
          Ит1.ВыбратьСубконто();
          Ит1.ПолучитьСубконто();
            СумКЛ = Ит1.СКД();

          ТаблЗн.СуммаПозыки = СумКЛ;
          ТаблЗн.Процент= Док2.Процент;
          Док2.ВыгрузитьТабличнуюЧасть(Табл);
          
          ИНаче
                    
              
        
            ТаблЗн.СуммаПозыки=Док2.Сумма;
            ТаблЗн.Процент= Док2.Процент;
            Док2.ВыгрузитьТабличнуюЧасть(Табл);
         КонецЕсли;  
         Иначе      
            Сообщить("Документи вида "+Ит.Субконто(2).Вид()+" не враховуються цією програмою!"+
                "  Позичальник " +Ит.Субконто(1)+" документ № "+Ит.Субконто(2).НомерДок+" від "+Ит.Субконто(2).ДатаДок);
            Продолжить;
         КонецЕсли;
        
        
            зюбер=1;
         СуммаДБ=0; СумПроц=0;пз=Ит.Субконто(2).ДатаДок;
        
         Если Ит.Субконто(2).Вид()="Надання_позики" Тогда
         Если документ.ВидВозврата=Перечисление.ВозвратКредита.КредитнаяЛиния Тогда
         пз = ДатаРК;
         КонецЕсли;
          КонецЕсли;
      
         ДатаВозв="";
         Табл.ВыбратьСтроки();
         Пока Табл.ПолучитьСтроку()=1 Цикл
            Если КонДата>Табл.ДатВозв Тогда
               пз=Табл.ДатВозв;
               Продолжить;
            Иначе
               СуммаДБ=Табл.ОстВозв;
               Прервать;
            КонецЕсли;
        
         КонецЦикла;
         ТаблЗн.СуммаДБ=СуммаДБ;
         Ф  = ТаблЗн.Задолженность;
         н  = КонДата-Ит.Субконто(2).ДатаДок;
      
         Если Ит.Субконто(2).Вид()="Надання_позики" Тогда
         Если документ.ВидВозврата=Перечисление.ВозвратКредита.КредитнаяЛиния Тогда
         н = КонДата-ДатаРК;
         КонецЕсли;
          КонецЕсли;
        
         н1 = КонДата-пз;
        
         Р=Окр(ТаблЗн.СуммаДБ*(1+н1*ТаблЗн.Процент/365/100),2);

         М=Окр(((ТаблЗн.СуммаПозыки*ТаблЗн.Процент/365/100)*н),2)+ТаблЗн.СуммаПозыки;
         //
                  
        
        
         ТаблЗн.Дней=?((М-Р)<=0,0,н*(Ф-Р)/(М-Р));
          
        
        
        
         Если (ТаблЗн.Дней>=31) и (ТаблЗн.Дней<=90) Тогда
            ТаблЗн.Дн1= ТаблЗн.Задолженность;
            Кол1=Кол1+1;            
         ИначеЕсли (ТаблЗн.Дней>=91) и (ТаблЗн.Дней<=180) Тогда
            ТаблЗн.Дн2= ТаблЗн.Задолженность;
            Кол2=Кол2+1;            
         ИначеЕсли (ТаблЗн.Дней>=181) и (ТаблЗн.Дней<=365) Тогда
            ТаблЗн.Дн3= ТаблЗн.Задолженность;
            Кол3=Кол3+1;            
         ИначеЕсли (ТаблЗн.Дней>365)  Тогда
            ТаблЗн.Дн4= ТаблЗн.Задолженность;
            Кол4=Кол4+1;            
         КонецЕсли;
      КонецЦикла;
   КонецЦикла;
  


   ТаблЗн.Сортировать("Сот,ДатаВыдачи");
   н=0;
   ТаблЗн.ВыбратьСтроки();
   Пока ТаблЗн.ПолучитьСтроку()=1 Цикл
      Если ТаблЗн.Дней<31 Тогда
         Продолжить;
      КонецЕсли;  
      н=н+1;  
      Сот=СокрЛП(ТаблЗн.Сот.Наименование);  
      
      
      Таб.ВывестиСекцию("Строка");
      Если АДР = 1 Тогда
          Таб.ВывестиСекцию("Адрес");
         Если ТаблЗн.Док.Вид() = "Надання_позики"  Тогда
             Таб.ВывестиСекцию("Попередження");  
         КонецЕсли;
      КонецЕсли;
   КонецЦикла;
   ВсегоИтого=ТаблЗн.Итог("Дн1")+ТаблЗн.Итог("Дн2")+ТаблЗн.Итог("Дн3")+ТаблЗн.Итог("Дн4");
   Таб.ВывестиСекцию("Дно");
   Таб.Показать();
КонецПроцедуры
Домовик
1.делаете копию файла обработки.


2.Комментируете строки
//ТаблЗн=СоздатьОБъект("ТаблицаЗначений");
//Табл=СоздатьОБъект("ТаблицаЗначений");


3. на форме обработки в конфигураторе создаете две таблицы с наименованием ТаблЗн , и Табл

4.после строк обработки
  ТаблЗн.СуммаДБ=СуммаДБ;
         Ф  = ТаблЗн.Задолженность;
         н  = КонДата-Ит.Субконто(2).ДатаДок;
      
         Если Ит.Субконто(2).Вид()="Надання_позики" Тогда
         Если документ.ВидВозврата=Перечисление.ВозвратКредита.КредитнаяЛиния Тогда
         н = КонДата-ДатаРК;
         КонецЕсли;
          КонецЕсли;
        
         н1 = КонДата-пз;
        
         Р=Окр(ТаблЗн.СуммаДБ*(1+н1*ТаблЗн.Процент/365/100),2);

         М=Окр(((ТаблЗн.СуммаПозыки*ТаблЗн.Процент/365/100)*н),2)+ТаблЗн.СуммаПозыки;
         //


добавляем эти строки
  Если ТаблЗн.КоличествоСтрок<=3 Тогда                                                  
          Предупреждение("Проверяем строку таблицы"+ТаблЗн.КоличествоСтрок);
         КонецЕсли;



формула расчета ваших дней здесь
         ТаблЗн.Дней=?((М-Р)<=0,0,н*(Ф-Р)/(М-Р));


4. обработку, она будет останавливаться первые три строки таблицы ТАблЗН. Вы смотрите колонки, кот участвуют в формулах расчета: СуммаДб, СуммаПозыки, Процент..... находите ошибку, исправляете код.

5. переносите исправления в код сохраненной обработки (пункт 1)


так, только по коду сложно выявить ошибку сходу.
ackiy
обработка то работает правиль просто при создании БухИтогов учитывается только 376 счет, а для правильного подсчета дней надо по двум 376 и 373 но вывод суммы только по 376
ackiy
что никто не поможет?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.