-- Шаблон создан мастером бланков
-- 24.06.2009 13:44:55
--
БланкСШаблоном "Работа с сканером изображений";

var Загл:S;

var Read_Only:L;
var HideDlg:L;
var Exec:S;
var ExecSender:S;
var Inited:L;
var enableНастр:L;
var FlagModify:L;

var wiaFormatBMP:S ="{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";
var wiaFormatPNG:S ="{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}";
var wiaFormatGIF:S ="{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}";
var wiaFormatJPEG:S="{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
var wiaFormatTIFF:S="{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}";

var UnspecifiedIntent:I=0;
var ColorIntent:I      =1;
var GrayscaleIntent:I  =2;
var TextIntent:I       =4;

var MinimizeSize:I   =65536;
var MaximizeQuality:I=131072;

var UnspecifiedDeviceType:I=0;
var ScannerDeviceType:I=1;
var CameraDeviceType:I=2;
var VideoDeviceType:I=3;

--WIA_DPS_DOCUMENT_HANDLING_CAPABILITIES flags:
var FEED:i=1; --The scanner has an automatic document handler installed.
var FLAT:i=2; --The scanner has a flatbed platen.
var DUP:I=4;
var DETECT_FLAT:i=8; --The scanner can detect a document on the flatbed platen.
var DETECT_SCAN:i=16; --The scanner can detect a document in the feeder only by scanning.
var DETECT_FEED:i=32;--The scanner can detect a document in the feeder.
var DETECT_DUP:i=64; --The scanner can detect a duplex scan request from the user

--WIA_DPS_DOCUMENT_HANDLING_STATUS flags:
var FEED_READY:i=1; --The flatbed is ready for use.
var FLAT_READY:i=2; --The scanner has a document on the flatbed platen.
var DUP_READY:i=4; --The duplexer is enabled and ready to be used.
var FLAT_COVER_UP:i=8; --The flat bed cover is up.
var PATH_COVER_UP:i=16; --The paper path is covered up and is preventing proper operation.
var PAPER_JAM:i=32; --A document is jammed in the document feeder.

--WIA_DPS_DOCUMENT_HANDLING_SELECT flags:
var FEEDER:i=1; --Scan using the document feeder.
var FLATBED:i=2; --Scan using the flatbed.
var DUPLEX:i=4; --Scan using duplexer operations.
var FRONT_FIRST:i=8; --Scan the front of the document first. This value is valid when DUPLEX is set.
var BACK_FIRST:i=16; --Scan the back of the document first. This value is valid when DUPLEX is set.
var FRONT_ONLY:i=32; --Scan the front only. This value is valid when DUPLEX is set.
var BACK_ONLY:i=64; --Scan the back only. This value is valid when DUPLEX is set.
var NEXT_PAGE:i=128; --Scan the next page of the document.
var PREFEED:i=256; --Enable pre-feed mode. Pre-position next document while scanning.
var AUTO_ADVANCE:i=512; --Enables automatic feeding of the next document after a scan.

var Страница :I=[1];
var ТекЛист  :I=[1];
var КолЛист  :I=[1];
var RowЛист  :I=16;
var ColЛист  :I=6;
var MaxЛист  :I=RowЛист*ColЛист;
var СканЛист :I;
var Качество :I=[35];
var Страница_:S="Страница "+Str(Max(1,Страница))+" из "+Str(Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1));

--var Страница :I=[1];
--var ТекЛист  :I=[1];
--var КолЛист  :I=[1];
--var RowЛист  :I=1;
--var ColЛист  :I=6;
--var MaxЛист  :I=RowЛист*ColЛист;
--var СканЛист :I;
--var Качество :I=[35];
--var Страница_:S="Страница "+Str(Max(1,Страница))+" из "+Str(Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1));

Контраст:I;
Яркость:I;

var УпрНастр:L;
var ПутьJpeg2Pdf:S;

var Инфо1:s="Текущий лист: "+Str(ТекЛист)+" Всего листов: "+Str(КолЛист);

var Img[]:S;
var Лист[]:S="Лист №"+Str($);
var D[]:S=if(Read_Only,"","r");
--var R[]:S=if(Read_Only,"","q");
var R[]:S="q";

var stateUI:I=0; --Тип пользовательского интерфейса

var ImageFormat:S=["{00000000-0000-0000-0000-000000000000}"];
var ImageIntent:I=[UnspecifiedIntent];
var ImageBias:I=[MaximizeQuality];
var ImageResolution:I;
var RootFolderImage:S;
CurrentDeviceID:S;
CurrentDeviceName:S;
CurrentDocumentHandling:I;
CurrentRotateImage:I;
var CurrentDocumentHandling_:S=if(CurrentDocumentHandling=FEEDER or CurrentDocumentHandling=DUPLEX:"Податчик документов"|CurrentDocumentHandling=FLATBED:"Планшет"|True:"");
var CurrentIntent:I=[TextIntent];
enableDuplex:L;
AutoRotateDup:I;

Picture1 : Object; Label1 : Object; Bevel1 : Object;
Picture2 : Object; Label2 : Object; Bevel2 : Object;
Picture3 : Object; Label3 : Object; Bevel3 : Object;
Picture4 : Object; Label4 : Object; Bevel4 : Object;
Picture5 : Object; Label5 : Object; Bevel5 : Object;
Picture6 : Object; Label6 : Object; Bevel6 : Object;
Picture7 : Object; Label7 : Object; Bevel7 : Object;
Picture8 : Object; Label8 : Object; Bevel8 : Object;
Picture9 : Object; Label9 : Object; Bevel9 : Object;
Picture10: Object; Label10: Object; Bevel10: Object;
Picture11: Object; Label11: Object; Bevel11: Object;
Picture12: Object; Label12: Object; Bevel12: Object;
Picture13: Object; Label13: Object; Bevel13: Object;
Picture14: Object; Label14: Object; Bevel14: Object;
Picture15: Object; Label15: Object; Bevel15: Object;
Picture16: Object; Label16: Object; Bevel16: Object;
Picture17: Object; Label17: Object; Bevel17: Object;
Picture18: Object; Label18: Object; Bevel18: Object;
Picture19: Object; Label19: Object; Bevel19: Object;
Picture20: Object; Label20: Object; Bevel20: Object;
Picture21: Object; Label21: Object; Bevel21: Object;
Picture22: Object; Label22: Object; Bevel22: Object;
Picture23: Object; Label23: Object; Bevel23: Object;
Picture24: Object; Label24: Object; Bevel24: Object;
Picture25: Object; Label25: Object; Bevel25: Object;
Picture26: Object; Label26: Object; Bevel26: Object;
Picture27: Object; Label27: Object; Bevel27: Object;
Picture28: Object; Label28: Object; Bevel28: Object;
Picture29: Object; Label29: Object; Bevel29: Object;
Picture30: Object; Label30: Object; Bevel30: Object;
Picture31: Object; Label31: Object; Bevel31: Object;
Picture32: Object; Label32: Object; Bevel32: Object;
Picture33: Object; Label33: Object; Bevel33: Object;
Picture34: Object; Label34: Object; Bevel34: Object;
Picture35: Object; Label35: Object; Bevel35: Object;
Picture36: Object; Label36: Object; Bevel36: Object;
Picture37: Object; Label37: Object; Bevel37: Object;
Picture38: Object; Label38: Object; Bevel38: Object;
Picture39: Object; Label39: Object; Bevel39: Object;
Picture40: Object; Label40: Object; Bevel40: Object;
Picture41: Object; Label41: Object; Bevel41: Object;
Picture42: Object; Label42: Object; Bevel42: Object;
Picture43: Object; Label43: Object; Bevel43: Object;
Picture44: Object; Label44: Object; Bevel44: Object;
Picture45: Object; Label45: Object; Bevel45: Object;
Picture46: Object; Label46: Object; Bevel46: Object;
Picture47: Object; Label47: Object; Bevel47: Object;
Picture48: Object; Label48: Object; Bevel48: Object;
Picture49: Object; Label49: Object; Bevel49: Object;
Picture50: Object; Label50: Object; Bevel50: Object;
Picture51: Object; Label51: Object; Bevel51: Object;
Picture52: Object; Label52: Object; Bevel52: Object;
Picture53: Object; Label53: Object; Bevel53: Object;
Picture54: Object; Label54: Object; Bevel54: Object;
Picture55: Object; Label55: Object; Bevel55: Object;
Picture56: Object; Label56: Object; Bevel56: Object;
Picture57: Object; Label57: Object; Bevel57: Object;
Picture58: Object; Label58: Object; Bevel58: Object;
Picture59: Object; Label59: Object; Bevel59: Object;
Picture60: Object; Label60: Object; Bevel60: Object;
Picture61: Object; Label61: Object; Bevel61: Object;
Picture62: Object; Label62: Object; Bevel62: Object;
Picture63: Object; Label63: Object; Bevel63: Object;
Picture64: Object; Label64: Object; Bevel64: Object;
Picture65: Object; Label65: Object; Bevel65: Object;
Picture66: Object; Label66: Object; Bevel66: Object;
Picture67: Object; Label67: Object; Bevel67: Object;
Picture68: Object; Label68: Object; Bevel68: Object;
Picture69: Object; Label69: Object; Bevel69: Object;
Picture70: Object; Label70: Object; Bevel70: Object;
Picture71: Object; Label71: Object; Bevel71: Object;
Picture72: Object; Label72: Object; Bevel72: Object;
Picture73: Object; Label73: Object; Bevel73: Object;
Picture74: Object; Label74: Object; Bevel74: Object;
Picture75: Object; Label75: Object; Bevel75: Object;
Picture76: Object; Label76: Object; Bevel76: Object;
Picture77: Object; Label77: Object; Bevel77: Object;
Picture78: Object; Label78: Object; Bevel78: Object;
Picture79: Object; Label79: Object; Bevel79: Object;
Picture80: Object; Label80: Object; Bevel80: Object;
Picture81: Object; Label81: Object; Bevel81: Object;
Picture82: Object; Label82: Object; Bevel82: Object;
Picture83: Object; Label83: Object; Bevel83: Object;
Picture84: Object; Label84: Object; Bevel84: Object;
Picture85: Object; Label85: Object; Bevel85: Object;
Picture86: Object; Label86: Object; Bevel86: Object;
Picture87: Object; Label87: Object; Bevel87: Object;
Picture88: Object; Label88: Object; Bevel88: Object;
Picture89: Object; Label89: Object; Bevel89: Object;
Picture90: Object; Label90: Object; Bevel90: Object;
Picture91: Object; Label91: Object; Bevel91: Object;
Picture92: Object; Label92: Object; Bevel92: Object;
Picture93: Object; Label93: Object; Bevel93: Object;
Picture94: Object; Label94: Object; Bevel94: Object;
Picture95: Object; Label95: Object; Bevel95: Object;
Picture96: Object; Label96: Object; Bevel96: Object;

