-- Шаблон создан мастером бланков
-- 02.05.2006 15:29:38
--
БланкСШаблоном "Выгрузка табличных журналов";

Упр:I;

ПутьВыгруз:S;

ДН:D=[1.1.2006];
ДК:D;
НаимПериод:S=["Произвольный"];

var Текст1:S="...";

var A:S="+";
var D:S="-";
var пп[]:i=$;
Статус[]:L;
var Статус_[]:S=if(Статус[$],"V","X");
НаимЖур[]:S;
ФильтрДата[]:S;
Фильтр[]:S;

var Buf[]:S;

var vX           :l;
var vДата        :d;
var vСумма       :s;
var vValSum      :n;
var vBalSum      :n;
var vВалюта      :s;
var vHasBalSum   :l;
var vIsBalFirst  :l;
var vКоличество  :n;
var vКолАналитика:s;
var vОперация    :s;
var vСодержание  :s;
var vDEBET       :s;
var vCREDIT      :s;
var vПараметры   :s;
var vАналитика   :s;

var Run:L;
--
--Процедуры и функции -------------
Proc Очистить;
 ClearVariable(Упр);
 ClearVariable(Статус);
 ClearVariable(НаимЖур);
 ClearVariable(ФильтрДата);
 ClearVariable(Фильтр);
end;

Proc УдалитьПустыеСтроки;
var Iter:I;
 Iter=1;
 While Iter<=Упр do
  if НаимЖур[Iter]="": DeleteFrame(Упр,Iter); else Iter=Iter+1; fi;
 od;
end;

Proc ОбновитьФильтрДата;
var Iter:I;
 for Iter=1..Упр do
  if not ДН=1.1.100 and ДК=1.1.100:     ФильтрДата[Iter]="Дата>="+DateToString(ДН);
    |not ДН=1.1.100 and not ДК=1.1.100: ФильтрДата[Iter]="Дата>="+DateToString(ДН)+" and Дата<"+DateToString(ДК);
    |ДН=1.1.100 and not ДК=1.1.100:     ФильтрДата[Iter]="Дата<"+DateToString(ДК);
    |True: ФильтрДата[Iter]="";
  fi;
 od;
end;

Func ВзятьКлючРаздела(vРаздел:S):Record;-- возвращает UKEY раздела
var OWA,i:i;
 OWA=OpenWorkArea('Table_Razd','','РАЗДЕЛ="'+vРаздел+'"');
 Try
  if Records(OWA)=0: ^nil; fi;
  ^GetRecordKey(OWA,1);
 Finally
  CloseWorkArea(OWA);
 end;
end;

