-- Шаблон создан мастером бланков
-- 03.01.2005 18:02:20
--
БланкСШаблоном [20.04.2006] "Работа со сверткой журналов";
var Buf[]:S;
var BufSrt[]:S;
var BufSum[]:N;
var BufDeb[]:S;
var BufCre[]:S;
var BufAnl[]:S;
var FName:S;
forbidPythonFold:L=True;

Func StrToNum (Value:S):N;
var p:i;
 p=Pos("'",Value);
 While p>0 do
  Value=Delete(Value,p,1);
  p=Pos("'",Value);
 od;
 ^Round(Value,2);
end;

Func StrToAnlt (ИсклАн:S; Value:S):S;
var Flag:L;
var n,l:i;
var Ret:S;
 if Pos("{",Value)<>0: Value=SubStr(Value,2,255); fi;
 if Pos("}",Value)<>0: Value=SubStr(Value,1,Length(Value)-1); Flag=True; else Flag=False; fi;
 if Раб.Бюджет2005.MatchMask(Value,ИсклАн)=False or ИсклАн="": n=InsertInArraySort(Buf,Value); fi;
 if Flag=False: ^""; fi;
 Ret="";
 L=LengthOfArray(Buf);
 for n=1..L do
  Ret=Ret+" "+Buf[n];
 od;
 Ret=SubStr(Ret,2,255);
 ^Ret;
end;

Proc ReadTrans(ИсклАн:S; Value:S);
var n,nw,wc:i;
var tmp:S;
var FSum,FDeb,FCre,FAnl:L;
var Sum_:N;
var Deb_,Cre_,Anl_:S;
 ClearVariable(Раб.Свертка.Buf);
 Value=TrimLeft(Value);
 if Pos(":",Value)<>1: Exit; fi;
 FSum=True; FDeb=False; FCre=False; FAnl=False;
 Value=SubStr(Value,2,255); --Отрезаем двоеточие
 wc=WordsCount(Value," ");
 for nw=1..wc do
  tmp=Trim(ExtractWord(nw,Value," ")); --Trim убирает возможные табуляции
  if tmp<>"" and FSum=True: FSum=False; FDeb=True; Sum_=StrToNum(tmp);
    |tmp<>"" and FDeb=True: FDeb=False; FCre=True; Deb_=tmp;
    |tmp<>"" and FCre=True: FCre=False; FAnl=True; Cre_=tmp;
    |tmp<>"" and FAnl=True: Anl_=StrToAnlt(ИсклАн,tmp);
  fi;
  if Sum_=0 and tmp<>"": Exit; fi;
  if Anl_<>"": Break; fi;
 od;

 Value=Deb_+" "+Cre_+" "+Anl_;
 n=SearchInArray(BufSrt,Value);
 if n=-1:
    n=InsertInArraySort(BufSrt,Value);
    InsertInArray(BufSum,n,Sum_);
    InsertInArray(BufDeb,n,Deb_);
    InsertInArray(BufCre,n,Cre_);
    InsertInArray(BufAnl,n,Anl_);
   else
    BufSum[n]=BufSum[n]+Sum_;
 fi;
end;

Proc ReadJur(ИсклАн:S; n:i);
var F:i;
var tmp:S;
 ClearVariable(Раб.Свертка.BufSrt);
 ClearVariable(Раб.Свертка.BufSum);
 ClearVariable(Раб.Свертка.BufDeb);
 ClearVariable(Раб.Свертка.BufCre);
 ClearVariable(Раб.Свертка.BufAnl);
 if ExistFile(FName)=False: Exit; fi;
 F=TextFileOpenRead(FName);
 ShowProgress(n,"Подготовка данных...");
 n=0;
 Try
  While not TextFileEndOfFile(F) do
   n=n+1;
   ProgressPos(n);
   tmp=TextFileReadLn(F);
   ReadTrans(ИсклАн,tmp);
  od;
 Finally
  CloseProgress;
  TextFileClose(F);
 end;
end;