btnСохранить : Object;
btnЗагрузить : Object;
btnУдалить   : Object;
btnСкан      : Object;
btnСканСлед  : Object;
btnСканСлед2 : Object;
btnИмпорт    : Object;
btnИмпортСлед: Object;
btnОчистить  : Object;
btnУмолч     : Object;
lbIntent     : Object;
cbxIntent    : Object;
edКачество   : Object;
lbКачество   : Object;
edЯркость    : Object;
lbЯркость    : Object;
edКонтраст   : Object;
lbКонтраст   : Object;

btnПредСтраница1: Object;
btnПредСтраница2: Object;
btnСледСтраница1: Object;
btnСледСтраница2: Object;
btnВыборСтраницы1: Object;
btnВыборСтраницы2: Object;

sRFI : Section;
sScan: Section;

S0 : Section;
S1 : Section;
S2 : Section;
S3 : Section;
S4 : Section;
S5 : Section;
S6 : Section;
S7 : Section;
S8 : Section;
S9 : Section;
S10: Section;
S11: Section;
S12: Section;
S13: Section;
S14: Section;
S15: Section;
S16: Section;

var Buf[]:S;
var BufГЭК[]:S;

var SelfCrd:S="РПО_ГЭК";
var SelfBln:S="РАБ.ВСПОМ.СКАНЕР";

var Сеанс:S;
var fСеанс:L=False;

var НастрGUID:S;

var vДок:S;
var vЗапись:I;
var vТип:S;
var ФайлГЭК[]:S;
var extПапка:S;
var vКлюч:S;

hPosCRI:I;
--
--Процедуры и функции -------------
Proc Настр(aСохр:L);
 if НастрGUID="" or aСохр: НастрGUID=GetGUID; fi;
 if Раб.Настр.Начать(SelfBln,0,0,"",НастрGUID):
    Раб.Настр.Добавить("RootFolderImage","S");
    Раб.Настр.Добавить("Качество","I");
    Раб.Настр.Добавить("CurrentIntent","I");
    Раб.Настр.Добавить("ПутьJpeg2Pdf","S");
    if aСохр: 
       Try
        Раб.Настр.Сохранить;
       Except
        Настр(False);
       end;
      else 
       НастрGUID=Раб.Настр.Загрузить("","");
       if НастрGUID="" or RootFolderImage="":
          RootFolderImage=Раб.Бюджет2005.Контроль2Слэш(PlanVar("Бух")+"\ГЭК");
          Качество=35;
          CurrentIntent=4;
          ПутьJpeg2Pdf="";
       fi;
    fi;
 fi;
end;

Proc ОткрНастр(Flag:L);
 УпрНастр=Flag;
end;

Proc ОформлениеОбщ;
 btnСохранить.Enabled=not Read_Only;
 btnЗагрузить.Enabled=not Read_Only;
 btnУдалить.Enabled=not Read_Only;
 btnСкан.Enabled=not Read_Only;
 btnСканСлед.Enabled=not Read_Only;
 btnСканСлед2.Enabled=not Read_Only and enableDuplex;
 btnИмпорт.Enabled=not Read_Only;
 btnИмпортСлед.Enabled=not Read_Only;
 btnОчистить.Enabled=not Read_Only;
 btnУмолч.Enabled=not Read_Only;
 cbxIntent.Enabled=not Read_Only;
 edКачество.Enabled=not Read_Only;
 edЯркость.Enabled=not Read_Only;
 edКонтраст.Enabled=not Read_Only;
end;

Proc Оформление(aТекЛист:i);
var i,i1,i2,s,c,cc,КолЛист_,d0,z,r:i;
var Obj:Object;
var Flag:L;
var Txt:S;
 Страница=Max(1,Страница);
 d0=(Страница-1)*MaxЛист;  --нулевой отсчет листа для страницы
 if aТекЛист=0:
    i1=1;
    i2=MaxЛист;
   else
    i1=aТекЛист-d0;
    i2=aТекЛист-d0;
 fi;
 z=0;
 КолЛист_=КолЛист-((Страница-1)*MaxЛист); --Количество листов на текущей странице
 for s=1..RowЛист do
  if FindObject("s"+Str(s),Obj):
     if (s-4)*ColЛист<=КолЛист_:
        Obj.Visible=True;
        c=0;
        for i=1+((s-1)*ColЛист)..ColЛист*s do
         Flag=КолЛист_>=i;
         for cc=1..4 do
          c=c+1;
          if not AsLogical(Obj.Column(c,ColVisible,""))=Flag: Obj.Column(c,ColVisible,Flag); fi;
         od;
        od;
        r=if(s=1,2,3);
        z=z+1; Obj.Cell(r,1 ,CellContents,"Лист["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,2 ,CellContents,"R["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,3 ,CellContents,"D["+Format("%.2D",d0+z)+"]");
        z=z+1; Obj.Cell(r,5 ,CellContents,"Лист["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,6 ,CellContents,"R["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,7 ,CellContents,"D["+Format("%.2D",d0+z)+"]");
        z=z+1; Obj.Cell(r,9 ,CellContents,"Лист["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,10,CellContents,"R["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,11,CellContents,"D["+Format("%.2D",d0+z)+"]");
        z=z+1; Obj.Cell(r,13,CellContents,"Лист["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,14,CellContents,"R["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,15,CellContents,"D["+Format("%.2D",d0+z)+"]");
        z=z+1; Obj.Cell(r,17,CellContents,"Лист["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,18,CellContents,"R["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,19,CellContents,"D["+Format("%.2D",d0+z)+"]");
        z=z+1; Obj.Cell(r,21,CellContents,"Лист["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,22,CellContents,"R["+Format("%.2D",d0+z)+"]"); Obj.Cell(r,23,CellContents,"D["+Format("%.2D",d0+z)+"]");
       else
        Obj.Visible=False;
     fi;
  fi;
 od;
 for i=i1..i2 do
  Txt="<нет изображения>";
  Flag=КолЛист_>=i;
  if FindObject("Picture"+Str(i),Obj):
     if not (Flag and not Img[d0+i]="")=AsLogical(Obj.Visible):
        Obj.Visible=(Flag and not Img[d0+i]="");
     fi;
     if Flag and not Img[d0+i]="":
        Try
         Obj.LoadPicture(Img[d0+i]);
         Txt=" ";
        Except
         Trace("Не удалось загрузить изображение листа №"+Str(d0+i)+". ("+Img[d0+i]+")");
         Obj.Visible=False;
         Txt="<файл не найден>";
         Obj.Visible=False;
        end;
     fi;
  fi;
  if FindObject("Bevel"+Str(i),Obj):
     if not Flag=AsLogical(Obj.Visible):
        Obj.Visible=Flag;
     fi;
  fi;
  if FindObject("Label"+Str(i),Obj):
     if not Flag=AsLogical(Obj.Visible):
        Obj.Visible=Flag;
     fi;
     if not Txt=AsString(Obj.Caption):
        Obj.Caption=Txt;
     fi;
  fi;
 od;
 btnПредСтраница1.Enabled=Страница>1;
 btnПредСтраница2.Enabled=Страница>1;
 btnСледСтраница1.Enabled=КолЛист>MaxЛист and not Страница=Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1);
 btnСледСтраница2.Enabled=КолЛист>MaxЛист and not Страница=Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1);
 btnВыборСтраницы1.Enabled=КолЛист>MaxЛист;
 btnВыборСтраницы2.Enabled=КолЛист>MaxЛист;
end;

Proc Очистить;
var i:i;
 for i=1..КолЛист do
  if not Img[i]="":
     if ExistFile(Img[i]): DeleteFile(Img[i]); fi;
  fi;
 od;
 ClearVariable(Раб.Вспом.Сканер.Img);
 ТекЛист=1;
 КолЛист=1;
 Страница=1;
end;

Proc Init(step:i);
var wiaCommDlg: AutoObject;
var FS,FD,tmp:S;
var F:i;
 if Inited or Read_Only: Exit; fi;
 Inited=False;
 Try
  wiaCommDlg=CreateAutoObject("WIA.CommonDialog");
  Try
   Inited=True;
   Exit;
  Finally
   ClearVariable(wiaCommDlg);
  end;
 Except
  if not ErrorMessage="Недопустимая строка с указанием класса":
     Raise;
  fi;
 end;
 if step>0: Exit; fi;
 FS=Раб.Бюджет2005.Контроль2Слэш(PlanVar("Std_rpo")+"\Bin\wiaaut.dll");
 if not ExistFile(FS): Exit; fi;
 tmp=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\"+GetGUID);
 ExecuteProgram("cmd /q /c set windir >"+tmp,True);
 F=TextFileOpenRead(tmp,True);
 Try
  FD=TextFileReadLn(F);
 Finally
  TextFileClose(F);
  if ExistFile(tmp): DeleteFile(tmp); fi;
 end;
 FD=Раб.Бюджет2005.Контроль2Слэш(Trim(ExtractWord(2,FD,"="))+"\System32");
 if not ExistsFolder(FD): Exit; fi;
 FD=Раб.Бюджет2005.Контроль2Слэш(FD+"\wiaaut.dll");
 if not ExistFile(FD):
    CopyFile(FS,FD);
 fi;
 ExecuteProgram("RegSvr32.exe /s wiaaut.dll",True);
 Init(1);
end;

