Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Перевод Дебеторки на прямые запросы. (число прочтений - 819 )
elemenrad
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 25. Февраля 2010
Перевод Дебеторки на прямые запросы.
18. Июля 2011 :: 10:49
Печать  
Итак возникла необходимость перевести отчет по ДЗ на прямые запросы. Главной функцией существующего является функция :

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

Почиитал на тему нарастающих итогов в запросах для восьмёрки однако ввиду недостатка знаний есть сложности с реализацией алгоритма на 7.7.
У кого есть какие соображения по поводу перевода её на скуль?! буду благодарен любым советам.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать