-- Шаблон создан мастером бланков
-- 17.02.2007 13:19:07
--
БланкСШаблоном "Выгрузка графической электронной копии документа основания";

cbПутьГЭК   : Object;
cbПапкаГЭК  : Object;
cbxФорматГЭК: Object;

ПутьГЭК:S;

Учр:Record;
УчрНаим:S;
Банк:Record;
ОтправБанк:S;
var ДН:D=[ToDay];
var ДК:D=[ToDay];
var fПапкаГЭК:L;
var ФорматГЭК:I;

var ВзятьИзЗКР_Учр:S="Заполнить из ЗКР";
var ВзятьИзЗКР_ЛС:S="Заполнить из ЗКР";

var ЛсФ:L;
var УчрФ:L;
var Пров_Рекв:L=not ((ЛсФ or Банк=nil) and (УчрФ or Учр=nil));

var A:S="+";
var D:S="-";

var Упр:I;

var пп[]:i=$;
var НомДок[]:S;
var НомДок_:S="";
var ДатаДок[]:D;
var ТипДок[]:L;
var Контр[]:S;
var СумДок[]:N;
var ГЭК_[]:S;
var Msg[]:S;
var Msg_:S="";
var Err[]:I;
var Wrn[]:I;
var Cmt[]:I;
var Key[]:Record;
var FTmp[]:S;
var FName[]:S;
var ГЭК[]:S;
var FTmpГЭК[]:S;
var FNameГЭК[]:S;

var Msg0:S;
var Err0:I;
var Wrn0:I;
var Cmt0:I;
var BufE0:S;
var BufW0:S;
var BufC0:S;


var ВсегоСумДок:N=SumOfArray(СумДок,Упр);

var BufСум[]:N;
var BufСумРуб[]:N;
var Buf[]:S;
var BufИст[]:S;
var BufТипКБК[]:S;
var BufКБК[]:S;
var BufДопКл[]:S;
var BufТипКБКП[]:S;
var BufКБКП[]:S;
var BufДопКлП[]:S;
var BufНазнПл[]:S;
var BufПримеч[]:S;

FolderГЭК:S;

var Buf[]:S;

var BufE[]:S;
var BufW[]:S;
var BufC[]:S;

var SelfCrd:S='РПО_ЗАЯВКА_КР';
var SelfBln:S='ДОКУМЕНТЫ.БАНК.ЗАЯВКА_КР_ВЫГРУЗКА_ГЭК';
--
--Процедуры и функции -------------
Proc Очистить (Iter:I);
 if Iter=0:
    ClearVariable(Упр);
    ClearVariable(НомДок);
    ClearVariable(ДатаДок);
    ClearVariable(ТипДок);
    ClearVariable(Контр);
    ClearVariable(СумДок);
    ClearVariable(ГЭК_);
    ClearVariable(Msg);
    ClearVariable(Err);
    ClearVariable(Wrn);
    ClearVariable(Cmt);
    ClearVariable(Msg0);
    ClearVariable(Err0);
    ClearVariable(Wrn0);
    ClearVariable(Cmt0);
    ClearVariable(Key);
    ClearVariable(FTmp);
    ClearVariable(FName);
    ClearVariable(ГЭК);
    ClearVariable(FTmpГЭК);
    ClearVariable(FNameГЭК);
   else
    НомДок[Iter]="";
    ДатаДок[Iter]=1.1.100;
    ТипДок[Iter]=False;
    Контр[Iter]="";
    СумДок[Iter]=0;
    ГЭК_[Iter]="";
    Msg[Iter]="";
    Err[Iter]=0;
    Wrn[Iter]=0;
    Cmt[Iter]=0;
    Key[Iter]=nil;
    FTmp[Iter]="";
    FName[Iter]="";
    ГЭК[Iter]="";
    FTmpГЭК[Iter]="";
    FNameГЭК[Iter]="";
 fi;
end;

Func ПолучитьФильтр(Iter:I; Rec:Record):S;
var F,tmp:S;
 F="Учитывать and ver>=6";
 if УчрФ and Учр<>nil then F=Раб.Бюджет2005.Объединить(F,"РЕКВ="+RecordToString(Учр)," and "); fi;
 if ЛсФ and Банк<>nil then F=Раб.Бюджет2005.Объединить(F,"БАНК="+RecordToString(Банк)," and "); fi;
 if Iter=0:
    if ДН>1.1.100 and ДК>1.1.100: tmp="ДатаДок>="+DateToString(ДН)+" and ДатаДок<="+DateToString(ДК);
      |ДН=1.1.100 and ДК>1.1.100: tmp="ДатаДок<="+DateToString(ДК);
      |ДН>1.1.100 and ДК=1.1.100: tmp="ДатаДок>="+DateToString(ДН);
    fi;
    F=Раб.Бюджет2005.Объединить(F,tmp," and ");
   else
    tmp=if(Rec=nil,"","UKey="+RecordToString(Rec));
    F=Раб.Бюджет2005.Объединить(F,tmp," and ");
 fi;
 ^F;
end;

Proc РасчетГЭК(OWA:i; n:i; OA:I; iter:i);
var Rec: Record;
var Crd,tmp:S;
var z,zz,i:i;
var Вид_:S;
 ГЭК_[Iter]="";
 ГЭК[Iter]="";
 Crd="РПО_ДОГОВОР";
 Rec=GetFieldR(OWA,n,"ДОГОВОР");
 if not Rec=nil:
    z=Max(Раб.Вспом.Сканер.ЧитатьГЭК(Crd,RecordToInteger(Rec),"jpg",True),0);
    if not z=0:
       if GetFieldR(OWA,n,"Договор")=nil:
	  Вид_="";
	 else
	  Вид_=GetFieldS(OWA,n,"Договор.НаимДок.НаимК");
       fi;
       if Вид_="": Вид_=GetFieldS(OWA,n,"Осн_ДокВид"); fi;
       ГЭК_[Iter]=Вид_+" №"+GetFieldS(OWA,n,"Осн_ДокНом")+" : "+Str(z);
       ГЭК[Iter]=Crd+":"+Str(RecordToInteger(Rec));
    fi;
 fi;
 --
 if OA=-1: OA=OpenArray(OWA,n,"Осн_Док",""); fi;
 Crd="РПО_ДО";
 zz=Records(OA);
 for z=1..zz do
  Rec=GetFieldR(OA,z,"ДО");
  if not Crd="" and not Rec=nil:
     i=Max(Раб.Вспом.Сканер.ЧитатьГЭК(Crd,RecordToInteger(Rec),"jpg",True),0);
     if not i=0:
	if GetFieldR(OA,z,"ДО")=nil:
	   Вид_="";
	  else
	   Вид_=GetFieldS(OA,z,"ДО.НаимДок.НаимК");
	fi;
	if Вид_="": Вид_=GetFieldS(OA,z,"Вид"); fi;
	ГЭК_[Iter]=Раб.Бюджет2005.Объединить(ГЭК_[Iter],Вид_+" №"+GetFieldS(OA,z,"Ном")+" : "+Str(i),Chr(13));
	ГЭК[Iter]=Раб.Бюджет2005.Объединить(ГЭК[Iter],Crd+":"+Str(RecordToInteger(Rec)),",");
     fi;
  fi;
 od;
 --
 Crd=SelfCrd;
 Rec=GetRecordKey(OWA,n);
 i=Max(Раб.Вспом.Сканер.ЧитатьГЭК(Crd,RecordToInteger(Rec),"jpg",True),0);
 if not i=0:
    ГЭК_[Iter]=Раб.Бюджет2005.Объединить(ГЭК_[Iter],"ЗКР"+": "+Str(i),Chr(13));
    ГЭК[Iter]=Раб.Бюджет2005.Объединить(ГЭК[Iter],Crd+":"+Str(RecordToInteger(Rec)),",");
 fi;
 if ГЭК[Iter]="":
    Msg[Iter]="Нет данных";
   else
    Msg[Iter]="Ожидание выгрузки";
 fi;
end;

Proc ЗагрузитьДок (Iter:I; F:S);
var OWA,n,nr,OA:I;
var i:i;
 Очистить(Iter);
 OWA=OpenWorkArea(SelfCrd,"ДатаДок",F);
 Try
  nr=Records(OWA);
  ShowProgress(nr,"Загрузка...");
  for n=1..nr do
   ProgressPos(n);
   if n=1: OA=OpenArray(OWA,n,"Осн_Док",""); fi;
   if Iter=0: 
      i=InsertFrame(Упр,n)-1;
     else 
      i=Iter; 
   fi;
   НомДок[i]=GetFieldS(OWA,n,"НомерДок");
   ДатаДок[i]=GetFieldD(OWA,n,"ДатаДок");
   ТипДок[i]=GetFieldL(OWA,n,"Ф0531851");
   Контр[i]=GetFieldS(OWA,n,"РеквП.КорИмя");
   СумДок[i]=GetFieldN(OWA,n,"Док_Сум");
   Key[i]=GetRecordKey(OWA,n);
   РасчетГЭК(OWA,n,OA,i);
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
end;