Func Выполнить (ДН:D; ДК:D; МаскаСч:S; МаскаАн:S; УслСжатия:S; ПризнДеб:S; ПризнКре:S; ИсклАн:S):I;
var n:i;
 FName=PlanVar("CACHE")+"\"+GetGUID;
 TujReportBegin(FName,ДН,МаскаСч,МаскаАн,УслСжатия,ПризнДеб,ПризнКре);
 Try
  n=TujReportNext(ДК);
  ReadJur(ИсклАн,n);
 Finally
  TujReportEnd;
  if ExistFile(FName): DeleteFile(FName); fi;
 end;
 ^LengthOfArray(BufSrt);
end;

Func ВзятьДеб (n:I):S;
 ^BufDeb[n];
end;

Func ВзятьКре (n:I):S;
 ^BufCre[n];
end;

Func ВзятьАналит (n:I):S;
 ^BufAnl[n];
end;
----Новый интерфейс с фичами exe от 20.04.2006
var РазрешитьПрогресс:L;
var ЗакрыватьПрогресс:L;
var МножительПрогресса:I;
var ПозицияПрогресса:I;
var СообщениеПрогресса:S;
var ВыполнитьОбновление:L;
var РазрешитьАналитику:L;
var РазрешитьСинтетику:L;
var ДН:D;
var ДК:D;
var УслСч:S;
var УслАн:S;
var Расщепление:I; --TujRepTurnDebCre (Сохранять суммарные обороты по дебету и кредиту) TujRepCrossTurn (Сохранять перекрестные обороты) TujRepBalAccount (Сохранять только остатки на счетах)
                   --А так же комбинироваться (с помощью оператора сложения) со следующими значениями:
                   --TujRepNoNullBal (Не выводить нулевые остатки)
                   --TujRepZabalance (Учитывать забалансовые счета)
                   --TujRepCombinedAna (Оставлять связанную аналитику)
var МаскаСправ:S;
var ПолнСоотвМаскеСправ:L; --в отчете может оказать меньше признаков чем указано в маске справочников, если указан данный параметр то делается проверка на число признаков и число справочников
var spМаскаСправ:S;
var СжатиеСправ:S;
var ИсключитьСправ:S;
var ПорядокПоМаскеСправ:L;
var ТипСинтетики:S;

var Ключ[]:S;
var Список_Синт[]:S;
var Список_Ан[]:S;
var Сум1[]:N;
var Сум2[]:N;

Proc Инициализация;
 ClearVariable(Раб.Свертка.Ключ);
 ClearVariable(Раб.Свертка.Список_Синт);
 ClearVariable(Раб.Свертка.Список_Ан);
 ClearVariable(Раб.Свертка.Сум1);
 ClearVariable(Раб.Свертка.Сум2);
 if ВыполнитьОбновление: Refresh; fi;
 if РазрешитьПрогресс and СообщениеПрогресса="": СообщениеПрогресса="Расчет...."; fi;
 if МаскаСправ="": МаскаСправ="*"; fi;
 if spМаскаСправ="": spМаскаСправ="|"; fi;
 ПозицияПрогресса=Max(ПозицияПрогресса-1,0);
end;

Proc РасчетPy(FName_:S);
  Раб.Python.Exec("jur=tb_jur.TBJur()");
  Раб.Python.Exec("tb_jur.tb69.cb=tb_callback.callback()");
  --Раб.Python.Exec("jur.ParseJur(r'"+FName_+"')");
  Раб.Python.Exec("thread.start_new_thread(tb_jur.TBJur.ParseJur,(jur,r'" + FName_ + "'))");
  Раб.Python.Callback.Loop("tb_jur.tb69.cb");
  if РазрешитьСинтетику:
    Раб.Python.Exec("jur.NormAcc()");
    --Раб.Python.Exec("tb_jur.tb69=tb_callback.callback()");
    Раб.Python.Exec("thread.start_new_thread(tb_jur.TBJur.PartAcc,(jur,'"+ТипСинтетики+"'.decode('1251')))");
    Раб.Python.Callback.Loop("tb_jur.tb69.cb");
  else
    Раб.Python.Exec("jur.DropAcc()");
  fi;
  if РазрешитьАналитику:
     if not ИсключитьСправ="":
