-- Шаблон создан мастером бланков
-- 03.04.2012 13:23:07
--
БланкСШаблоном "Экспорт графической электронной копии документа в PDF";

fДО:L;
fПервДок:L;
fЗКР:L;
fОтдельно:L;

var Договор:Record;
var Договор_:S;
var Договор_Признак:S;
var Аналит:S;
var Путь:S;

var ВыгрузВсе:L=[True];
var ВыгрузВсе_:S="...";

var Упр:I;
var пп[]:i=$;
var Наим[]:S;
var Ном[]:S;
var Дат[]:D;
var Кол[]:I;
var Выгруз[]:L;
var Выгруз_[]:S=if(Выгруз[$],"V","");
var Статус[]:S;
var Crd[]:S;
var UKey[]:Record;
var File[]:S;
var Ord[]:S;

var Buf[]:S;
var BufR[]:Record;
--
--Процедуры и функции -------------
Proc Очистить;
 ClearVariable(Упр);
 ClearVariable(Наим);
 ClearVariable(Ном);
 ClearVariable(Дат);
 ClearVariable(Кол);
 ClearVariable(Выгруз);
 ClearVariable(Статус);
 ClearVariable(Crd);
 ClearVariable(UKey);
 ClearVariable(File);
 ClearVariable(Ord);
end;

Proc Расчет2(aCrd:S; aRec: Record; k:i; p:i; Ord_:S);
var OWA,n,nn,i1:I;
 OWA=OpenWorkArea("РПО_СКАН_ДОК","Дата","Док='"+aCrd+"' and Запись="+Str(RecordToInteger(aRec)));
 Try
  nn=Records(OWA);
  if not k=0 and Аналит="": 
     ShowProgress(nn*k,"Расчет..."); 
  fi;
  for n=1..nn do
   if not k=0 and Аналит="": 
      ProgressPos((nn*p)+n); 
   fi;
   aRec=GetRecordKey(OWA,n);
   i1=Раб.Вспом.Сканер.ЧитатьГЭК("РПО_СКАН_ДОК",RecordToInteger(aRec),"jpg",True);
   if not i1=0:
      InsertFrame(Упр,Упр+1);
      Наим[Упр]=GetFieldS(OWA,n,"Кмнт");
      Ном[Упр]=RecordToString(aRec);
      Дат[Упр]=GetFieldD(OWA,n,"Дата");
      Кол[Упр]=i1;
      UKey[Упр]=aRec;
      Crd[Упр]="РПО_СКАН_ДОК";
      Выгруз[Упр]=ВыгрузВсе;
      Статус[Упр]="Ожидание";
      Ord[Упр]=Ord_+Раб.Формат.ДатаСтр(Дат[Упр],14);
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
 end;
end;


Proc Расчет_;
var OWA,n0,n,nr,OA2,i2,ii2,OA5,i5,ii5:i;
var Rec: Record;
-- Очистить;
 InsertFrame(Упр,Упр+1);
 Наим[Упр]=GetCardFieldS("РПО_ДОГОВОР",Договор,"НАИМДОК.НАИМ");
 Ном[Упр]=GetCardFieldS("РПО_ДОГОВОР",Договор,"НОМЕРДОК");
 Дат[Упр]=GetCardFieldD("РПО_ДОГОВОР",Договор,"ДАТАДОК");
 Кол[Упр]=Раб.Вспом.Сканер.ЧитатьГЭК("РПО_ДОГОВОР",RecordToInteger(Договор),"jpg",true);
 Выгруз[Упр]=ВыгрузВсе;
 Статус[Упр]="Ожидание";
 Crd[Упр]="РПО_ДОГОВОР";
 UKey[Упр]=Договор;
 Ord[Упр]=Раб.Формат.ДатаСтр(Дат[Упр],14)+"#"+Ном[Упр]+"#";
 n0=Упр;
 Try
  if fПервДок:
     Расчет2("РПО_ДОГОВОР",Договор,4,1,Ord[n0]);
     Расчет2("РПО_ДОГОВОР_ПРИЗНАК",GetCardFieldR("РПО_ДОГОВОР",Договор,"ПРИЗНАК_REF"),4,2,Ord[n0]);
     OWA=OpenWorkArea("РПО_ДО_ЗАЧЕТ_АВАНСА","ДатаРег","Pos('ДОГОВОР."+Договор_Признак+".',Up(Аванс_Призн))=1");
     Try
      nr=Records(OWA);
      if Аналит="":
         ShowProgress(nr*5,"Расчет...");
      fi;
      for n=1..nr do
       if Аналит="":
          ProgressPos(nr+nr+n);
       fi;
       Rec=GetRecordKey(OWA,n);
       Расчет2("РПО_ДО_ЗАЧЕТ_АВАНСА",Rec,0,0,Ord[n0]);
      od;
     Finally
      CloseWorkArea(OWA);
     end;
  fi;
  if fДО:
     OWA=OpenWorkArea("РПО_ДО","ДатаДок","Pos('"+Договор_Признак+".',Up(Признак))=1");
     Try
      nr=Records(OWA);
      if Аналит="":
         ShowProgress(nr*if(fПервДок,5,2),"Обработка...");
      fi;
      for n=1..nr do
       if Аналит="":
          ProgressPos(if(fПервДок,nr*3,0)+n);
       fi;
       InsertFrame(Упр,Упр+1);
       Crd[Упр]="РПО_ДО";
       UKey[Упр]=GetRecordKey(OWA,n);
       Наим[Упр]=GetFieldS(OWA,n,"НАИМДОК.НАИМ");
       Ном[Упр]=GetFieldS(OWA,n,"НОМЕРДОК");
       Дат[Упр]=GetFieldD(OWA,n,"ДАТАДОК");
       Кол[Упр]=Раб.Вспом.Сканер.ЧитатьГЭК("РПО_ДО",RecordToInteger(UKey[Упр]),"jpg",true);
       Выгруз[Упр]=ВыгрузВсе;
       Статус[Упр]="Ожидание";
       Ord[Упр]=Ord[n0]+Раб.Формат.ДатаСтр(Дат[Упр],14);
       if fПервДок:
          Расчет2("РПО_ДО",UKey[Упр],0,0,Ord[Упр]);
       fi;
      od;
     Finally
      CloseWorkArea(OWA);
     end;
  fi;
  if fЗКР:
     OWA=OpenWorkArea("РПО_ЗАЯВКА_КР","ДатаДок","Учитывать");
     Try
      nr=Records(OWA);
      if Аналит="":
         ShowProgress(nr*if(fПервДок,5,2),"Обработка...");
      fi;
      if not nr=0:
         OA2=OpenArray(OWA,1,"ОСН_ДОК","ДАТ;ДО");
         Try
          OA5=OpenArray(OWA,1,"РАСШИФР","","Pos('"+Договор_Признак+"',Up(ПРИЗН))>0 or Pos('"+Договор_Признак+"',Up(ПРИЗН_ОСНДОК))>0");
          Try
           for n=1..nr do
            if Аналит="":
               ProgressPos(if(fПервДок,nr*4,nr)+n);
            fi;
            Rec=GetRecordKey(OWA,n);
            if not Records(OA5)=0:
               InsertFrame(Упр,Упр+1);
               Crd[Упр]="РПО_ЗАЯВКА_КР";
               UKey[Упр]=Rec;
               Наим[Упр]="ЗКР";
               Ном[Упр]=GetFieldS(OWA,n,"НОМЕРДОК");
               Дат[Упр]=GetFieldD(OWA,n,"ДАТАДОК");
               Кол[Упр]=1;
               Выгруз[Упр]=ВыгрузВсе;
               Статус[Упр]="Ожидание";
               Ord[Упр]=Ord[n0]+Раб.Формат.ДатаСтр(Дат[Упр],14);
            fi;
           od;
          Finally
           CloseWorkArea(OA5);
          end;
         Finally
          CloseWorkArea(OA2);
         end;
      fi;
     Finally
      CloseWorkArea(OWA);
     end;
  fi;
 Finally
  if Аналит="":
     CloseProgress;
  fi;
 end;
