-- Шаблон создан мастером бланков
-- 16.04.2012 14:21:31
--
БланкСШаблоном "Работа с прикрепленными файлами";

var RootFolder:S;

var Файл []:S;
var Кмнт []:S;
var Штамп[]:S;
var Папка[]:S;
var CU[]:S;
var MU[]:S;

var BufBak[]:S;
var BufSrc[]:S;

var SelfBln:S="РАБ.ВСПОМ.ФАЙЛЫ";
var SelfCrd:S="РПО_СПИСОК_ФАЙЛОВ";

var НастрGUID:S;

var Folder:S;
--
--Процедуры и функции -------------
Func ExtractFile(Val:S):S;
var ww:i;
 ww=WordsCount(val,"\");
 ^ExtractWord(ww,val,"\");
end;

Proc Настр(aСохр:L);
 if НастрGUID="" or aСохр: НастрGUID=GetGUID; fi;
 if Раб.Настр.Начать(SelfBln,0,0,"",НастрGUID):
    Раб.Настр.Добавить("RootFolder","S");
    if aСохр: 
       Try
        Раб.Настр.Сохранить;
       Except
        Настр(False);
       end;
      else 
       НастрGUID=Раб.Настр.Загрузить("","");
       if НастрGUID="" or RootFolder="":
          RootFolder=Раб.Бюджет2005.Контроль2Слэш(PlanVar("Бух")+"\Файлы");
       fi;
    fi;
 fi;
end;

Func Добавить(aДок:S; aЗапись:I; aПапка:S; aФайл:S; aКмнт:S; aКлюч:S):I;
var OWA,n,nr,ret:I;
var Штамп_,Папка_,Путь_,Файл_,F:S;
var Cr,Err:L;
 if not CanInsert(SelfCrd): Message("Вы не обладаете достаточными правами для выполнения данной операции",mtError); ^0; fi;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ",mtError); ^0; fi;
 if RootFolder="": Настр(False); fi;
 if Trim(aФайл)="":
    if ChooseFile(aФайл,"Выберите файл...","Все файлы(*.*)|*.*")=cmCancel: ^0; fi;
 fi;
 if not ExistFile(aФайл): Message("Файл '"+aФайл+"' не найден",mtError); ^0; fi;
 Файл_=ExtractFile(aФайл);
 Штамп_=DateToString(ToDay)+" "+Раб.Бюджет2005.TimeToStr(Time,"HH:MM:SS");
 Err=False;
 Cr=False;
 F="Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Файл='"+Файл_+"'";
 OWA=OpenWorkArea(SelfCrd,"",F);
 Try
  nr=Records(OWA);
  if nr=0:
     Папка_=aПапка+"\"+aДок+"{"+Str(aЗапись)+"}";
     Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+Папка_);
     if not ExistsFolder(Путь_): CreateFolder(Путь_); Cr=True; fi;
    else
     Message("Файл '"+Файл_+"' уже существует в базе данных",mtError);
     ^-RecordToInteger(GetRecordKey(OWA,1));
  fi;
  BeginChanging(OWA,False);
  Try
   n=InsertRecord(OWA);
   ret=RecordToInteger(GetRecordKey(OWA,n));
   n=PutFieldS(OWA,n,"Док",aДок);
   n=PutFieldI(OWA,n,"Запись",aЗапись);
   n=PutFieldS(OWA,n,"Папка",Папка_);
   n=PutFieldS(OWA,n,"Файл",Файл_);
   n=PutFieldS(OWA,n,"Коммент",aКмнт);
   n=PutFieldS(OWA,n,"Штамп",Штамп_);
   n=PutFieldS(OWA,n,"РПО_Ключ",aКлюч);
   CopyFile(aФайл,Путь_+"\"+Файл_);
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Err=True;
   Ret=0;
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
  if Err:
     if Cr:
        if ExistFile(Путь_+"\"+Файл_): DeleteFile(Путь_+"\"+Файл_); fi;
        DeleteFolder(Путь_);
     fi;
  fi;
 end;
 ^ret;
end;

Func ЗагрузПапку(aДок:S; aЗапись:I; aПапка:S; aКмнт:S; aКлюч:S; maxФайл:I):I;
var OWA,n,nr,ret,i,ii:I;
var Штамп_,Папка_,Путь_,Файл_,sПапка,F:S;
var Cr,Err,Skip:L;
 ret=0;
 if not CanInsert(SelfCrd): Message("Вы не обладаете достаточными правами для выполнения данной операции",mtError); ^0; fi;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ",mtError); ^0; fi;
 if RootFolder="": Настр(False); fi;
 if ChooseFolder(Folder,"Выберите папку...")=cmCancel: ^0; fi;
 sПапка=ExtractFile(SubStr(Folder,1,Length(Folder)-1));
 ii=Раб.Бюджет2005.DirList(Folder,"*",1);
 if ii>maxФайл:
    if EnqOkCancel("Выбранная папка '"+Folder+"' содержит "+Str(ii)+" файл(а)(ов)^MВы уверены, что хотите загрузить все эти файлы ?",mtWarning)=cmCancel: ^0; fi;
 fi;
 Штамп_=DateToString(ToDay)+" "+Раб.Бюджет2005.TimeToStr(Time,"HH:MM:SS");
 OWA=OpenWorkArea(SelfCrd,"","1=0");
 Try
  ShowProgress(ii,"Обработка файлов....");
  for i=1..ii do
   ProgressPos(i);
   Err=False;
   Cr=False;
   Try
    Файл_=sПапка+"\"+ExtractFile(Раб.Бюджет2005.Dir[i]);
    F="Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Файл='"+Файл_+"'";
    SetFilter(OWA,F);
    nr=Records(OWA);
    if nr=0:
       Папка_=aПапка+"\"+aДок+"{"+Str(aЗапись)+"}";
       Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+Папка_);
       if not ExistsFolder(Путь_): CreateFolder(Путь_); Cr=True; fi;
       BeginChanging(OWA,False);
       Try
        n=InsertRecord(OWA);
        n=PutFieldS(OWA,n,"Док",aДок);
        n=PutFieldI(OWA,n,"Запись",aЗапись);
        n=PutFieldS(OWA,n,"Папка",Папка_);
        n=PutFieldS(OWA,n,"Файл",Файл_);
        n=PutFieldS(OWA,n,"Коммент",aКмнт);
        n=PutFieldS(OWA,n,"Штамп",Штамп_);
        n=PutFieldS(OWA,n,"РПО_Ключ",aКлюч);
        CopyFile(Раб.Бюджет2005.Dir[i],Путь_+"\"+Файл_);
        EndChanging(OWA);
        ret=ret+1;
       Except
        CancelChanging(OWA);
        Err=True;
        Ret=0;
        Raise;
       end;
      else
       Trace("Файл '"+Файл_+"' уже существует в базе данных. Пропущен при загрузке");
    fi;
   Finally
    if Err:
       if Cr:
          if ExistFile(Путь_+"\"+Файл_): DeleteFile(Путь_+"\"+Файл_); fi;
          DeleteFolder(Путь_);
       fi;
    fi;
   end;
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 ^ret;
end;

Func Показ(UKey:Record; aФайл:S; aКмнт:S; aШтамп:S; aПуть:S; aCU:S; aMU:S):I;
var OWA,n:I;
var Путь_,Папка_,Файл_,Кмнт_,Штамп_,CU_,MU_:S;
 if UKey=nil: Message("Не указана запись",mtError); ^-1; fi;
 if RootFolder="": Настр(False); fi;
 OWA=OpenWorkArea(SelfCrd,"ШТАМП","UKey="+RecordToString(UKey));
 Try
  n=Records(OWA);
  Папка_=GetFieldS(OWA,n,"Папка");
  Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+Папка_);
  Файл_=GetFieldS(OWA,n,"Файл");
  Штамп_=GetFieldS(OWA,n,"Штамп");
  Кмнт_=GetFieldS(OWA,n,"Коммент");
  CU_=DateToString(GetFieldD(OWA,n,"CreateTime"))+" "+GetFieldS(OWA,n,"CreatedUser");
  MU_=DateToString(GetFieldD(OWA,n,"UpdateTime"))+" "+GetFieldS(OWA,n,"ModifiedUser");
  if not ExistFile(Путь_+"\"+Файл_):
     Trace("Файл '"+Путь_+"\"+Файл_+"' не найден");
  fi;
  if not aФайл="":  PutVariableS(aФайл,Файл_); fi;
  if not aКмнт="":  PutVariableS(aКмнт,Кмнт_); fi;
  if not aШтамп="": PutVariableS(aШтамп,Штамп_); fi;
  if not aПуть="":  PutVariableS(aПуть,Путь_); fi;
  if not aCU="":    PutVariableS(aCU,CU_); fi;
  if not aMU="":    PutVariableS(aMU,MU_); fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^n;
end;

Func ПоказСписок(aДок:S; aЗапись:I; arrФайл:S; arrКмнт:S; arrШтамп:S; arrПуть:S; arrCU:S; arrMU:S; Iter:I):I;
var OWA,n,nr:I;
var Путь_,Папка_,Файл_,Кмнт_,Штамп_,CU_,MU_:S;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ",mtError); ^-1; fi;
 if RootFolder="": Настр(False); fi;
 if Iter=0: Iter=1; fi;
 nr=0;
 ClearVariable(Раб.Вспом.Файлы.Файл);
 ClearVariable(Раб.Вспом.Файлы.Кмнт);
 ClearVariable(Раб.Вспом.Файлы.Штамп);
 ClearVariable(Раб.Вспом.Файлы.Папка);
 ClearVariable(Раб.Вспом.Файлы.CU);
 ClearVariable(Раб.Вспом.Файлы.MU);
 OWA=OpenWorkArea(SelfCrd,"ШТАМП","Док='"+aДок+"' and Запись="+Str(aЗапись));
 Try
  nr=Records(OWA);
  for n=1..nr do
   Папка_=GetFieldS(OWA,n,"Папка");
   Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+Папка_);
   Файл_=GetFieldS(OWA,n,"Файл");
   Штамп_=GetFieldS(OWA,n,"Штамп");
   Кмнт_=GetFieldS(OWA,n,"Коммент");
   CU_=DateToString(GetFieldD(OWA,n,"CreateTime"))+" "+GetFieldS(OWA,n,"CreatedUser");
   MU_=DateToString(GetFieldD(OWA,n,"UpdateTime"))+" "+GetFieldS(OWA,n,"ModifiedUser");
   if not ExistFile(Путь_+"\"+Файл_):
      Trace("Файл '"+Путь_+"\"+Файл_+"' не найден");
   fi;
   if arrФайл="":  Файл[n]=Файл_; else PutVariableS(arrФайл+"["+str(Iter)+"]",Файл_); fi;
   if arrКмнт="":  Кмнт[n]=Кмнт_; else PutVariableS(arrКмнт+"["+str(Iter)+"]",Кмнт_); fi;
   if arrШтамп="": Штамп[n]=Штамп_; else PutVariableS(arrШтамп+"["+str(Iter)+"]",Штамп_); fi;
   if arrПуть="":  Папка[n]=Папка_; else PutVariableS(arrПуть+"["+str(Iter)+"]",Путь_); fi;
   if arrCU="":    CU[n]=CU_; else PutVariableS(arrCU+"["+str(Iter)+"]",CU_); fi;
   if arrMU="":    MU[n]=MU_; else PutVariableS(arrMU+"["+str(Iter)+"]",MU_); fi;
   Iter=Iter+1;
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 ^nr;
end;

Proc Вызвать(aДок:S; aЗапись:I; aФайл:S; App:S);
var OWA,nr:I;
var Name,Путь_,Папка_,Файл_,Кмнт_,Штамп_:S;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ",mtError); Exit; fi;
 if aФайл="": Message("Не указано имя файла",mtError); Exit; fi;
 if RootFolder="": Настр(False); fi;
 OWA=OpenWorkArea(SelfCrd,"","Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Файл='"+aФайл+"'");
 Try
  if Records(OWA)=0: Message("Запись не найдена",mtError); Exit; fi;
  Папка_=GetFieldS(OWA,1,"Папка");
  Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+Папка_);
  Файл_=GetFieldS(OWA,1,"Файл");
 Finally
  CloseWorkArea(OWA);
 end;
 if not ExistFile(Путь_+"\"+Файл_): Message("Файл '"+Путь_+"\"+Файл_+"' не найден",mtError); Exit; fi;
 ExecuteProgram('"'+if(App="","",App+" ")+Путь_+"\"+Файл_+'"');
end;

Func Обновить(aДок:S; aЗапись:I; aПапка:S; aФайл:S; aКмнт:S; aКлюч:S; newФайл:S):I;
var OWA,n,nr,ret:I;
var Штамп_,Папка_,Путь_,Файл_,F,oldПапка_,oldПуть_,oldФайл_:S;
var Err,Cr,Rn,oldRn,Flag:L;
 if not CanUpDate(SelfCrd): Message("Вы не обладаете достаточными правами для выполнения данной операции",mtError); ^0; fi;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ",mtError); ^0; fi;
 if aФайл="": Message("Не указано имя файла",mtError); ^0; fi;
 ClearVariable(Раб.Вспом.Файлы.BufSrc);
 ClearVariable(Раб.Вспом.Файлы.BufBak);
 if RootFolder="": Настр(False); fi;
 if newФайл="":
    if ChooseFile(aФайл,"Выберите файл...","Все файлы(*.*)|*.*")=cmCancel: ^0; fi;
 fi;
 if newФайл="-1":
    Файл_=aФайл;
   else
    Файл_=ExtractFile(newФайл);
 fi;
 Штамп_=DateToString(ToDay)+" "+Раб.Бюджет2005.TimeToStr(Time,"HH:MM:SS");
 Cr=False;
 oldRn=False;
 Err=False;
 Папка_=aПапка+aДок+"{"+Str(aЗапись)+"}";
 Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+Папка_);
 F="Док='"+aДок+"' and Запись="+Str(aЗапись)+" and Файл='"+Файл_+"'";
 OWA=OpenWorkArea(SelfCrd,"",F);
 Try
  nr=Records(OWA);
  if nr=0:
     if not ExistsFolder(Путь_): CreateFolder(Путь_); Cr=True; fi;
    else
     if not newФайл="-1":
        oldПапка_=GetFieldS(OWA,1,"Папка");
        oldПуть_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+oldПапка_);
        oldФайл_=GetFieldS(OWA,1,"Файл");
        BufSrc[1]=oldПуть_+"\"+oldФайл_;
        if ExistFile(BufSrc[1]):
           BufBak[1]=BufSrc[1]+".bak";
           RenameFile(BufSrc[1],BufBak[1]);
           oldRn=True;
        fi;
        if not ExistsFolder(Путь_):
           CreateFolder(Путь_);
           Cr=True;
        fi;
     fi;
  fi;
  Flag=False;
  BeginChanging(OWA,False);
  Try
   if nr=0:
      n=InsertRecord(OWA);
      Flag=True;
     else
      n=1;
   fi;
   ret=RecordToInteger(GetRecordKey(OWA,n));
   if not GetFieldS(OWA,n,"Папка")=Папка_: n=PutFieldS(OWA,n,"Папка",Папка_); Flag=True; fi;
   if not GetFieldS(OWA,n,"Файл")=Файл_: n=PutFieldS(OWA,n,"Файл",Файл_); Flag=True; fi;
   if not GetFieldS(OWA,n,"Коммент")=aКмнт: n=PutFieldS(OWA,n,"Коммент",aКмнт); Flag=True; fi;
   if not GetFieldS(OWA,n,"РПО_Ключ")=aКлюч: n=PutFieldS(OWA,n,"РПО_Ключ",aКлюч); Flag=True; fi;
   if Flag: n=PutFieldS(OWA,n,"Штамп",Штамп_); fi;
   if not newФайл="-1":
      CopyFile(newФайл,Путь_+"\"+Файл_);
   fi;
   if Flag:
      EndChanging(OWA);
     else
      CancelChanging(OWA);
   fi;
  Except
   CancelChanging(OWA);
   Err=True;
   Ret=0;
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
  if Err:
     if Cr:
        if ExistFile(Путь_+"\"+Файл_): DeleteFile(Путь_+"\"+Файл_); fi;
        DeleteFolder(Путь_);
     fi;
     if oldRn:
        RenameFile(BufBak[1],BufSrc[1]);
     fi;
    else
     if oldRn:
        if ExistFile(oldПуть_+"\"+oldФайл_+".bak"): DeleteFile(oldПуть_+"\"+oldФайл_+".bak"); fi;
     fi;
  fi;
 end;
 ^ret;
end;

Func Стереть(aДок:S; aЗапись:I; aФайл:S):L;
var OWA,n,nr:i;
var Путь_,Папка_,Файл_,F:S;
 if not CanDelete(SelfCrd): Message("Вы не обладаете достаточными правами для выполнения данной операции",mtError); ^False; fi;
 if aДок="" or aЗапись=0: Message("Не указан исходный документ. Удаление отменено",mtError); ^False; fi;
 if aФайл="": aФайл="*"; fi;
 ClearVariable(Раб.Вспом.Файлы.BufSrc);
 ClearVariable(Раб.Вспом.Файлы.BufBak);
 if RootFolder="": Настр(False); fi;
 F="Док='"+aДок+"' and Запись="+Str(aЗапись)+" and "+if(Pos("*",aФайл)=0 and Pos("?",aФайл)=0,"Файл='"+aФайл+"'","Match(Файл,'"+aФайл+"')");
 OWA=OpenWorkArea(SelfCrd,"",F);
 Try
  nr=Records(OWA);
  for n=1..nr do
   Папка_=GetFieldS(OWA,n,"Папка");
   Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+Папка_);
   Файл_=GetFieldS(OWA,n,"Файл");
   BufSrc[n]=Путь_+"\"+Файл_;
   if ExistFile(BufSrc[n]):
      BufBak[n]=BufSrc[n]+".bak";
      RenameFile(BufSrc[n],BufBak[n]);
   fi;
  od;
  BeginChanging(OWA,False);
  Try
   DeleteAllRecords(OWA);
  Except
   CancelChanging(OWA);
   for n=1..nr do
    if ExistFile(BufBak[n]):
       RenameFile(BufBak[n],BufSrc[n]);
       DeleteFile(BufBak[n]);
    fi;
   od;
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
 for n=1..nr do
  if ExistFile(BufBak[n]): DeleteFile(BufBak[n]); fi;
 od;
 ^True;
end;

Func Копировать(sДок:S; sЗапись:I; tДок:S; tЗапись:I; aПапка:S; aФайл:S; aКлюч:S):I;
var sOWA,s,sr,tOWA,t,i:i;
var Путь_,Папка_,Файл_,tПапка_,F:S;
 if sДок="" or sЗапись=0: Message("Не указан исходный документ",mtError); ^-1; fi;
 if aФайл="": aФайл="*"; fi;
 if RootFolder="": Настр(False); fi;
 if tДок="" or tЗапись=0:
    if ChooseFolder(tПапка_,"Выберите папку куда копируем...")=cmCancel: ^-1; fi;
 fi;
 i=0;
 F="Док='"+sДок+"' and Запись="+Str(sЗапись)+" and "+if(Pos("*",aФайл)=0 and Pos("?",aФайл)=0,"Файл='"+aФайл+"'","Match(Файл,'"+aФайл+"')");
 sOWA=OpenWorkArea(SelfCrd,"",F);
 Try
  if not (tДок="" or tЗапись=0):
     tOWA=OpenWorkArea(SelfCrd,"","1=0");
  fi;
  Try
   sr=Records(sOWA);
   ShowProgress(sr,"Копируем...");
   for s=1..sr do
    ProgressPos(s);
    Папка_=GetFieldS(sOWA,s,"Папка");
    Путь_=Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+Папка_);
    Файл_=GetFieldS(sOWA,s,"Файл");
    if ExistFile(Путь_+"\"+Файл_):
       i=i+1;
       if tДок="" or tЗапись=0:
          CopyFile(Путь_+"\"+Файл_,tПапка_+"\"+Файл_);
         else
          BeginChanging(tOWA,False);
          Try
           t=InsertRecord(tOWA);
           t=PutFieldS(tOWA,t,"Док",tДок);
           t=PutFieldI(tOWA,t,"Запись",tЗапись);
           t=PutFieldS(tOWA,t,"Папка",aПапка+"\"+tДок+"{"+Str(tЗапись)+"}");
           t=PutFieldS(tOWA,t,"Файл",Файл_);
           t=PutFieldS(tOWA,t,"Коммент",GetFieldS(sOWA,s,"Коммент"));
           t=PutFieldS(tOWA,t,"Штамп",GetFieldS(sOWA,s,"Штамп"));
           t=PutFieldS(tOWA,t,"РПО_Ключ",aКлюч);
           EndChanging(tOWA);
           CopyFile(Путь_+"\"+Файл_,Раб.Бюджет2005.Контроль2Слэш(RootFolder+"\"+aПапка+"\"+tДок+"{"+Str(tЗапись)+"}\"+Файл_));
          Except
           CancelChanging(tOWA);
           Raise;
          end;
       fi;
      else
       Trace("Файл '"+Путь_+"\"+Файл_+"' не найден");
    fi;
   od;
  Finally
   if not (tДок="" or tЗапись=0): CloseWorkArea(tOWA); fi;
  end;
 Finally
  CloseWorkArea(sOWA);
  CloseProgress;
 end;
 ^i;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func RootFolder_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if not ExistsFolder(Value):
    Message("Путь '"+Value+"' не найден",mtError);
    ^False;
 fi;
 Return True;
end;

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

Func RootFolder_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var i:i;
 Template.HideEditor(False);
 i=ChooseFolder(RootFolder,"Выберите папку для хранения файлов");
 Настр(True);
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 Настр(False);
end;
--Обработчики событий шаблона -----
--





Конец