Proc ВыгрузитьРаздел (vРаздел:S; vФильтр:S);
var OWA,n,nr,p,f,ТочнBal,ТочнVal,ТочнКол:i;
var VV:LongString;
var tmp:S;
var StoreДата:D;
var Flag1,Flag2:L;
 vФильтр=Раб.Бюджет2005.Объединить(vФильтр,"Раздел="+RecordToString(ВзятьКлючРаздела(vРаздел))," and ");
 OWA=OpenWorkArea("Table_Oper","Дата;IntoNom",vФильтр);
 F=TextFileCreate(ПутьВыгруз+vРаздел+".jur");
 Try
  nr=Records(OWA);
  for n=1..nr do
   p=Int(n*100/nr);
   Hint("Выгрузка раздела: "+vРаздел+"...."+Str(p)+"%");
   VV="vX=X|vДата=Дата|vСумма=Сумма|vValSum=ValSum|vBalSum=BalSum|vВалюта=Валюта|vHasBalSum=HasBalSum|vIsBalFirst=IsBalFirst|vКоличество=Количество|vКолАналитика=КолАналитика|vОперация=Операция|vСодержание=Содержание|vDEBET=DEBET|vCREDIT=CREDIT|"+"vПараметры=Параметры|vАналитика=Аналитика";
   GetFieldsVars(OWA,n,"",VV);
   --
   if not StoreДата=vДата:
      TextFileWriteLn(F,DateToString(vДата),True);
      StoreДата=vДата;
   fi;
   if vX: TextFileAppendLn(F,"-"+"-"); fi;
   TextFileAppendLn(F,": ");
   ТочнBal=Accuracy;
   ТочнVal=Accuracy(vВалюта);
   Flag1=False;
   Flag2=False;
   if vIsBalFirst:
      if not Round(vBalSum,ТочнBal)=0:
         tmp=Format("%17."+Str(ТочнBal)+"N",vBalSum);
         TextFileAppendLn(F,tmp);
         Flag1=True;
      fi;
      if not Round(vValSum,ТочнVal)=0 or not vВалюта="":
         if Flag1: TextFileAppendLn(F," : "); fi;
         tmp=Format("%17."+Str(ТочнVal)+"N",vValSum);
         TextFileAppendLn(F,tmp);
         if not vВалюта="":
            TextFileAppendLn(F,"^"+vВалюта);
         fi;
         Flag2=True;
      fi;
     else
      if not Round(vValSum,ТочнVal)=0 or not vВалюта="":
         tmp=Format("%17."+Str(ТочнVal)+"N",vValSum);
         TextFileAppendLn(F,tmp);
         if not vВалюта="":
            TextFileAppendLn(F,"^"+vВалюта);
         fi;
         Flag1=True;
      fi;
      if not Round(vBalSum,ТочнBal)=0:
         if Flag1: TextFileAppendLn(F," : "); fi;
         tmp=Format("%17."+Str(ТочнBal)+"N",vBalSum);
         TextFileAppendLn(F,tmp);
         Flag2=True;
      fi;
   fi;
   if not Flag1 and not Flag2: 
      tmp=Format("%17."+Str(ТочнBal)+"N",0.00);
      TextFileAppendLn(F,tmp); 
   fi;
   TextFileAppendLn(F,"   "+vDEBET+"   "+vCREDIT+RepStr(" ",38-(Length(vDEBET)+Length(vCREDIT))));
   TextFileAppendLn(F," {");
   TextFileAppendLn(F,vАналитика);
   if not vКолАналитика="":
      ТочнКол=Accuracy(vКолАналитика);
      TextFileAppendLn(F,if(vАналитика="",""," ")+vКолАналитика);
      TextFileAppendLn(F,":");
      TextFileAppendLn(F,Str(vКоличество,ТочнКол));
   fi;
   TextFileAppendLn(F,"}"+if(vСодержание="",""," -"+"-"));
   TextFileWriteLn(F,vСодержание);
  od;
 Finally
  CloseWorkArea(OWA);
  TextFileClose(F);
 end;
end;

Func Проверить:L;
var OWA,Iter:i;
var F:S;
 ShowProgress(Упр,"Проверка....");
 Try
  for Iter=1..Упр do
   ProgressPos(Iter);
   if Статус[Iter]:
      F=Раб.Бюджет2005.Объединить(ФильтрДата[Iter],Фильтр[Iter]," and ");
      F=Раб.Бюджет2005.Объединить(F,"Раздел="+RecordToString(ВзятьКлючРаздела(НаимЖур[Iter]))," and ");
      Try
       OWA=OpenWorkArea("Table_Oper","",F);
       Try
        F=Раб.Бюджет2005.Объединить(F,"not Параметры=''"," and ");
        SetFilter(OWA,F);
        if not Records(OWA)=0:
           Message("В разделе табличного журнала '"+НаимЖур[Iter]+"' обнаружены нераскрытые типовые операции",mtError);
           Template.Field="НаимЖур";
           Template.Frame=Iter;
           ^False;
        fi;
       Finally
        CloseWorkArea(OWA);
       end;
      Except
       Template.Field="Фильтр";
       Template.Frame=Iter;
       Raise;
      end;
   fi;
  od;
 Finally
  CloseProgress;
 end;
 Return True;