Func ПроверитьУникальность(Rec:Record; Iter:I):L;
var z:i;
 z=SearchInArray(Key,Rec,False,1);
 if not z=-1:
    if z=Iter: z=SearchInArray(Key,Rec,False,z+1); fi;
    if not z=-1: Message("Повторный ввод заявки",mtError); ^False; fi;
 fi;
 ^True;
end;

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

Proc Выгрузить;
var OWA,State,Iter,F,n,nn,w,ww:I;
var Buf,Cache,tmp:S;
 Cache=PlanVar("CACHE")+"\";
 for Iter=1..Упр do
  Msg[Iter]="Ожидание выгрузки...";
 od;
 if ПутьГЭК="":
    if ChooseFolder(FolderГЭК,"Укажите путь выгрузки графической копии")=cmCancel:
       for Iter=1..Упр do
	Msg[Iter]=Msg[Iter]+Chr(13)+"Отказ от выгрузки графической электронной копии";
       od;
       Message("Отказ от выгрузки графической электронной копии",mtWarning);
       Exit;
    fi;
   else
    FolderГЭК=ПутьГЭК;
 fi;
 OWA=OpenWorkArea(SelfCrd,"");
 Try
  ShowProgress(Упр,"Формирование выгрузки....");
  for Iter=1..Упр do
   ProgressPos(Iter);
   if not ГЭК[Iter]="":
      if ФорматГЭК=0:
	 nn=0;
	 ww=WordsCount(ГЭК[Iter],",");
	 for w=1..ww do
	  tmp=ExtractWord(w,ГЭК[Iter],",");
	  nn=Раб.Вспом.Сканер.ЧитатьГЭК(ExtractWord(1,tmp,":"),Int(ExtractWord(2,tmp,":")),"jpg",w=1);
	 od;
	 if not nn=0:
	    tmp=Cache+GetGUID;
	    if Раб.Вспом.Сканер.JpegToPdf(tmp,False)=1: FTmpГЭК[Iter]=tmp; fi;
	 fi;
	 if ExistFile(FTmpГЭК[Iter]):
	    if fПапкаГЭК:
	       tmp=FolderГЭК+"ЗКР"+НомДок[Iter]+"_"+DateToString(ДатаДок[Iter]);
	       CreateFolder(tmp);
	       tmp=tmp+"\ЗКР"+НомДок[Iter]+"_"+DateToString(ДатаДок[Iter])+".pdf";
	      else
	       tmp=FolderГЭК+"ЗКР"+НомДок[Iter]+"_"+DateToString(ДатаДок[Iter])+".pdf";
	    fi;
	    CopyFile(FTmpГЭК[Iter],tmp);
	    if ExistFile(tmp):
	       FNameГЭК[Iter]=tmp;
	       Msg[Iter]="Графическая электронная копия успешно выгружена в файл: "+FNameГЭК[Iter];
	      else
	       Msg[Iter]="Ошибка выгрузки графической электронной копии";
	    fi;
	   else
	    Msg[Iter]="Ошибка выгрузки графической электронной копии";
	 fi;
	|ФорматГЭК=1:
	 nn=0;
	 ww=WordsCount(ГЭК[Iter],",");
	 for w=1..ww do
	  tmp=ExtractWord(w,ГЭК[Iter],",");
	  nn=Раб.Вспом.Сканер.ЧитатьГЭК(ExtractWord(1,tmp,":"),Int(ExtractWord(2,tmp,":")),"jpg",w=1);
	 od;
	 if not nn=0:
	    if fПапкаГЭК:
	       tmp=FolderГЭК+"ЗКР"+НомДок[Iter]+"_"+DateToString(ДатаДок[Iter]);
	       CreateFolder(tmp);
	       tmp=tmp+"\ЗКР"+НомДок[Iter]+"_"+DateToString(ДатаДок[Iter])+".";
	      else
	       tmp=FolderГЭК+"ЗКР"+НомДок[Iter]+"_"+DateToString(ДатаДок[Iter])+".";
	    fi;
	    for n=1..nn do
	     CopyFile(Раб.Вспом.Сканер.ФайлГЭК[n],tmp+"лист"+Format("%.2D",n)+".jpg");
	     if ExistFile(tmp+"лист"+Format("%.2D",n)+".jpg"):
		if n=1:
		   FNameГЭК[Iter]=tmp+"лист"+Format("%.2D",n)+".jpg";
		   Msg[Iter]="Графическая электронная копия успешно выгружена в файл: "+FNameГЭК[Iter];
		  else
		   Msg[Iter]=Msg[Iter]+Chr(13)+"ЗКР"+НомДок[Iter]+"_"+DateToString(ДатаДок[Iter])+".лист"+Format("%.2D",n)+".jpg";
		   FNameГЭК[Iter]=FNameГЭК[Iter]+";ЗКР"+НомДок[Iter]+"_"+DateToString(ДатаДок[Iter])+".лист"+Format("%.2D",n)+".jpg";
		fi;
	       else
		Msg[Iter]="Ошибка выгрузки графической электронной копии";
	     fi;
	    od;
	 fi;
      fi;
   fi; --if not ГЭК[Iter]="":
  od; --for Iter=iТабл..nТабл do
 Finally
  CloseWorkArea(OWA);
  for Iter=1..Упр do
   if not FTmpГЭК[Iter]="": 
      if ExistFile(FTmpГЭК[Iter]): DeleteFile(FTmpГЭК[Iter]); FTmpГЭК[Iter]=""; fi;
   fi;
  od;
  CloseProgress;
 end;
 Message("Выгрузка успешно произведена"+Chr(13)+"Для просмотра сформированных фалов нажмите на поле 'Статус'");
 Template.Field="Msg"; Template.Frame=1;