end;

Proc Расчет;
var OWA,nr,n:I;
var Призн_:S;
 Очистить;
 if Аналит="":
    Расчет_;
   else
    ClearVariable(BufR);
    OWA=OpenWorkArea("РПО_ДОГОВОР_ПОЗИЦИИ","Договор");
    Try
     nr=Records(OWA);
     ShowProgress(nr*2,"Обработка...");
     for n=1..nr do
      ProgressPos(n);
      if not GetFieldL(OWA,n,"Договор.НеДейств") and GetFieldL(OWA,n,"Договор.Рег"):
          Призн_=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(GetFieldS(OWA,n,"Призн")," ",Аналит,"");
          if Призн_="": Призн_=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(GetFieldS(OWA,n,"Договор.Общ_Призн1")," ",Аналит,""); fi;
          if Призн_="": Призн_=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(GetFieldS(OWA,n,"Договор.Общ_Призн2")," ",Аналит,""); fi;
          if Призн_=Аналит:
             AddInArray(BufR,True,False,GetFieldR(OWA,n,"Договор"));
          fi;
      fi;
     od;
    Finally
     CloseWorkArea(OWA);
    end;
    Try
     nr=LengthOfArray(BufR);
     ShowProgress(nr*2,"Обработка...");
     for n=1..nr do
      ProgressPos(nr+n);
      Договор=BufR[n];
      Договор_=GetCardFieldS("РПО_ДОГОВОР",Договор,"НАИМДОК.НАИМ")+" №"+GetCardFieldS("РПО_ДОГОВОР",Договор,"НОМЕРДОК")+" от "+DateToString(GetCardFieldD("РПО_ДОГОВОР",Договор,"ДАТАДОК"));
      Договор_Признак=Up(GetCardFieldS("РПО_ДОГОВОР",Договор,"ПРИЗНАК"));
      Расчет_;
     od;
    Finally
     Договор=nil;
     Договор_="";
     Договор_Признак="";
     CloseProgress;
    end;
 fi;
 SortSection(Упр,"Ord");
 Дат[1]=Дат[1];
 Message("Обработка завершена");
end;

Proc Выгрузка;
var Iter,nn,i,f,s,errЗКР,j,jj:i;
var File_,file_ЗКР,folderЗКР,tmp:S;
var First,FirstErr:L;
 ClearVariable(File);
 if fЗКР:
    if EnqOkCancel("Для корректной выгрузки ЗКР, переключите язык (раскладку) на АНГЛИЙСКИЙ",mtWarning)=cmCancel:
       Exit;
    fi;
    if EnqOkCancel("Внимание! Текущий язык (раскладка) должен быть АНГЛИЙСКИЙ (иначе будет плохо, возможно даже очень), Продолжить ?",mtWarning)=cmCancel:
       Exit;
    fi;
    folderЗКР=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\$ZKR2BMP_"+Str(Time)+"$");
    CreateFolder(folderЗКР);
 fi;
 ShowProgress(Упр,if(fОтдельно or not Аналит="","Выгрузка....","Подготовка данных...."));
 Try
  for Iter=1..Упр do
   Статус[Iter]="Ожидание";
  od;
  f=0;
  First=True;
  FirstErr=True;
  for Iter=1..Упр do
   ProgressPos(Iter);
   Статус[Iter]="В процессе";
   if Выгруз[Iter]:
      if Crd[Iter]="РПО_ЗАЯВКА_КР":
         file_ЗКР=folderЗКР+"\ZKR_"+Ном[Iter]+"_"+Str(Year(Дат[Iter]))+Str(Mon((Дат[Iter])))+Str(Day(Дат[Iter]));
         ExecuteProc("ДОКУМЕНТЫ.БАНК.ЗАЯВКА_КР_ПЕЧАТЬ.СохрBMP",UKey[Iter],file_ЗКР);
         errЗКР=0;
         While not ExistFile(file_ЗКР+".bmp") do
          ExecuteProc("ДОКУМЕНТЫ.БАНК.ЗАЯВКА_КР_ПЕЧАТЬ.СохрBMP",UKey[Iter],file_ЗКР);
          errЗКР=errЗКР+1;
          if errЗКР>3:
             if FirstErr:
                if EnqOkCancel("Выгрузка ЗКР: Что-то пошло не так, пробывать выгружать дальше ?",mtWarning)=cmOk:
                   FirstErr=False;
                  else
                   Exit;
                fi;
             fi;
             Trace("Что-то пошло не так: ЗКР "+Ном[Iter]);
             Break;
          fi;
         od;
         if ExistFile(file_ЗКР+".bmp"):
            if Раб.Вспом.Сканер.ConvertImage(file_ЗКР+".bmp",Раб.Вспом.Сканер.wiaFormatJPEG,50):
               RenameFile(file_ЗКР+".bmp",file_ЗКР+".jpg");
               jj=LengthOfArray(Раб.Вспом.Сканер.ФайлГЭК);
               Раб.Вспом.Сканер.ФайлГЭК[jj+1]=file_ЗКР+".jpg";
            fi;
         fi;
        else
         nn=Раб.Вспом.Сканер.ЧитатьГЭК(Crd[Iter],RecordToInteger(UKey[Iter]),"jpg",First or fОтдельно);
      fi;
      First=False;
      if not fОтдельно and Аналит="": f=f+1; fi;
     else
      nn=0;
      Статус[Iter]="Пропущено";
   fi;
   if (fОтдельно and nn>0) or Iter=1 or (not Аналит="" and WordsCount(Ord[Iter],"#")=2):
      File_=Раб.Бюджет2005.Контроль2Слэш(Путь+"\"+Раб.Договор.ConvertStr(Наим[Iter])+" №"+Раб.Договор.ConvertStr(Ном[Iter])+" от "+Раб.Договор.ConvertStr(DateToString(Дат[Iter]))+".pdf");
      if not fОтдельно or not Аналит="":
         if ExistFile(File_):
            if EnqOkCancel("Файл '"+File_+"' уже существет. Перезаписать ?",mtWarning)=cmCancel: Exit; fi;
         fi;
      fi;
   fi;
   if (fОтдельно or (not Аналит="" and (WordsCount(Ord[Iter+1],"#")=2) or Iter=Упр)) and nn>0:
      Hint(File_);
      i=Раб.Вспом.Сканер.JpegToPdf(File_,False);
      if i=1:
         Статус[Iter]="Выгружен";
         f=f+1;
         File[Iter]=File_;
        else
         Статус[Iter]="Ошибка "+Str(i);
      fi;
      if not Аналит="":
         for s=1..Iter-1 do
          if ExtractWords(1,2,Ord[s],"#")=ExtractWords(1,2,Ord[Iter],"#"):
             if i=1:
                Статус[s]="Выгружен";
                File[s]=File_;
               else
                Статус[s]="Ошибка "+Str(i);
             fi;
          fi;
         od;
      fi;
      First=True;
   fi;
  od;
  if fОтдельно or not Аналит="":
     Message("Выгрузка завершена, сформированно файлов: "+Str(f));
    else
     if f=0:
        Message("Нет данных для выгрузки");
       else
        ShowProgress(3,"Выгрузка....");
        ProgressPos(1);
        Hint(File_);
        i=Раб.Вспом.Сканер.JpegToPdf(File_,False);
        ProgressPos(2);
        for Iter=1..Упр do
         Статус[Iter]=if(i=1,"Выгружен","Ошибка "+Str(i));
         if i=1: File[Iter]=File_; fi;
        od;
        ProgressPos(3);
        if i=1:
           Message("Выгрузка завершена, сформированно файлов: 1");
           ExecuteProgram('"'+File_+'"');
          else
           Message("Ошибка создания PDF файла ("+Str(i)+")");
        fi;
     fi;
  fi;
 Finally
  if fЗКР and ExistsFolder(folderЗКР):
     DeleteFolder(folderЗКР);
  fi;
  CloseProgress;
 end;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func Договор_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 if not Аналит="": Message("Поле Аналит. признак должно быть пустым",mtError);  Template.Field="Аналит"; ^False; fi;
 Rec=Раб.Поиск.ВыборИзКартотеки("Выбор договора, контракта...","РПО_ДОГОВОР","НомерДок","Номер документа","Рег and not НеДейств");
 if not Rec=nil:
    Договор=Rec;
    Договор_=GetCardFieldS("РПО_ДОГОВОР",Договор,"НАИМДОК.НАИМ")+" №"+GetCardFieldS("РПО_ДОГОВОР",Договор,"НОМЕРДОК")+" от "+DateToString(GetCardFieldD("РПО_ДОГОВОР",Договор,"ДАТАДОК"));
    Договор_Признак=Up(GetCardFieldS("РПО_ДОГОВОР",Договор,"ПРИЗНАК"));
    Очистить;
 fi;
 Return False;
end;

Proc Договор_OnExit(FieldName: String; Iter: Integer);
 Договор=nil;
 Договор_="";
 Договор_Признак="";
 Очистить;
end;

Func Аналит_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if not Договор=nil: Message("Поле договор 'контракт' должно быть пустым",mtError);  Template.Field="Договор_"; ^False; fi;
 tmp=Раб.Бюджет2005.СписокСправ("*.?.502.??.*|*.?.501.?3.*",0,"К.*|БО.*");
 tmp=AnaElection(tmp,False,True,Аналит);
 if not tmp="":
    Аналит=tmp;
    Очистить;
 fi;
 Return False;
end;

Proc Аналит_OnExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func Путь_OnVerify(FieldName: String; Iter: Integer; Value: String):L;
 if not ExistsFolder(Value): Message("Путь '"+Value+"' не найден",mtError); ^False; fi;
 Return True;
end;

Func Путь_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var i:i;
 Template.HideEditor(False);
 i=ChooseFolder(Путь,"Выберите путь выгрузки");
 Return Cur;
end;

Func Кол_OnEnter(FieldName: String; Iter: Integer): logical;
 if Кол[Iter]>0:
    Раб.Вспом.Сканер.Вызвать(Наим[Iter]+" №"+Ном[Iter]+" от "+DateToString(Дат[Iter]),Crd[Iter],RecordToInteger(UKey[Iter]),"jpg",True,True);
   else
    Message("Графической копии не найдено");
 fi;
 Return False;
end;

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

Func Выгруз_OnEnter(FieldName: String; Iter: Integer): logical;
 Выгруз[Iter]=not Выгруз[Iter];
 Return False;
end;

Func Статус_OnEnter(FieldName: String; Iter: Integer): logical;
 if File[Iter]="":
    Message("Нет данных");
   else
    ExecuteProgram('"'+File[Iter]+'"');
 fi;
 Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnРасчет_OnClick(Sender: String);
 if (Договор_="" or Договор=nil or Договор_Признак="") and Аналит="": Message("Выберите договор (контракт)",mtError); Template.Field="Договор_"; Exit; fi;
 Расчет;
end;

Proc btnВыгрузить_OnClick(Sender: String);
 if Путь="": Message("Укажите путь выгрузки",mtError); Template.Field="Путь"; Exit; fi;
 if not ExistsFolder(Путь): Message("Путь '"+Путь+"' не найден",mtError); Exit; fi;
 if Упр=0: Message("Заполните список документов",mtError); Template.Object="btnРасчет"; Exit; fi;
 Выгрузка;
end;

Proc cbДО_OnChange(Sender: String);
 Очистить;
end;

Proc cbОтдельно_OnChange(Sender: String);
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 fОтдельно=False;
end;
--Обработчики событий шаблона -----
--



Конец