end;

Proc Выполнить (vДН:D; vДК:D; vНаимПериод:S; vПутьВыгруз:S);
 Run=True;
 ДН=vДН;
 ДК=vДК;
 НаимПериод=vНаимПериод;
 ПутьВыгруз=vПутьВыгруз;
 OpenBlank("СЛУЖЕБНЫЕ.ВЫГРУЗКА_ЖУР");
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func ПутьВыгруз_OnEnter(FieldName: String; Iter: Integer): logical;
 Iter=ChooseFolder(ПутьВыгруз,"Укажите папку для выгрузки");
 Return False;
end;

Func НаимПериод_OnEnter(FieldName: String; Iter: Integer): logical;
var n:I;
 ClearVariable(Buf);
 Buf[1]="Вчера";
 Buf[2]="Текущая неделя";
 Buf[3]="Текущий месяц";
 Buf[4]="Прошлый месяц";
 Buf[5]="Текущий квартал";
 Buf[6]="Текущий год";
 Buf[7]="Прошлый год";
 Buf[8]="Произвольный";
 n=Alternate("Период",Buf,-1,1,12);
 if n=0: ^False; fi;
 if n=1: ДН=ToDay-1; 
         ДК=ToDay;
   |n=2: ДН=ToDay-(DayOfWeek(ToDay)-1);
         ДК=ToDay+(8-DayOfWeek(ToDay));
   |n=3: ДН=Dat(1,Mon(ToDay),Year(ToDay)); 
         ДК=if(Mon(ToDay)=12,Dat(1,1,Year(ToDay)+1),Dat(1,Mon(ToDay)+1,Year(ToDay)));
   |n=4: ДН=if(Mon(ToDay)=1,Dat(1,12,Year(ToDay)-1),Dat(1,Mon(ToDay)-1,Year(ToDay))); 
         ДК=Dat(1,Mon(ToDay),Year(ToDay));
   |n=5: if Mon(ToDay)>=1  and Mon(ToDay)<=3 : ДН=Dat(1,1, Year(ToDay)); ДК=Dat(1,4, Year(ToDay));
           |Mon(ToDay)>=4  and Mon(ToDay)<=6 : ДН=Dat(1,4, Year(ToDay)); ДК=Dat(1,7, Year(ToDay));
           |Mon(ToDay)>=7  and Mon(ToDay)<=9 : ДН=Dat(1,7, Year(ToDay)); ДК=Dat(1,10,Year(ToDay));
           |Mon(ToDay)>=10 and Mon(ToDay)<=12: ДН=Dat(1,10,Year(ToDay)); ДК=Dat(1,1, Year(ToDay)+1);
         fi;
   |n=6: ДН=Dat(1,1,Year(ToDay));
         ДК=Dat(1,1,Year(ToDay)+1);
   |n=7: ДН=Dat(1,1,Year(ToDay)-1);
         ДК=Dat(1,1,Year(ToDay));
 fi;
 НаимПериод=Buf[n];
 ОбновитьФильтрДата;
 Return False;
end;

Func Дата_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:d;
var Field:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 PutVariableD(Field,tmp);
 ОбновитьФильтрДата;
 Return Cur;
end;

Proc Дата_OnExit(FieldName: String; Iter: Integer);
 ОбновитьФильтрДата;
end;

Func Текст1_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="Установка выгрузки на весь список";
 Buf[2]="Снять выгрузку для всего списка";
 n=Alternate("Выбор режима",Buf,-1,1,12);
 if n=0: ^False; fi;
 УдалитьПустыеСтроки;
 for Iter=1..Упр do
  Статус[Iter]=(n=1);
 od;
 Return False;
end;

Func A_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(Упр,Iter+1);
 Return False;
end;

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
 DeleteFrame(Упр,Iter);
 if Упр<1: InsertFrame(Упр,1); fi;
 Return False;
end;