end;

Proc ЗаполнитьПлатильщика(Rec: Record);
 if not Rec=nil:
    Учр=Rec;
    УчрНаим=GetCardFieldS("Контрагент",Rec,"КорИмя");
 fi;
end;

--Процедуры и функции -------------
--
--Обработчики событий полей шаблона-----
Func Путь_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var i:I;
var Field:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 i=ChooseFolder(ПутьГЭК,"Выберите путь выгрузки");
 Return Cur;
end;

Func УчрНаим_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 Rec=OpenCardFile("Контрагент","--Наше",Учр,crdRecordOnly);
 ЗаполнитьПлатильщика(Rec);
 if УчрФ:
    Очистить(0);
 fi;
 Return False;
end;

Proc УчрНаим_OnExit(FieldName: String; Iter: Integer);
 if УчрНаим="": Учр=nil; fi;
 if УчрФ:
    Очистить(0);
 fi;
end;

Func ВзятьИзЗКР_Учр_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 Rec=OpenCardFile(SelfCrd,"--Учитывать");
 if not Rec=nil:
    ЗаполнитьПлатильщика(GetCardFieldR(SelfCrd,Rec,"Рекв"));
    if УчрФ:
       Очистить(0);
    fi;
 fi;
 Return False;
end;

Func ОтправБанк_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 if Учр=nil then
    Учр=OpenCardFile("Контрагент","Наше",Учр,crdRecordOnly);
    if Учр=nil: ^False; fi;
    ЗаполнитьПлатильщика(Rec);
 fi;
 Rec=OpenCardFile("Банк_счета","КОНТРАГЕНТ="+RecordToString(Учр),Банк,crdRecordOnly);
 if Rec=nil: ^False; fi;
 Банк=Rec;
 ОтправБанк=GetCardFieldS("БАНК_СЧЕТА",Банк,"РПО_ЛСЧЕТ")+" в "+GetCardFieldS("БАНК_СЧЕТА",Банк,"РПО_ОФК_ИМЯ")+" ("+GetCardFieldS("БАНК_СЧЕТА",Банк,"РПО_Коммент")+")";
 if ЛсФ:
    Очистить(0);
 fi;
 ^False;   
end;

Proc ОтправБанк_OnExit(FieldName: String; Iter: Integer);
 if ОтправБанк='' then Банк=nil; fi;
 if ЛсФ:
    Очистить(0);
 fi;
end;

Func ВзятьИзЗКР_ЛС_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 Rec=OpenCardFile(SelfCrd,"--Учитывать");
 if not Rec=nil:
    ЗаполнитьПлатильщика(GetCardFieldR(SelfCrd,Rec,"Рекв"));
    Банк=GetCardFieldR(SelfCrd,Rec,"Банк");
    ОтправБанк=GetCardFieldS("БАНК_СЧЕТА",Банк,"РПО_ЛСЧЕТ")+" в "+GetCardFieldS("БАНК_СЧЕТА",Банк,"РПО_ОФК_ИМЯ")+" ("+GetCardFieldS("БАНК_СЧЕТА",Банк,"РПО_Коммент")+")";
    if ЛсФ:
       Очистить(0);
    fi;
 fi;
 Return False;
end;