Func GetFlag(aVal:i; aFlag:I):L;
 ^BitAnd(aVal,aFlag)=aFlag;
end;

Proc GetInfoImage(aFileImage:S);
var wiaImage:AutoObject;
 wiaImage=CreateAutoObject("WIA.ImageFile");
 Try
  wiaImage.LoadFile(aFileImage);
  Trace("H="+AsString(wiaImage.Height));
  Trace("W="+AsString(wiaImage.Width));
  Trace("HR="+AsString(wiaImage.HorizontalResolution));
  Trace("VR="+AsString(wiaImage.VerticalResolution));
  Trace("PD="+AsString(wiaImage.PixelDepth));
 Finally
  ClearVariable(wiaImage);
 end;
end;

Func RotateImage(aFileImage:S; aAngle:I):L;
var wiaImage,wiaImageC,wiaImageProcess,wiaFilters,wiaFilterInfos,wiaFilterInfo,wiaFilter,wiaProperties,wiaProperty :AutoObject;
var i,nn :Integer;
var Filter :String;
var Flag:L;
 if not ExistFile(aFileImage): ^False; fi;
 wiaImage=CreateAutoObject("WIA.ImageFile");
 Try
  wiaImage.LoadFile(aFileImage);
  wiaImageProcess=CreateAutoObject("WIA.ImageProcess");
  Try
   wiaFilters=AsAutoObject(wiaImageProcess.Filters);
   Try
    wiaFilterInfos=AsAutoObject(wiaImageProcess.FilterInfos);
    Try
     nn=AsInteger(wiaFilterInfos.Count);
     Flag=False;
     for i=1..nn do
      wiaFilterInfo=AsAutoObject(wiaFilterInfos.Item[i]);
      Try
       if AsString(wiaFilterInfo.Name)='RotateFlip': Filter=AsString(wiaFilterInfo.FilterID); Flag=True; fi;
      Finally
       ClearVariable(wiaFilterInfo);
      end;
      if Flag: Break; fi;
     od;
    Finally
     ClearVariable(wiaFilterInfos);
    end;
    wiaFilters.Add(Filter);
    wiaFilter=AsAutoObject(wiaFilters.Item[1]);
    Try
     wiaProperties=AsAutoObject(wiaFilter.Properties);
     Try
      nn=AsInteger(wiaProperties.Count);
      Flag=False;
      for i=1..nn do
       wiaProperty=AsAutoObject(wiaProperties.Item[i]);
       Try
        if AsString(wiaProperty.Name)="RotationAngle": wiaProperty.Value=aAngle; Flag=True; fi;
       Finally
        ClearVariable(wiaProperty);
       end;
       if Flag: Break; fi;
      od;
     Finally
       ClearVariable(wiaProperties);
     end;
    Finally
      ClearVariable(wiaFilter);
    end;
   Finally
    ClearVariable(wiaFilters);
   end;
   wiaImageC=AsAutoObject(wiaImageProcess.Apply(wiaImage));
  Finally
   ClearVariable(wiaImageProcess);
  end;
  RenameFile(aFileImage,aFileImage+".bak");
  Try
   Try
    wiaImageC.SaveFile(aFileImage);
   Except
    if ExistFile(aFileImage+".bak"): RenameFile(aFileImage+".bak",aFileImage); fi;
   end;
  Finally
   if ExistFile(aFileImage+".bak"): DeleteFile(aFileImage+".bak"); fi;
  end;
 Finally
  ClearVariable(wiaImage);
  ClearVariable(wiaImageC);
 end;
 ^True;
end;

Func ResizeImage(aFileImage:S; aWidth:I; aHeight:I):L;
var wiaImage,wiaImageC,wiaImageProcess,wiaFilters,wiaFilterInfos,wiaFilterInfo,wiaFilter,wiaProperties,wiaProperty :AutoObject;
var i,nn :Integer;
var Filter :String;
var Flag:L;
 if not ExistFile(aFileImage): ^False; fi;
 wiaImage=CreateAutoObject("WIA.ImageFile");
 Try
  wiaImage.LoadFile(aFileImage);
  wiaImageProcess=CreateAutoObject("WIA.ImageProcess");
  Try
   wiaFilters=AsAutoObject(wiaImageProcess.Filters);
   Try
    wiaFilterInfos=AsAutoObject(wiaImageProcess.FilterInfos);
    Try
     nn=AsInteger(wiaFilterInfos.Count);
     Flag=False;
     for i=1..nn do
      wiaFilterInfo=AsAutoObject(wiaFilterInfos.Item[i]);
      Try
       if AsString(wiaFilterInfo.Name)='Scale': Filter=AsString(wiaFilterInfo.FilterID); Flag=True; fi;
      Finally
       ClearVariable(wiaFilterInfo);
      end;
      if Flag: Break; fi;
     od;
    Finally
     ClearVariable(wiaFilterInfos);
    end;
    wiaFilters.Add(Filter);
    wiaFilter=AsAutoObject(wiaFilters.Item[1]);
    Try
     wiaProperties=AsAutoObject(wiaFilter.Properties);
     Try
      nn=AsInteger(wiaProperties.Count);
      for i=1..nn do
       wiaProperty=AsAutoObject(wiaProperties.Item[i]);
       Try
        if AsString(wiaProperty.Name)='MaximumWidth':  wiaProperty.Value=aWidth; fi;
        if AsString(wiaProperty.Name)='MaximumHeight': wiaProperty.Value=aHeight; fi;
       Finally
        ClearVariable(wiaProperty);
       end;
      od;
     Finally
      ClearVariable(wiaProperties);
     end;
    Finally
     ClearVariable(wiaFilter);
    end;
   Finally
    ClearVariable(wiaFilters);
   end;
   wiaImageC=AsAutoObject(wiaImageProcess.Apply(wiaImage));
  Finally
   ClearVariable(wiaImageProcess);
  end;
  RenameFile(aFileImage,aFileImage+".bak");
  Try
   Try
    wiaImageC.SaveFile(aFileImage);
   Except
    if ExistFile(aFileImage+".bak"): RenameFile(aFileImage+".bak",aFileImage); fi;
   end;
  Finally
   if ExistFile(aFileImage+".bak"): DeleteFile(aFileImage+".bak"); fi;
  end;
 Finally
  ClearVariable(wiaImage);
  ClearVariable(wiaImageC);
 end;
 ^True;
end;

Func ConvertImage(aFileImage:S; aFormat:S; aQuality:I):L;
var wiaImage,wiaImageC,wiaImageProcess,wiaFilters,wiaFilterInfos,wiaFilterInfo,wiaFilter,wiaProperties,wiaProperty :AutoObject;
var i,nn :Integer;
var Filter :String;
var Flag:L;
 if not ExistFile(aFileImage): ^False; fi;
 wiaImage=CreateAutoObject("WIA.ImageFile");
 Try
  wiaImage.LoadFile(aFileImage);
  if not AsString(wiaImage.FormatID)=aFormat:
     wiaImageProcess=CreateAutoObject("WIA.ImageProcess");
     Try
      wiaFilters=AsAutoObject(wiaImageProcess.Filters);
      Try
       wiaFilterInfos=AsAutoObject(wiaImageProcess.FilterInfos);
       Try
        nn=AsInteger(wiaFilterInfos.Count);
        Flag=False;
        for i=1..nn do
         wiaFilterInfo=AsAutoObject(wiaFilterInfos.Item[i]);
         Try
          if AsString(wiaFilterInfo.Name)='Convert': Filter=AsString(wiaFilterInfo.FilterID); Flag=True; fi;
         Finally
          ClearVariable(wiaFilterInfo);
         end;
         if Flag=True: Break; fi;
        od;
       Finally
        ClearVariable(wiaFilterInfos);
       end;
       wiaFilters.Add(Filter);
       wiaFilter=AsAutoObject(wiaFilters.Item[1]);
       Try
        wiaProperties=AsAutoObject(wiaFilter.Properties);
        Try
         nn=AsInteger(wiaProperties.Count);
         for i=1..nn do
          wiaProperty=AsAutoObject(wiaProperties.Item[i]);
          Try
           if AsString(wiaProperty.Name)='FormatID': wiaProperty.Value=aFormat; fi;
           if AsString(wiaProperty.Name)='Quality': wiaProperty.Value=aQuality; fi;
          Finally
           ClearVariable(wiaProperty);
          end;
         od;
        Finally
         ClearVariable(wiaProperties);
        end;
       Finally
        ClearVariable(wiaFilter);
       end;
      Finally
       ClearVariable(wiaFilters);
      end;
      wiaImageC=AsAutoObject(wiaImageProcess.Apply(wiaImage));
     Finally
      ClearVariable(wiaImageProcess);
     end;
     RenameFile(aFileImage,aFileImage+".bak");
     Try
      Try
       wiaImageC.SaveFile(aFileImage);
      Except
       if ExistFile(aFileImage+".bak"): RenameFile(aFileImage+".bak",aFileImage); fi;
      end;
     Finally
      if ExistFile(aFileImage+".bak"): DeleteFile(aFileImage+".bak"); fi;
     end;
  fi;
 Finally
  ClearVariable(wiaImage);
  ClearVariable(wiaImageC);
 end;
 ^True;
end;

Func GetDeviceName(wiaDev:AutoObject):S;
var wiaItem,wiaProperties:AutoObject;
var i,count:i;
 wiaProperties=AsAutoObject(wiaDev.Properties);
 Try
  count=AsInteger(wiaProperties.Count);
  for i=1..count do
   wiaItem=AsAutoObject(wiaProperties.Item[i]);
   Try
    if asString(wiaItem.Name)="Name": ^asString(wiaItem.Value); fi;
   Finally
    ClearVariable(wiaItem);
   end;
  od;
 Finally
  ClearVariable(wiaProperties);
 end;
 ^"";
end;