Func Статус_OnEnter(FieldName: String; Iter: Integer): logical;
 Статус[Iter]=not Статус[Iter];
 Return False;
end;

Func НаимЖур_OnEnter(FieldName: String; Iter: Integer): logical;
var j,jj,n:i;
var tmp:S;
 ClearVariable(Buf);
 jj=JournalsCount;
 n=0;
 for j=0..jj do
  tmp=JournalName(j);
  if JournalType(tmp)="РАЗД":
     n=n+1;
     Buf[n]=tmp;
  fi;
 od;
 if n=0: Message("В данном плане бухгалтерии не описан ни один табличный журнал");  ^False; fi;
 n=Alternate("Список табличных журналов",Buf,-1,1);
 if n=0: ^False; fi;
 Статус[Iter]=True;
 НаимЖур[Iter]=Buf[n];
 Return False;
end;

Func ФильтрДата_OnEnter(FieldName: String; Iter: Integer): logical;
 Return False;
end;

Proc ФильтрДата_OnExit(FieldName: String; Iter: Integer);
end;

Func Фильтр_OnEnter(FieldName: String; Iter: Integer): logical;
 if НаимЖур[Iter]="": Message("Выберите картотеку",mtError); Template.Field="НаимЖур"; Template.Frame=Iter; ^False; fi;
 Return True;
end;

Func Фильтр_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var OWA:i;
var F:S;
 F=Раб.Бюджет2005.Объединить(ФильтрДата[Iter],Value," and ");
 OWA=OpenWorkArea("Table_Oper","",F);
 Try
 Finally
  CloseWorkArea(OWA);
 end;
 Return True;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnЗагрСписокЖур_OnClick(Sender: String);
var j,jj,n:i;
var tmp:S;
 if not Run:
    if EnqOkCancel("Текущий список будет очищен, продолжить ?")=cmCancel: Exit; fi;
 fi;
 Очистить;
 jj=JournalsCount;
 for j=0..jj do
  tmp=JournalName(j);
  if JournalType(tmp)="РАЗД":
     InsertFrame(Упр,Упр+1);
     Статус[Упр]=True;
     НаимЖур[Упр]=tmp;
  fi;
 od;
 ОбновитьФильтрДата;
end;

Proc btnВыгрузка_OnClick(Sender: String);
var OWA,nr,n,Iter,F:i;
 if ПутьВыгруз="": Message("Укажите папку для выгрузки",mtError); Template.Field="ПутьВыгруз"; Exit; fi;
 УдалитьПустыеСтроки;
 if НаимЖур[1]="": Message("Выберите журнал",mtError); Template.Field="НаимЖур"; Template.Frame=1; Exit; fi;
 if not Проверить: Exit; fi;
 if ExistFile(ПутьВыгруз+"_Список журналов.txt"):
    if EnqOkCancel("В папке "+ПутьВыгруз+" уже находятся выгруженные журналы. Перезаписать ?")=cmCancel: Exit; fi;
 fi;
 ShowProgress(Упр,"Выгрузка журналов...");
 Try
  for Iter=1..Упр do
   ProgressPos(Iter);
   if Статус[Iter]:
      ВыгрузитьРаздел(НаимЖур[Iter],Раб.Бюджет2005.Объединить(ФильтрДата[Iter],Фильтр[Iter]," and "));
   fi;
  od;
 Finally
  CloseProgress;
 end;
 --
 F=TextFileCreate(ПутьВыгруз+"_Список журналов.txt");
 Try
  for Iter=1..Упр do
   if Статус[Iter]:
      TextFileWriteLn(F,НаимЖур[Iter]+".jur");
   fi;
  od;
 Finally
  TextFileClose(F);
 end;
 Message("Выгрузка завершена");
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc AfterOpen(Destroy: Logical);
 if Run:
    btnЗагрСписокЖур_OnClick("");
    Run=False;
 fi;
end;
--Обработчики событий шаблона -----
--



Конец