Func Ф_OnEnter(FieldName: String; Iter: Integer): logical;
  var tmp:l;
    tmp=GetVariableL(FieldName);
    tmp= not tmp;
    PutVariableL(Fieldname, tmp);
  Return  False;
end;

Proc Д_OnExit(FieldName: String; Iter: Integer);
 Очистить(0);
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);
 Очистить(0);
 Return Cur;
end;

Func A_onEnter (Field:String; Iter:Integer):Logical;
 InsertFrame(Упр,Iter+1);
 ^false;
end;

Func D_onEnter (Field:String; Iter:Integer):Logical;
 DeleteFrame(Упр,Iter);
 ^false;
end;

Func Док_onEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
var F:S;
var OWA:I;
 if Учр=nil or УчрНаим="": Message("Выберите собственные реквизиты",mtError); Template.Field="УчрНаим"; ^False; fi;
 F=ПолучитьФильтр(Iter,nil);
 if FieldName="НомДок_":
    Rec=Раб.Поиск.ВыборИзКартотеки("Выбор заявки",SelfCrd,"НомерДок|ДатаДок:D|РеквП:R#Контрагент@КорИмя","Номер заявки|Дата заявки|Контрагент",F);
   else
    Rec=OpenCardFile(SelfCrd,"--"+F,Key[Iter]);
 fi;
 if not Rec=nil:
    if ПроверитьУникальность(Rec,Iter):
       ЗагрузитьДок(Iter,ПолучитьФильтр(Iter,Rec));
    fi;
 fi;
 Return False;
end;

Proc Док_onExit(FieldName: String; Iter: Integer);
 Очистить(Iter);
end;

Func НомДок_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 Док_onEnter(AsString(Template.Field),AsInteger(Template.Frame));
 Return Cur;
end;

Func ГЭК_OnEnter(FieldName: String; Iter: Integer): logical;
var w,ww,OWA:i;
var tmp:S;
 OWA=OpenWorkArea(SelfCrd,"","UKey="+RecordToString(Key[Iter]));
 Try
  if Records(OWA)=0: Message("Заявка на кассовый расход не найдена",mtError); ^False; fi;
  РасчетГЭК(OWA,1,-1,Iter);
 Finally
  CloseWorkArea(OWA);
 end;
 ClearVariable(Buf);
 if ГЭК_[Iter]="":
    Message("Документ не был отсканирован");
   else
    ww=WordsCount(ГЭК_[Iter],Chr(13));
    for w=1..ww do
     Buf[w]=Trim(ExtractWord(w,ГЭК_[Iter],Chr(13)));
    od;
    if ww=1: w=1; else w=Alternate("Выберите документ",Buf,-1,1,12); fi;
    if not w=0:
       tmp=ExtractWord(w,ГЭК[Iter],",");
       Раб.Вспом.Сканер.Вызвать(ExtractWord(1,Buf[w],":"),ExtractWord(1,tmp,":"),Int(ExtractWord(2,tmp,":")),"jpg",True,True);
    fi;
 fi;
 Return False;
end;

Func Msg_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter,ww,w:I;
var tmp:s;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if not Key[Iter]=nil:
    if not FNameГЭК[Iter]="":
       ww=WordsCount(FNameГЭК[Iter],";");
       tmp=ExtractWord(1,FNameГЭК[Iter],";");
       ExecuteProgram('"'+tmp+'"');
    fi;
   else
    OpenBlank("Документы.Банк.ЗАЯВКА_КР",True,Key[Iter]);
 fi;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnСформировать_onClick(Sender: String);
 Выгрузить;
end;

Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;

Proc Очистить_onClick (Row: Integer; Col: Integer; Double: Logical);
 if EnqOkCancel("Список будет очищен, продолжить ?",mtWarning)=cmCancel: Exit; fi;
 Очистить(0);
end;

Proc Загрузить_onClick(Row: Integer; Col: Integer; Double: Logical);
 if Учр=nil or УчрНаим="": Message("Выберите собственные реквизиты",mtError); Template.Field="УчрНаим"; Exit; fi;
 if ДН>ДК and not ДК=1.1.100: Message("Начальная дата превышает конечную",mtError); Template.Field="ДН"; Exit; fi;
 ЗагрузитьДок(0,ПолучитьФильтр(0,nil));
end;
--Обработчики событий объектов шаблона-----
--
--Обработчики событий шаблона -----
Proc onOpen(Create:L);
var Rec: Record;
 if Учр=nil:
    Rec=Раб.Бюджет2005.НашРекв;
    ЗаполнитьПлатильщика(Rec);
 fi;
end;
--Обработчики событий шаблона -----
--
Конец