Proc ShowDevProperties(wiaDev:AutoObject);
var wiaDevProperties,wiaItem,wiaSubTypeValues: AutoObject;
var i,count,c,cc,Val:i;
var Name,ID:S;
 Trace("---Device Properties---");
 wiaDevProperties=AsAutoObject(wiaDev.Properties);
 Try
  count=AsInteger(wiaDevProperties.Count);
  Trace("Properties.Count="+Str(count));
  for i=1..count do
   wiaItem=AsAutoObject(wiaDevProperties.Item[i]);
   Try
    Trace("----------");
    Name=AsString(wiaItem.Name);
    Trace(Str(i)+">Properts.Name="+Name);
    ID=AsString(wiaItem.PropertyID);
    Trace(Str(i)+">Properts.PropertyID="+ID);
    Trace(Str(i)+">Properts.IsReadOnly="+AsString(wiaItem.IsReadOnly));
    Trace(Str(i)+">Properts.IsVector="+AsString(wiaItem.IsVector));
    val=AsInteger(wiaItem.SubType);
    Trace(Str(i)+">Properts.SubType="+if(val=0:"UnspecifiedSubType"|val=1:"RangeSubType"|val=2:"ListSubType"|val=3:"FlagSubType"|true:"ХЗ"));
    Try Trace(Str(i)+">Properts.SubTypeDefault="+AsString(wiaItem.SubTypeDefault)); Except end;
    if val=1:
       Try Trace(Str(i)+">Properts.SubTypeMax="+AsString(wiaItem.SubTypeMax)); Except end;
       Try Trace(Str(i)+">Properts.SubTypeMin="+AsString(wiaItem.SubTypeMin)); Except end;
       Try Trace(Str(i)+">Properts.SubTypeStep="+AsString(wiaItem.SubTypeStep)); Except end;
    fi;
    Try Trace(Str(i)+">Properts.SubTypeValues="+AsString(wiaItem.SubTypeValues)); Except end;
    Try Trace(Str(i)+">Properts.Type="+AsString(wiaItem.Type)); Except end;
    Try Trace(Str(i)+">Properts.Value="+AsString(wiaItem.Value)); Except Trace(Str(i)+">Property.Value=???"); end;
    if val=2 or val=3:
       wiaSubTypeValues=AsAutoObject(wiaItem.SubTypeValues);
       Try
        cc=AsInteger(wiaSubTypeValues.Count);
        Trace(Str(i)+">Properts.SubTypeValues.Count="+Str(cc));
        Trace(Str(i)+">Properts.SubTypeValues.String="+AsString(wiaSubTypeValues.Count));
        for c=1..cc do
         Trace(Str(i)+">Properts.SubTypeValues("+Str(c)+")="+AsString(wiaItem.SubTypeValues[c]));
        od;
       Finally
        ClearVariable(wiaSubTypeValues);
       end;
    fi;
   Finally
    ClearVariable(wiaItem);
   end;
  od;
 Finally
  ClearVariable(wiaDevProperties);
 end;
end;

Func GetDocumentHandlingStatus(wiaDev:AutoObject):I;
var wiaDevProperties,wiaItem:AutoObject;
var count,i:i;
 wiaDevProperties=AsAutoObject(wiaDev.Properties);
 Try
  count=AsInteger(wiaDevProperties.Count);
  for i=1..count do
   wiaItem=AsAutoObject(wiaDevProperties.Item[i]);
   Try
    if AsString(wiaItem.Name)="Document Handling Status" or AsInteger(wiaItem.PropertyID)=3087:
       ^AsInteger(wiaItem.Value);
    fi;
   Finally
    ClearVariable(wiaItem);
   end;
  od;
 Finally
  ClearVariable(wiaDevProperties);
 end;
 ^0;
end;

Proc DocumentHandlingSelect(wiaDev:AutoObject; Flag:L; fDup:L);
var wiaDevProperties,wiaItem:AutoObject;
var count,i,brk:i;
var v3086,v3088,ID:I;
var Name:S;
var Херокс:L;
 wiaDevProperties=AsAutoObject(wiaDev.Properties);
 Try
  count=AsInteger(wiaDevProperties.Count);
  brk=0;
  for i=1..count do
   wiaItem=AsAutoObject(wiaDevProperties.Item[i]);
   Try
    Name=AsString(wiaItem.Name);
    ID=AsInteger(wiaItem.PropertyID);
    if Name="Document Handling Capabilities" or ID=3086:
       v3086=AsInteger(wiaItem.Value);
       brk=brk+1;
    fi;
    if Name="Document Handling Select" or ID=3088:
       v3088=AsInteger(wiaItem.Value);
       brk=brk+1;
    fi;
   Finally
    ClearVariable(wiaItem);
   end;
   if brk=2: Break; fi;
  od;
  if Flag:
     brk=0;
     for i=1..count do
      wiaItem=AsAutoObject(wiaDevProperties.Item[i]);
      Try
       Name=AsString(wiaItem.Name);
       ID=AsInteger(wiaItem.PropertyID);
       if Name="Document Handling Select" or ID=3088:
          if (GetFlag(v3086,FEED) and CurrentDocumentHandling=FEEDER) or (GetFlag(v3086,FLAT) and CurrentDocumentHandling=FLATBED) or (GetFlag(v3086,DUP) and CurrentDocumentHandling=DUPLEX):
             if CurrentDocumentHandling=FEEDER or CurrentDocumentHandling=DUPLEX:
                CurrentDocumentHandling=if(fDup and GetFlag(v3086,DUP),DUPLEX,FEEDER);
             fi;
             Try
              Херокс=False;
              wiaItem.Value=CurrentDocumentHandling;
             Except
              Херокс=True; --хероксы под win7 могут не примать целое число
             end;
             if Херокс:
                wiaItem.Value=Str(CurrentDocumentHandling);
             fi;
          fi;
          CurrentDocumentHandling=AsInteger(wiaItem.Value);
          brk=brk+1;
       fi;
       if Name="Pages" or ID=3096: --задаем количество листов заглатываемых податчиком (на некотрых гнусмасах 0 означает сожрать все листы)
          if not AsLogical(wiaItem.IsReadOnly) and CurrentDocumentHandling=FEEDER:
             wiaItem.Value=1;
          fi;
          brk=brk+1;
       fi;
      Finally
       ClearVariable(wiaItem);
      end;
      if brk=2: Break; fi;
     od;
  fi;
 Finally
  ClearVariable(wiaDevProperties);
 end;
 if not Flag:
    if GetFlag(v3086,FEED) and GetFlag(v3086,FLAT):
       ClearVariable(Buf);
       Buf[1]="Податчик документов";
       Buf[2]="Планшет";
       i=Alternate("Выберите тип подачи бумаги",Buf,-1,CurrentDocumentHandling,12);
       if i=1: CurrentDocumentHandling=FEEDER;
         |i=2: CurrentDocumentHandling=FLATBED;
       fi;
      else
       CurrentDocumentHandling=v3088;
       if CurrentDocumentHandling=DUPLEX: CurrentDocumentHandling=FEEDER; fi;
    fi;
 fi;
 enableDuplex=False;
 if GetFlag(v3086,FEED):
    enableDuplex=GetFlag(v3086,DUP);
 fi;
 btnСканСлед2.Enabled=not Read_Only and enableDuplex;
end;