--          Раб.Python.Exec("jur.StripAna('',[val.split('.')[0] for val in '"+ИсключитьСправ+"'.split('"+spМаскаСправ+"')])");
        Раб.Python.Exec("jur.StripAna('',[val.split('.')[0] for val in '"+ИсключитьСправ+"'.decode('1251').split('|')])");
     fi;
     if not МаскаСправ="":
        Раб.Python.Exec("maskspr='"+МаскаСправ+"'");
        Раб.Python.Exec("maskspr=[val.split('.')[0] for val in maskspr.decode('1251').split('|')]");
        Раб.Python.Exec("jur.StripAnaAll('',maskspr)");
        if ПолнСоотвМаскеСправ:
          Раб.Python.Exec("jur.StripNonFull('',maskspr)");
         fi;
     fi;

  else
     Раб.Python.Exec("jur.StripAnaAll('',[])");
  fi;
--  Раб.Python.Exec("jur.FoldJur()");
  Раб.Python.Exec("thread.start_new_thread(tb_jur.TBJur.FoldJur, (jur, True))");
  Раб.Python.Callback.Loop("tb_jur.tb69.cb");

  --!КЛЮЧ!
  if ПорядокПоМаскеСправ and not МаскаСправ="":
     Раб.Python.Exec("key = lambda trans: trans.deb + trans.FlatAna(maskspr)");
    else
     Раб.Python.Exec("key = lambda trans: trans.deb + trans.FlatAna()");
  fi;
  Раб.Python.Exec("jur.DayTrans(None).sort(key=key)");
  Раб.Python.ВОбменS("[key(trans) for trans in jur.DayTrans(None)]");
  CopyArray(Раб.Обмен.BufS1,Раб.Свертка.Ключ);

  if ПорядокПоМаскеСправ and not МаскаСправ="":
     Раб.Python.ВОбменS("[trans.FlatAna(maskspr) for trans in jur.DayTrans(None)]");--"+Раб.Python.DateCast(ДК)+"
    else
     Раб.Python.ВОбменS("[trans.FlatAna() for trans in jur.DayTrans(None)]");--"+Раб.Python.DateCast(ДК)+"
  fi;
  CopyArray(Раб.Обмен.BufS1,Раб.Свертка.Список_Ан);
  Раб.Python.ВОбменS("[trans.deb for trans in jur.DayTrans(None)]");
  CopyArray(Раб.Обмен.BufS1,Раб.Свертка.Список_Синт);
  Раб.Python.ВОбменN("[trans.sum for trans in jur.DayTrans(None)]");
  CopyArray(Раб.Обмен.BufN1,Раб.Свертка.Сум1);
--    Раб.Python.ВОбменN("[trans.sumval for trans in jur.DayTrans("+Раб.Python.DateCast(ДК)+")]");
--    CopyArray(Раб.Обмен.BufS1,Раб.Свертка.Список_Синт);
end;