Func Сканировать(aFolder:S; Sender:S):L;
var wiaDevMngr,wiaDevInfos,wiaDevInfo,wiaCommDlg,wiaDev,wiaItems,wiaItem,wiaProperties,wiaProperty,wiaImage:AutoObject;
var i,count,status,H,W,HR,VR,PD,brk,ID,z,ard:i;
var Name,FID,vFileImage:S;
var Flag:L;
var vmin,vmax,vdef,val,vstep,vrange:i;
 СканЛист=0;
 wiaCommDlg=CreateAutoObject("WIA.CommonDialog");
 Try
  if stateUI=1:
     wiaImage=AsAutoObject(wiaCommDlg.ShowAcquireImage(ScannerDeviceType,ImageIntent,ImageBias,ImageFormat,False,True,True));
     Try
      wiaImage.SaveFile(vFileImage);
     Finally
      ClearVariable(wiaImage);
     end;
    else
     if stateUI=0: 
        ImageResolution=150;
        ImageIntent=CurrentIntent;
        ImageFormat=wiaFormatJPEG;
     fi;
     if CurrentDeviceID="":
        wiaDev=AsAutoObject(wiaCommDlg.ShowSelectDevice(ScannerDeviceType,False,True));
       else
        wiaDevMngr=CreateAutoObject("WIA.DeviceManager");
        Try
         wiaDevInfos=AsAutoObject(wiaDevMngr.DeviceInfos);
         Try
          count=AsInteger(wiaDevInfos.Count);
          Flag=False;
          for i=1..count do
           wiaDevInfo=AsAutoObject(wiaDevInfos.Item[i]);
           Try
            if AsString(wiaDevInfo.DeviceID)=CurrentDeviceID:
               wiaDev=AsAutoObject(wiaDevInfo.Connect);
               Flag=True;
            fi;
           Finally
            ClearVariable(wiaDevInfo);
           end;
           if Flag: Break; fi;
          od;
         Finally
          ClearVariable(wiaDevInfos);
         end;
        Finally
         ClearVariable(wiaDevMngr);
        end;
        if not Flag: 
           wiaDev=AsAutoObject(wiaCommDlg.ShowSelectDevice(ScannerDeviceType,True,True));
           CurrentDocumentHandling=0;
        fi;
     fi;
     Try
      CurrentDeviceID=AsString(wiaDev.DeviceID);
      CurrentDeviceName=GetDeviceName(wiaDev);
      DocumentHandlingSelect(wiaDev,True,Sender="btnСканСлед2");
      wiaItems=AsAutoObject(wiaDev.Items);
      Try
       wiaItem=AsAutoObject(wiaItems.Item[1]);
       Try
        wiaProperties=AsAutoObject(wiaItem.Properties);
        Try
         count=AsInteger(wiaProperties.Count);
         brk=0;
         for i=1..Count do
          wiaProperty=AsAutoObject(wiaProperties.Item[i]);
          Try
           Name=AsString(wiaProperty.Name);
           ID=AsInteger(wiaProperty.PropertyID);
           if Name="Horizontal Resolution" or ID=6147 or Name="Vertical Resolution" or ID=6148:
              wiaProperty.Value=ImageResolution;
              brk=brk+1;
           fi;
           if Name="Current Intent" or ID=6146:
              wiaProperty.Value=ImageIntent;
              brk=brk+1;
           fi;
           if Name="Horizontal Extent Value" or ID=6151: --задаем область сканирования (на некоторых сканерах типа Canon там лежит некое произвольное значение)
              if AsInteger(wiaProperty.SubType)=1:
                 z=Int(210/25.4*ImageResolution); --A4 в дюймах
                 wiaProperty.Value=Min(AsInteger(wiaProperty.SubTypeMax),z);
              fi;
              brk=brk+1;
           fi;
           if Name="Vertical Extent Value" or ID=6152:
              if AsInteger(wiaProperty.SubType)=1:
                 z=Int(297/25.4*ImageResolution); --A4 в дюймах
                 wiaProperty.Value=Min(AsInteger(wiaProperty.SubTypeMax),z);
              fi;
              brk=brk+1;
           fi;
           if Name="Brightness" or ID=6154:
              if AsInteger(wiaProperty.SubType)=1:
                 vmin=AsInteger(wiaProperty.SubTypeMin);
                 vmax=AsInteger(wiaProperty.SubTypeMax);
                 vdef=AsInteger(wiaProperty.SubTypeDefault);
                 vstep=AsInteger(wiaProperty.SubTypeStep);
                 val=AsInteger(wiaProperty.Value);
                 if Яркость>0:
                    z=vdef-Int((vdef-vmin)*Яркость/100);
                    if not z=val:
                       wiaProperty.Value=z;
                    fi;
                   |Яркость<0:
                    z=vdef+Int((vmax-vdef)*Abs(Яркость)/100);
                    if not z=val:
                       wiaProperty.Value=z;
                    fi;
                   |True:
                    if not val=vdef:
                       wiaProperty.Value=vdef;
                    fi;
                 fi;
              fi;
              brk=brk+1;
           fi;
           if Name="Contrast" or ID=6155:
              if AsInteger(wiaProperty.SubType)=1:
                 vmin=AsInteger(wiaProperty.SubTypeMin);
                 vmax=AsInteger(wiaProperty.SubTypeMax);
                 vdef=AsInteger(wiaProperty.SubTypeDefault);
                 vstep=AsInteger(wiaProperty.SubTypeStep);
                 val=AsInteger(wiaProperty.Value);
                 if Контраст>0:
                    z=vdef-Int((vdef-vmin)*Контраст/100);
                    if not z=val:
                       wiaProperty.Value=z;
                    fi;
                   |Контраст<0:
                    z=vdef+Int((vmax-vdef)*Abs(Контраст)/100);
                    if not z=val:
                       wiaProperty.Value=z;
                    fi;
                   |True:
                    if not val=vdef:
                       wiaProperty.Value=vdef;
                    fi;
                 fi;
              fi;
              brk=brk+1;
           fi;
          Finally
           ClearVariable(wiaProperty);
          end;
          if brk=7: Break; fi;
         od;
        Finally
         ClearVariable(wiaProperties);
        end;
        Try
         z=0; ard=0;
         While True do
          wiaImage=AsAutoObject(wiaCommDlg.ShowTransfer(wiaItem,wiaFormatBMP,True));
          status=GetDocumentHandlingStatus(wiaDev);
          z=z+1; ard=ard+1;
          СканЛист=СканЛист+1;
          vFileImage=aFolder+GetGUID+".jpg";
          Try
           if stateUI=0:
              H =AsInteger(wiaImage.Height);
              W =AsInteger(wiaImage.Width);
              HR=Int(AsReal(wiaImage.HorizontalResolution));
              VR=Int(AsReal(wiaImage.VerticalResolution));
              PD=AsInteger(wiaImage.PixelDepth);
              FID=AsString(wiaImage.FormatID);
           fi;
           if ExistFile(vFileImage): DeleteFile(vFileImage); fi;
           wiaImage.SaveFile(vFileImage);
           if stateUI=0:
              if W>1240 or H>1754:
                 if not ResizeImage(vFileImage,1240,1754): ^False; fi;
              fi;
              if not FID=ImageFormat:
                 if not ConvertImage(vFileImage,ImageFormat,Качество): ^False; fi;
              fi;
           fi;
           if Sender="btnСканСлед2" and enableDuplex and not AutoRotateDup=0 and ARD=2:
              RotateImage(vFileImage,AutoRotateDup);
              ARD=0;
           fi;
           if not CurrentRotateImage=0:
              RotateImage(vFileImage,CurrentRotateImage);
           fi;
           --GetInfoImage(vFileImage);
          Finally
           ClearVariable(wiaImage);
          end;
          if СканЛист>1:
             ТекЛист=ТекЛист+1;
             if КолЛист<ТекЛист: КолЛист=КолЛист+1; fi;
             if Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1)>Max(1,Страница):
                Страница=Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1);
                if not HideDlg:
                   Оформление(0);
                fi;
             fi;
          fi;
          --if КолЛист<=MaxЛист:
             if ExistFile(Img[ТекЛист]): DeleteFile(Img[ТекЛист]); fi;
             Img[ТекЛист]=vFileImage;
             if not HideDlg:
                Оформление(ТекЛист);
                Template.Field="Лист["+Format("%.2D",ТекЛист)+"]";
             fi;
          --fi;
--          if КолЛист=MaxЛист and GetFlag(status,FEED_READY):
--             Message("Достигнуто максимальное количество листов ("+Str(MaxЛист)+")^MДальнейшее сканирование отменено",mtWarning);
--          fi;
--          if not GetFlag(status,FEED_READY) or КолЛист=MaxЛист or CurrentDocumentHandling=FLATBED:
--             ТекЛист=Min(ТекЛист,MaxЛист);
--             КолЛист=Min(КолЛист,MaxЛист);
--             Break;
--          fi;
--          ShowDevProperties(wiaDev);
          if not GetFlag(status,FEED_READY) or CurrentDocumentHandling=FLATBED:
             Break;
          fi;
          if Sender="btnСкан" and not Img[ТекЛист+1]="":
             if EnqOkCancel("Лист №"+Str(ТекЛист+1)+" будет отсканирован заново, продолжить ?",mtWarning)=cmCancel: ^True; fi;
          fi;
         od;
        Except
         if ErrorMessage="The user requested a scan and there are no documents left in the document feeder" or
            ErrorMessage="Пользователь запросил сканирование, но в податчике документов ничего не осталось":
--            ТекЛист=Min(ТекЛист,MaxЛист);
--            КолЛист=Min(КолЛист,MaxЛист);
            if z=0:
               Message(ErrorMessage,mtError);
            fi;
           else
            if not HideDlg: Оформление(0); fi;
            Raise;
         fi;
        end;
       Finally
        ClearVariable(wiaItem);
       end;
      Finally
       ClearVariable(wiaItems);
      end;
     Finally
      ClearVariable(wiaDev);
     end;
  fi;
 Finally
  ClearVariable(wiaCommDlg);
 end;
 ^True;
end;

Func Импортировать(aFolder:S; Sender:S):L;
--Считывает страницу документа из файла.
var wiaImage:AutoObject;
var i,count,status,H,W,HR,VR,PD,brk,ID,z,ard:i;
var Name,FID,vFileImage:S;
var Flag:L;
var vmin,vmax,vdef,val,vstep,vrange:i;
var srcFile:S;
 СканЛист=0;
 if ChooseFile(srcFile,"Выберите отсканированную страницу","Файлы JPEG (*.jpg)|*.jpg")<>cmOk:
    return False;
 fi;

 vFileImage=Раб.Бюджет2005.tempfile(aFolder,"jpg");
 CopyFile(srcFile,vFileImage);
 wiaImage=CreateAutoObject("WIA.ImageFile");
 Try
  wiaImage.LoadFile(vFileImage);
  if stateUI=0:
     H =AsInteger(wiaImage.Height);
     W =AsInteger(wiaImage.Width);
     HR=Int(AsReal(wiaImage.HorizontalResolution));
     VR=Int(AsReal(wiaImage.VerticalResolution));
     PD=AsInteger(wiaImage.PixelDepth);
     FID=AsString(wiaImage.FormatID);
  fi;
 finally
  Clearvariable(wiaImage);
 end;

 if stateUI=0:
    if W > H:
      if H>1240 or W>1754:
         if not ResizeImage(vFileImage,1754,1240): ^False; fi;
      fi;
     else
      if W>1240 or H>1754:
         if not ResizeImage(vFileImage,1240,1754): ^False; fi;
      fi;
    fi;
    if not FID=wiaFormatJPEG:
       if not ConvertImage(vFileImage,wiaFormatJPEG,Качество): ^False; fi;
    fi;
 fi;

 if ExistFile(Img[ТекЛист]): DeleteFile(Img[ТекЛист]); fi;
 Img[ТекЛист]=vFileImage;
 ^True;
end;


Func СохранГЭК(aДок:S; aЗапись:I; aТип:S):L;
var OWA,i,n,nr,vr,z:I;
var Штамп_,oldПуть_,oldПапка_,Папка_,Путь_,Файл_,F:S;
var Err,Cr,Rn,oldRn:L;
 if not CanInsert(SelfCrd) or not CanDelete(SelfCrd): Message("Вы не обладаете достаточными правами для выполнения данной операции",mtError); ^False; fi;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ. Сохранение отменено",mtError); ^False; fi;
 if aТип="": Message("Не указан тип изображения. Сохранение отменено",mtError); ^False; fi;
 if RootFolderImage="": Настр(False); fi;
 if Сеанс="": Сеанс=GetGUID; fi;
 Штамп_=DateToString(ToDay)+" "+Раб.Бюджет2005.TimeToStr(Time,"HH:MM:SS");
 Cr=False;
 Rn=False;
 oldRn=False;
 Err=False;
 F="Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Тип='"+aТип+"'";
 OWA=OpenWorkArea(SelfCrd,"",F+if(fСеанс," and Сеанс='"+Сеанс+"'",""));
 Try
  nr=Records(OWA);
  if nr=0:
     vr=Раб.Обл.СледФ(SelfCrd,"Вариант",F);
     Папка_=extПапка+aДок+"{"+Str(aЗапись)+"}."+Format("%.3D",vr);
     Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolderImage+"\"+Папка_);
     if not ExistsFolder(Путь_): CreateFolder(Путь_); Cr=True; fi;
    else
     if not CanDelete(SelfCrd): Message("Вы не обладаете достаточными правами для выполнения данной операции",mtError); ^False; fi;
     vr=GetFieldI(OWA,1,"Вариант");
     oldПапка_=GetFieldS(OWA,1,"Папка");
     oldПуть_=Раб.Бюджет2005.Контроль2Слэш(RootFolderImage+"\"+oldПапка_);
     if ExistsFolder(oldПуть_):
        RenameFolder(oldПуть_,oldПуть_+".bak");
        oldRn=True;
     fi;
     Папка_=extПапка+aДок+"{"+Str(aЗапись)+"}."+Format("%.3D",vr);
     Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolderImage+"\"+Папка_);
     if not ExistsFolder(Путь_):
        CreateFolder(Путь_);
        Cr=True;
       else
        RenameFolder(Путь_,Путь_+".bak");
        Rn=True;
        CreateFolder(Путь_);
        Cr=True;
     fi;
  fi;
  BeginChanging(OWA,False);
  Try
   if not nr=0:
      DeleteAllRecords(OWA);
   fi;
   z=0;
   for i=1..КолЛист do
    if not Img[i]="":
       if not ExistFile(Img[i]): Message("Файл "+Img[i]+" не найден. Сохранение отменено",mtError); ^False; fi;
       Файл_="Лист"+Format("%.4D",i)+"."+aТип;
       z=z+1;
       n=InsertRecord(OWA);
       n=PutFieldS(OWA,n,"Док",aДок);
       n=PutFieldI(OWA,n,"Запись",aЗапись);
       n=PutFieldI(OWA,n,"Лист",z);
       n=PutFieldS(OWA,n,"Папка",Папка_);
       n=PutFieldS(OWA,n,"Файл",Файл_);
       n=PutFieldS(OWA,n,"Тип",aТип);
       n=PutFieldS(OWA,n,"Коммент","");
       n=PutFieldI(OWA,n,"Вариант",vr);
       n=PutFieldS(OWA,n,"Штамп",Штамп_);
       n=PutFieldS(OWA,n,"Сеанс",Сеанс);
       n=PutFieldS(OWA,n,"ТФФ","2009 v2.0");
       n=PutFieldS(OWA,n,"РПО_Ключ",vКлюч);
       CopyFile(Img[i],Путь_+"\"+Файл_);
    fi;
   od;
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Err=True;
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
  if Err:
     if Cr:
        for n=1..i do
         Файл_="Лист"+Format("%.2D",i)+"."+aТип;
         if ExistFile(Путь_+"\"+Файл_): DeleteFile(Путь_+"\"+Файл_); fi;
         Файл_="Лист"+Format("%.4D",i)+"."+aТип;
         if ExistFile(Путь_+"\"+Файл_): DeleteFile(Путь_+"\"+Файл_); fi;
        od;
        DeleteFolder(Путь_);
     fi;
     if Rn:
        RenameFolder(Путь_+".bak",Путь_);
     fi;
     if oldRn:
        RenameFolder(oldПуть_+".bak",oldПуть_);
     fi;
    else
     if Rn:
        if ExistsFolder(Путь_+".bak"): DeleteFolder(Путь_+".bak"); fi;
     fi;
     if oldRn:
        if ExistsFolder(oldПуть_+".bak"): DeleteFolder(oldПуть_+".bak"); fi;
     fi;
  fi;
 end;
 ^True;
end;

Func ЗагрузГЭК(aДок:S; aЗапись:I; aТип:S):I;
var OWA,n,nr,vr:I;
var Name,Путь_,Папка_,Файл_:S;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ. Загрузка отменена",mtError); ^-1; fi;
 if aТип="": Message("Не указан тип изображения. Загрузка отменена",mtError); ^-1; fi;
 if RootFolderImage="": Настр(False); fi;
 OWA=OpenWorkArea(SelfCrd,"Вариант;Лист","Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Тип='"+aТип+"'");
 Try
  nr=Records(OWA);
  if nr=0: ^nr; fi;
  vr=GetFieldI(OWA,nr,"Вариант");
  SetFilter(OWA,"Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Тип='"+aТип+"' and Вариант="+Str(vr));
  nr=Records(OWA);
  if nr=0: ^nr; fi;
  ClearVariable(Раб.Вспом.Сканер.Buf);
  Папка_=GetFieldS(OWA,nr,"Папка");
  Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolderImage+"\"+Папка_);
  for n=1..nr do
   Name=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\"+GetGUID+"."+GetFieldS(OWA,n,"Тип"));
   Buf[n]=Name;
   Файл_=GetFieldS(OWA,n,"Файл");
   if ExistFile(Путь_+"\"+Файл_):
      CopyFile(Путь_+"\"+Файл_,Name);
     else
      Trace("Загрузка файла. Файл "+Путь_+"\"+Файл_+" не найден. Пропущен.");
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 Сеанс=GetGUID;
 Очистить;
 CopyArray(Раб.Вспом.Сканер.Buf,Раб.Вспом.Сканер.Img);
 КолЛист=Max(LengthOfArray(Раб.Вспом.Сканер.Img),1);
 ^LengthOfArray(Раб.Вспом.Сканер.Img);
end;

Func УдалитьГЭК(aДок:S; aЗапись:I; aТип:S):L;
var OWA,nr:i;
var Путь_,Папка_:S;
 if not CanDelete(SelfCrd): Message("Вы не обладаете достаточными правами для выполнения данной операции",mtError); ^False; fi;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ. Удаление отменено",mtError); ^False; fi;
 if RootFolderImage="": Настр(False); fi;
 OWA=OpenWorkArea(SelfCrd,"Вариант;Лист","Док='"+aДок+"' and Запись="+Str(aЗапись)+if(aТип="",""," and Тип='"+aТип+"'"));
 Try
  nr=Records(OWA);
  if not nr=0:
     Папка_=GetFieldS(OWA,nr,"Папка");
     Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolderImage+"\"+Папка_);
     if ExistsFolder(Путь_):
        RenameFolder(Путь_,Путь_+".bak");
     fi;
     BeginChanging(OWA,False);
     Try
      DeleteAllRecords(OWA);
     Except
      CancelChanging(OWA);
      if ExistsFolder(Путь_+".bak"):
         RenameFolder(Путь_+".bak",Путь_);
      fi;
      Raise;
     end;
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 if ExistsFolder(Путь_+".bak"):
    DeleteFolder(Путь_+".bak");
 fi;
 ^True;
end;

Func ЧитатьГЭК(aДок:S; aЗапись:I; aТип:S; New:L):I;
var OWA,n,nr,vr,nn:i;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ",mtError); ^-1; fi;
 if aТип="": Message("Не указан тип изображения",mtError); ^-1; fi;
 if RootFolderImage="": Настр(False); fi;
 if New: ClearVariable(Раб.Вспом.Сканер.ФайлГЭК); fi;
 nn=LengthOfArray(Раб.Вспом.Сканер.ФайлГЭК);
 OWA=OpenWorkArea(SelfCrd,"Вариант;Лист","Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Тип='"+aТип+"'");
 Try
  nr=Records(OWA);
  if nr=0: ^nr; fi;
  vr=GetFieldI(OWA,nr,"Вариант");
  SetFilter(OWA,"Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Тип='"+aТип+"' and Вариант="+Str(vr));
  nr=Records(OWA);
  for n=1..nr do
   ФайлГЭК[nn+n]=Раб.Бюджет2005.Контроль2Слэш(RootFolderImage+"\"+GetFieldS(OWA,nr,"Папка")+"\"+GetFieldS(OWA,n,"Файл"));
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 ^nn+nr;
end;

Func JpegToPdfТБ(aPdf:S; aMsg:L):I;
var Exe,lst:s;
var Flst,n,nn:I;
 if aPdf="": 
    if aMsg: Message("Укажите целевой файл",mtError); fi; 
    ^-1;
 fi;
 if Путьjpeg2pdf="":
    Exe=Раб.Бюджет2005.Контроль2Слэш(PlanVar("Std_rpo")+"\Bin\jpeg2pdf.exe");
   else
    Exe=Раб.Бюджет2005.Контроль2Слэш(Путьjpeg2pdf+"\jpeg2pdf.exe");
 fi;
 if not ExistFile(Exe): 
    if aMsg: Message("Не найден исполняемый файл^M"+Exe,mtError); fi;
    ^-2; 
 fi;
 nn=LengthOfArray(Раб.Вспом.Сканер.ФайлГЭК);
 if nn=0: 
    if aMsg: Message("Список файлов пуст",mtError); fi;
    ^-3; 
 fi;
 lst=Раб.Бюджет2005.Контроль2Слэш(PlanVar("Cache")+"\"+GetGUID);
 Try
  Flst=TextFileCreate(lst);
  Try
   for n=1..nn do
    TextFileWriteLn(Flst,ФайлГЭК[n]);
   od;
  Finally
   TextFileClose(Flst);
  end;
  n=ExecuteProgram(exe+' "'+lst+'" "'+aPdf+'" /s',True);
  if not ExistFile(aPdf): ^-99; fi;
 Finally
  if ExistFile(lst): DeleteFile(lst); fi;
 end;
 ^1;
end;

Func JpegToPdfPy(aPdf:S; aMsg:L):I;
var n,nn:I;
 if aPdf="": 
    if aMsg: Message("Укажите целевой файл",mtError); fi; 
    ^-1;
 fi;
 nn=LengthOfArray(Раб.Вспом.Сканер.ФайлГЭК);
 if nn=0: 
    if aMsg: Message("Список файлов пуст",mtError); fi;
    ^-3; 
 fi;
 if Раб.Python.LoadAndImport("fpdf",False):
    try
      Раб.Python.Exec("pdf=fpdf.FPDF()");
      for n=1..nn do
         Раб.Python.Exec("pdf.add_page()");
         Раб.Python.Exec("pdf.image(r'"+ФайлГЭК[n]+"',0,0)");
      od;
      Раб.Python.Exec("pdf.output(r'"+aPdf+"')");
    Finally
      Раб.Python.Unload;
    end;
    if not ExistFile(aPdf): ^-99; fi;
 else
    --if aMsg: Message("Ошибка загрузки генератора PDF",mtError); fi;
    ^-2; 
 fi;
 ^1;
end;

Func JpegToPdf(aPdf:S; aMsg:L):I;
var r:I;
 r=JpegToPdfPy(aPdf,aMsg);
 if r=-2:
    ^JpegToPdfТБ(aPdf,aMsg);
   else
    ^r;
 fi;
end;

Func Вызвать (aЗагл:S; aДок:S; aЗапись:I; aТип:S; aReadOnly:L; aDlg:L):L;
var n,hCRI:i;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ",mtError); ^False; fi;
 n=0;
 Очистить;
 Загл=aЗагл;
 vДок=aДок;
 vЗапись=aЗапись;
 vТип=if(aТип="","jpg",aТип);
 Read_Only=aReadOnly;
 HideDlg=False;
 if ЗагрузГЭК(vДок,vЗапись,vТип)=0:
    HideDlg=not aDlg;
    if HideDlg:
       ClearVariable(Раб.Вспом.сканер.Buf);
       Раб.Вспом.сканер.Buf[1]="Книжная ориентация";
       Раб.Вспом.сканер.Buf[2]="Альбомная ориентация (поворот на 90)";
       Раб.Вспом.сканер.Buf[3]="Альбомная ориентация (поворот на 270)";
       Раб.Вспом.сканер.Buf[4]="Поворот изображения на 180 (лист перевернут)";
       n=Alternate("Выберите ориентацию листа",Раб.Вспом.сканер.Buf,-1,hPosCRI,12);
       if not n=0:
          hPosCRI=n;
          hCRI=CurrentRotateImage;
          CurrentRotateImage=if(n=1:0|n=2:90|n=3:270|n=4:180|true:CurrentRotateImage);
       fi;
    fi;
 fi;
 OpenBlank(SelfBln,True);
 if not n=0:
    CurrentRotateImage=hCRI;
 fi;
 ^True;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func RootFolderImage_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if not ExistsFolder(Value):
    Message("Папка "+Value+" не существует",mtError);
    ^False;
 fi;
 Return True;
end;

Proc RootFolderImage_OnExit(FieldName: String; Iter: Integer);
 Настр(True);
end;

Func RootFolderImage_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var i:i;
 Template.HideEditor(False);
 i=ChooseFolder(RootFolderImage,"Выберите папку для хранения изображений");
 Return Cur;
end;

Func CurrentDeviceName_OnEnter(FieldName: String; Iter: Integer): logical;
var wiaCommDlg,wiaDev: AutoObject;
 Try
  wiaCommDlg=CreateAutoObject("WIA.CommonDialog");
  Try
   wiaDev=AsAutoObject(wiaCommDlg.ShowSelectDevice(ScannerDeviceType,True,True));
   Try
    CurrentDeviceID=AsString(wiaDev.DeviceID);
    CurrentDeviceName=GetDeviceName(wiaDev);
   Finally
    ClearVariable(wiaDev);
   end;
  Finally
   ClearVariable(wiaCommDlg);
  end;
 Except
  Message(ErrorMessage);
 end;
 ClearVariable(CurrentDocumentHandling);
 Return False;
end;

Proc CurrentDeviceName_OnExit(FieldName: String; Iter: Integer);
 CurrentDeviceID="";
 CurrentDocumentHandling=0;
end;

Func CurrentDocumentHandling_OnEnter(FieldName: String; Iter: Integer): logical;
var wiaDevMngr,wiaDevInfos,wiaDevInfo,wiaDev:AutoObject;
var count,i:i;
var Flag:L;
 if CurrentDeviceID="":
    CurrentDeviceName_OnEnter(FieldName,Iter);
 fi;
 if CurrentDeviceID="": ^False; fi;
 wiaDevMngr=CreateAutoObject("WIA.DeviceManager");
 Try
  wiaDevInfos=AsAutoObject(wiaDevMngr.DeviceInfos);
  Try
   count=AsInteger(wiaDevInfos.Count);
   Flag=False;
   for i=1..count do
    wiaDevInfo=AsAutoObject(wiaDevInfos.Item[i]);
    Try
     if AsString(wiaDevInfo.DeviceID)=CurrentDeviceID:
        wiaDev=AsAutoObject(wiaDevInfo.Connect);
        Try
         DocumentHandlingSelect(wiaDev,False,False);
        Finally
         ClearVariable(wiaDev);
        end;
        Flag=True;
     fi;
    Finally
     ClearVariable(wiaDevInfo);
    end;
    if Flag: Break; fi;
   od;
  Finally
   ClearVariable(wiaDevInfos);
  end;
 Finally
  ClearVariable(wiaDevMngr);
 end;
 if not Flag:
    Message("Сканер "+CurrentDeviceName+" не найден",mtError);
    Template.Field="CurrentDeviceName";
 fi;
 Return False;
end;

Func CurrentRotateImage_OnEnter(FieldName: String; Iter: Integer): logical;
var i:i;
 ClearVariable(Buf);
 Buf[1]="Повернуть на 0";
 Buf[2]="Повернуть на 90";
 Buf[3]="Повернуть на 180";
 Buf[4]="Повернуть на 270";
 i=Alternate("Выберите угол поворота",Buf,-1,1,12);
 if i=1: i=0;
   |i=2: i=90;
   |i=3: i=180;
   |i=4: i=270;
   |True: ^False;
 fi;
 PutVariableI(FieldName,i);
 Return False;
end;

Proc Лист_OnClick(Row: Integer; Col: Integer; Double: Logical);
var p1,p2:i;
var Field:S;
 Field=AsString(Template.Field);
 p1=Pos("[",Field);
 p2=Pos("]",Field);
 ТекЛист=Int(SubStr(Field,p1+1,p2-p1-1));
end;

Func R_OnEnter(FieldName: String; Iter: Integer): logical;
var i,p1,p2:i;
var Pic:Object;
var ТекЛист_:I;
 p1=Pos("[",FieldName);
 p2=Pos("]",FieldName);
 ТекЛист=Int(SubStr(FieldName,p1+1,p2-p1-1));
 if Img[ТекЛист]="": Message("Лист еще не отсканирован",mtError); Template.Object="btnСкан"; ^False; fi;
 if not ExistFile(Img[ТекЛист]): Message("Изображение листа не найдено",mtError); ^False; fi;
 ClearVariable(Buf);
 Buf[1]="Повернуть на 90";
 Buf[2]="Повернуть на 180";
 Buf[3]="Повернуть на 270";
 i=Alternate("Выберите угол поворота",Buf,-1,1,12);
 if i=1: i=90;
   |i=2: i=180;
   |i=3: i=270;
   |True: ^False;
 fi;
 if RotateImage(Img[ТекЛист],i):
    ТекЛист_=ТекЛист-((Страница-1)*MaxЛист);
    if FindObject("Picture"+Str(ТекЛист_),Pic):
       Pic.LoadPicture(Img[ТекЛист]);
    fi;
    FlagModify=True;
 fi;
 Return False;
end;

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
var p1,p2:i;
 p1=Pos("[",FieldName);
 p2=Pos("]",FieldName);
 ТекЛист=Int(SubStr(FieldName,p1+1,p2-p1-1));
 if Read_Only: ^False; fi;
 if not Img[ТекЛист]="":
    if EnqOkCancel("Лист №"+Str(ТекЛист)+" будет удален. Продолжить ?",mtWarning)=cmCancel: ^False; fi;
    if ExistFile(Img[ТекЛист]):
       DeleteFile(Img[ТекЛист]);
       DeleteFromArray(Img,ТекЛист);
    fi;
    if not КолЛист=1: КолЛист=КолЛист-1; fi;
    if not ТекЛист=1 and ТекЛист>КолЛист: ТекЛист=ТекЛист-1; fi;
    Оформление(0);
    Template.Field="Лист["+Format("%.2D",ТекЛист)+"]";
    FlagModify=True;
 fi;
 Return False;
end;

Proc ЗакрытьНастр_OnClick(Row: Integer; Col: Integer; Double: Logical);
 ОткрНастр(False);
 Настр(True);
end;

Func ПутьJpeg2Pdf_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
 if not Value="":
    if not ExistFile(Раб.Бюджет2005.Контроль2Слэш(value+"\jpeg2pdf.exe")):
       Message("Файл "+Раб.Бюджет2005.Контроль2Слэш(value+"\jpeg2pdf.exe")+" не найден",mtError);
       ^False;
    fi;
 fi;
 Return True;
end;

Func ПутьJpeg2Pdf_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:S;
 Template.HideEditor(False);
 tmp=ПутьJpeg2Pdf;
 if tmp="": 
    tmp=Раб.Бюджет2005.Контроль2Слэш(PlanVar("Std_rpo")+"\Bin\jpeg2pdf.exe");
   else
    tmp=tmp+Раб.Бюджет2005.Контроль2Слэш("\jpeg2pdf.exe");
 fi;
 if ChooseFile(tmp,"Выбрать файл...", "jpeg2pdf.exe|jpeg2pdf.exe")=cmOk:
    ПутьJpeg2Pdf=ExtractWords(1,WordsCount(tmp,"\")-1,tmp,"\");
    if Pos("\\",tmp)=1:
       ПутьJpeg2Pdf="\\"+ПутьJpeg2Pdf;
    fi;
 fi;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnСкан_OnClick(Sender: String);
var Folder:S;
var ii,i:i;
var Flag:L;
 if not Img[ТекЛист]="" and Sender="btnСкан":
    if EnqOkCancel("Лист №"+Str(ТекЛист)+" будет отсканирован заново, продолжить ?",mtWarning)=cmCancel: Exit; fi;
 fi;
 Folder=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\");
 Flag=Сканировать(Folder,Sender);
 if Flag: FlagModify=True; fi;
 if Flag and CurrentDocumentHandling=FEEDER: Message("Сканирование завершено^MОтсканированно листов: "+Str(СканЛист)); fi;
end;

Proc btnИмпорт_OnClick(Sender: String);
var Folder:S;
var ii,i:i;
var Flag:L;
 if not Img[ТекЛист]="":
    if EnqOkCancel("Лист №"+Str(ТекЛист)+" будет заменен импортом, продолжить ?",mtWarning)=cmCancel: Exit; fi;
 fi;
 Folder=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\");
 Flag=Импортировать(Folder,Sender);
 if Flag:
    FlagModify=True;
    Оформление(ТекЛист);
 fi;
end;

Proc btnСканСлед_OnClick(Sender: String);
var i:i;
var Flag:L;
var Folder:S;
 if not Img[ТекЛист]="":
    While not Img[ТекЛист]="" do
     ТекЛист=ТекЛист+1;
    od;
    КолЛист=КолЛист+1;
    if Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1)>Max(1,Страница):
       Страница=Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1);
       Оформление(0);
    fi;
 fi;
 FlagModify=True;
 Folder=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\");
 Flag=Сканировать(Folder,Sender);
 if Flag: 
    FlagModify=True;
   else
    if not КолЛист=1: КолЛист=КолЛист-1; fi;
    if not ТекЛист=1 and ТекЛист>КолЛист: ТекЛист=ТекЛист-1; fi;
    Страница=Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1);
    Оформление(0);
 fi;
 if Flag and CurrentDocumentHandling=FEEDER: Message("Сканирование завершено^MОтсканированно листов: "+Str(СканЛист)); fi;
end;

Proc btnИмпортСлед_OnClick(Sender: String);
var Folder:S;
var ii,i:i;
var Flag:L;
 if not Img[ТекЛист]="":
    While not Img[ТекЛист]="" do
     ТекЛист=ТекЛист+1;
    od;
    КолЛист=КолЛист+1;
    if Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1)>Max(1,Страница):
       Страница=Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1);
       Оформление(0);
    fi;
 fi;
 Folder=Раб.Бюджет2005.Контроль2Слэш(PlanVar("CACHE")+"\");
 Flag=Импортировать(Folder,Sender);
 if Flag: 
    FlagModify=True;
    Оформление(ТекЛист);
   else
    if not КолЛист=1: КолЛист=КолЛист-1; fi;
    if not ТекЛист=1 and ТекЛист>КолЛист: ТекЛист=ТекЛист-1; fi;
    Страница=Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1);
    Оформление(0);
 fi;
end;

Proc btnОчистить_OnClick(Sender: String);
 if EnqOkCancel("Вы действительно хотите удалить отсканированные листы ?",mtWarning)=cmOk:
    Очистить;
    Оформление(0);
    FlagModify=True;
 fi;
end;

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

Proc Label_OnClick(Sender: String);
var ТекЛист_:I;
 Страница=Max(1,Страница);
 ТекЛист_=Int(SubStr(Sender,6,2));
 ТекЛист=((Страница-1)*MaxЛист)+ТекЛист_;
 if Img[ТекЛист]="": Message("Лист №"+Str(ТекЛист)+" еще не отсканирован",mtError); Exit; fi;
 if ExistFile(Img[ТекЛист]):
    ExecuteProgram('"'+Img[ТекЛист]+'"');
   else
    Message("Файл "+Img[ТекЛист]+" не найден",mtError);
 fi;
end;

Proc btnСохранить_OnClick(Sender: String);
 if СохранГЭК(vДок,vЗапись,vТип):
    FlagModify=False;
 fi;
end;

Proc btnЗагрузить_OnClick(Sender: String);
var n:i;
 if not (КолЛист=1 and Img[1]=""):
    if EnqOkCancel("Текущие отсканированные листы будут утеряны. Продолжить загрузку ?",mtWarning)=cmCancel: Exit; fi;
 fi;
 n=ЗагрузГЭК(vДок,vЗапись,vТип);
 if n=0: Message("Нет данных для загрузки");
   |n>0: Message("Загрузка успешно выполнена"); FlagModify=False;
 fi;
 Страница=1;
 Оформление(0);
end;

Proc btnУдалить_OnClick(Sender: String);
 if EnqOkCancel("Вы действительно хотите удалить сохраненные графические электронные копии документа ?",mtWarning)=cmCancel: Exit; fi;
 if УдалитьГЭК(vДок,vЗапись,vТип):
    Сеанс=GetGUID;
    Очистить;
    Оформление(0);
    Message("Графические электронные копии документа успешно удалены");
    FlagModify=True;
 fi;
end;

Proc btnНастр_OnClick(Sender: String);
 Настр(False);
 ОткрНастр(True);
 Template.Field="ПутьJpeg2Pdf";
end;

Proc btnУмолч_OnClick(Sender: String);
 if EnqOkCancel("Восстановить стандартные параметры ?",mtWarning)=cmOk:
    Качество=35;
    CurrentIntent=4;
    Настр(True);
 fi;
end;

Proc cbxIntent_OnChange(Sender: String);
 if not CurrentIntent=4:
    Message("По требованиям к графическим электронным копиям документов-оснований, предоставляемых в ОрФК, тип изображения должен быть 'черно-белым'",mtWarning);
 fi;
 Настр(True);
end;

Proc edКачество_OnEditing(Sender: String; L: Logical);
var val:i;
 if not L:
    val=AsInteger(edКачество.Text);
    if val<1 or val>100: Message("Значение данного параметра должно лежать в диапазоне 1..100",mtError); Exit; fi;
    Качество=Val;
    Настр(True);
 fi;
end;

Proc edЯркость_OnEditing(Sender: String; L: Logical);
var val:i;
 if not L:
    val=AsInteger(edЯркость.Text);
    if val<-100 or val>100: Message("Значение данного параметра должно лежать в диапазоне -100..+100",mtError); Exit; fi;
    Яркость=Val;
 fi;
end;

Proc edКонтраст_OnEditing(Sender: String; L: Logical);
var val:i;
 if not L:
    val=AsInteger(edКонтраст.Text);
    if val<-100 or val>100: Message("Значение данного параметра должно лежать в диапазоне -100..+100",mtError); Exit; fi;
    Контраст=Val;
 fi;
end;

Proc btnПредСтраница_OnClick(Sender: String);
 Страница=Max(1,Страница-1);
 Оформление(0);
end;

Proc btnСледСтраница_OnClick(Sender: String);
 Страница=Min(Int(Trunc((КолЛист-1)/MaxЛист))+1,Страница+1);
 Оформление(0);
end;

Proc btnВыборСтраницы_OnClick(Sender: String);
var n,nn:i;
 ClearVariable(Buf);
 nn=Max(1,Int(Trunc((КолЛист-1)/MaxЛист))+1);
 for n=1..nn do
  Buf[n]="Страница №"+Str(n)+"(листы "+Str(Max(1,((n-1)*MaxЛист+1)))+" - "+Str(Min(КолЛист,n*MaxЛист))+")";
 od;
 n=Alternate("Выберите страницу",Buf,-1,Страница,12);
 if not n=0:
    Страница=n;
    Оформление(0);
 fi;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 FlagModify=False;
 if not CanInsert(SelfCrd) and not Read_Only: 
    Message("Вы не обладаете достаточными правами для сканирования документов",mtWarning); 
    Очистить;
    ClearVariable(Сеанс);
    ClearVariable(Загл);
    ClearVariable(extПапка);
    ClearVariable(vКлюч);
    Close; 
 fi;
 enableНастр=(CanUpdate("РПО_Настр") and CanInsert("РПО_Настр") and CanDelete("РПО_Настр")) and not Read_Only;
 ОткрНастр(False);
 Настр(False);
 if Сеанс="": Сеанс=GetGUID; fi;
 ОформлениеОбщ;
 Оформление(0);
 Init(0);
 if not CurrentDeviceName="" or CurrentDocumentHandling=FEEDER or CurrentDocumentHandling=DUPLEX:
    btnСканСлед2.Enabled=not Read_Only and enableDuplex;
   else
    btnСканСлед2.Enabled=False;
 fi;
end;

Proc AfterOpen(Destroy: Logical);
var x,y:i;
var BgColor,FontColor:I;
 sRFI.Cell(1,2,CellReadOnly,not enableНастр);
 sRFI.Cell(1,2,CellBgColor,if(enableНастр,coAqua,coTransparent));
 sScan.Cell(1,2,CellReadOnly,Read_Only);
 sScan.Cell(1,4,CellReadOnly,Read_Only);
 sScan.Cell(1,6,CellReadOnly,Read_Only);
 BgColor=if(Read_Only,coTransparent,coTeal);
 FontColor=if(Read_Only,coBlack,coWhite);
 sScan.Cell(1,2,CellBgColor,BgColor); sScan.Cell(1,2,CellFontColor,FontColor);
 sScan.Cell(1,4,CellBgColor,BgColor); sScan.Cell(1,4,CellFontColor,FontColor);
 sScan.Cell(1,6,CellBgColor,BgColor); sScan.Cell(1,6,CellFontColor,FontColor);
 x=AsInteger(s0.Column(1,ColLeft,""));
 y=AsInteger(s0.Row(3,RowTop,""));
 Template.Freeze(Max(x,1),y);
 if HideDlg:
    Try
     if Exec="":
        btnСканСлед_OnClick("AfterOpen");
       else
        ExecuteProc(Exec,ExecSender);
     fi;
     btnСохранить_OnClick("AfterOpen");
     btnЗакрыть_OnClick("AfterOpen");
    Finally
     HideDlg=False;
     Exec="";
     ExecSender="";
    end;
 fi;
end;

Proc OnClose(Destroy: Logical);
 if enableНастр and not Read_Only: Настр(True); fi;
 if FlagModify:
    if EnqOkCancel("Сохранить графические электронные копии документа ?",mtWarning)=cmOk:
       btnСохранить_OnClick("OnClose");
    fi;
 fi;
 Очистить;
 ClearVariable(Сеанс);
 ClearVariable(Загл);
 ClearVariable(extПапка);
 ClearVariable(vКлюч);
 ClearVariable(HideDlg);
end;
--Обработчики событий шаблона -----
--




Конец