Proc РасчетТБ(FName_:S;nn:I);
var n,z,s,ss,w,ww:i;
var Ан,Синт,Ключ_,tВал1,tВал2,tСчДеб,tСчКре,tКмнт,tmp:S;
var tДата:D;
var tСум1,tСум2:N;
var Flag:L;
var Чс,k:I;
var SkipRow:L;
 Чс=WordsCount(МаскаСправ,spМаскаСправ);
 if РазрешитьПрогресс: ShowProgress(nn*МножительПрогресса,СообщениеПрогресса); fi;
 OpenTextJur(FName_);
 Try
  While not GetTransFromTextJur(tДата,tСум1,tВал1,tСум2,tВал2,tСчДеб,tСчКре,Раб.Свертка.Buf,tКмнт) do
   n=n+1;
   if РазрешитьПрогресс: ProgressPos(nn*ПозицияПрогресса+n); fi;
   Ключ_="";
   Синт="";
   SkipRow=False;
   if РазрешитьСинтетику:   --NormAcc
      if tСчДеб="00" or tСчДеб="00Z": Синт=tСчКре; k=-1;
        |tСчКре="00" or tСчКре="00Z": Синт=tСчДеб; k= 1;
      fi;
      if not ТипСинтетики="": --PartAcc
         if Pos("+",ТипСинтетики)=0:
            Синт=Раб.Бюджет2005.ВзятьКодСчета(Синт,"",ТипСинтетики,False);
           else
            tmp=Синт;
            Синт=Раб.Бюджет2005.ВзятьКодСчета(tmp,"",ExtractWord(1,ТипСинтетики,"+"),False);
            ww=WordsCount(ТипСинтетики,"+");
            for w=2..ww do
             Синт=Синт+"."+Раб.Бюджет2005.ВзятьКодСчета(tmp,"",ExtractWord(w,ТипСинтетики,"+"),False);
            od;
         fi;
      fi;
      Ключ_=Синт;
   fi;
   Ан="";
   if РазрешитьАналитику:
      ss=LengthOfArray(Раб.Свертка.Buf);
      for s=1..ss do
       Flag=True;
       if not ИсключитьСправ="":
          Flag=not Раб.Бюджет2005.MatchMask(Buf[s],ИсключитьСправ);--StripAna
       fi;
       if Flag:
          if МаскаСправ="" or Раб.Бюджет2005.MatchMask(Buf[s],МаскаСправ): Ан=Ан+" "+ExtractWord(1,Buf[s],":"); fi; --StripAnaAll
       fi;
      od;
      Ан=SubStr(Ан,2,255);
      if ПолнСоотвМаскеСправ:
         if not МаскаСправ="": --проверяем если число признаков меньше чем число по маске справочников
            if WordsCount(Ан," ")<Чс: SkipRow=True; fi;
         fi;
      fi;
      if ПорядокПоМаскеСправ: Ан=Раб.Бюджет2005.УпорядочитьНаборСлов(Ан," ",МаскаСправ); fi;
      Ключ_=Раб.Бюджет2005.Объединить(Ключ_,Ан," ");
   fi;
   if not SkipRow:
      z=SearchInArray(Раб.Свертка.Ключ,Ключ_,True);
      if z=-1:
         z=InsertInArraySort(Раб.Свертка.Ключ,Ключ_);
         InsertInArray(Раб.Свертка.Список_Ан,z,Ан);
         InsertInArray(Раб.Свертка.Список_Синт,z,Синт);
         InsertInArray(Раб.Свертка.Сум1,z,tСум1*k);
         InsertInArray(Раб.Свертка.Сум2,z,tСум2*k);
        else
         Сум1[z]=Сум1[z]+tСум1*k;
         Сум2[z]=Сум2[z]+tСум2*k;
      fi;
   fi;
  od;
 Finally
  CloseTextJur;
  if ЗакрыватьПрогресс: CloseProgress; fi;
 end;
end;


Func Расчет:I;
var FName:S;
var nn:I;
 Инициализация;
-- Чс=WordsCount(МаскаСправ,spМаскаСправ);
 FName=Раб.Бюджет2005.tempfile("","jur");
 nn=TujReport(FName,ДН,ДК,УслСч,УслАн,СжатиеСправ,"","",Расщепление,False);
 if ExistFile(FName)=False: ^0; fi;
 if forbidPythonFold:
    РасчетТБ(FName,nn);
   else
    if Раб.Python.LoadAndImport("tb_jur,thread,tb_callback",False):
       try
         РасчетPy(FName);
       finally
         Раб.Python.Unload;
       end;
      else
       РасчетТБ(FName,nn);
    fi;
 fi;
 if ExistFile(FName): DeleteFile(FName); fi;
 ^LengthOfArray(Раб.Свертка.Ключ);

end;

Конец
