-- Шаблон создан мастером бланков
-- 28.01.2009 13:42:27
--
БланкСШаблоном "Настройка";

var ID:S;
var Level:I; --0 для всех, 1 для схемы, 2 для пользователя
var Ver:I;
var Cmnt:S;
var GUID:S;

var BufVar[]:S;
var BufTyp[]:S;
var BufVal[]:S;

var Alias:S;
var Schema:S;
var User:S;
var FW:S;
var FR:S;

var IDRev[]:S;
var Rev  []:I;

var SelfCrd:S="РПО_Настр";

var FlagChange:L;
--
--Процедуры и функции -------------
Func Маскировать(Value:S):S;
 if Length(Value)<254:
    Value="^"+Value+"^";
 fi;
 ^Value;
end;

Func ДеМаскировать(Value:S):S;
 if SubStr(Value,1,1)="^": Value=SubStr(Value,2,255); fi;
 if SubStr(Value,Length(Value),1)="^": Value=SubStr(Value,1,Length(Value)-1); fi;
 ^Value;
end;

Func ПолучитьФильтр(aID:S; aLevel:I; aVer:I):S;
var tmp:S;
 tmp="ID='"+aID+"' and Level="+Str(aLevel)+if(aVer=-1,""," and Ver="+Str(aVer));
 if Level=1: tmp=tmp+" and Schema='"+Schema+"'";
   |Level=2: tmp=tmp+" and User='"+User+"'";
 fi;
 ^tmp;
end;

Func Существует(aID:S; aLevel:I; aVer:I; aCmnt:S):Record;
var OWA,nr:I;
 OWA=OpenWorkArea(SelfCrd,"",Раб.Бюджет2005.Объединить(ПолучитьФильтр(aID,aLevel,aVer),"Cmnt='"+aCmnt+"'"," and "));
 Try
  nr=Records(OWA);
  if not nr=0:
     ^GetRecordKey(OWA,nr); 
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^nil;
end;

Func Выбрать(aID:S; aLevel:I; aVer:I; aCmnt:S):Record;
var Rec: Record;
 Rec=nil;
 if not aCmnt="":
    Rec=Существует(aID,aLevel,aVer,aCmnt);
 fi;
 Rec=OpenCardFile(SelfCrd,ПолучитьФильтр(aID,aLevel,aVer),Rec);
 ^Rec;
end;

Func Начать (aID:S; aLevel:I; aVer:I; aCmnt:S; aGUID:S):L;
 if not ExistsCardFile(SelfCrd): Message("Картотека настроек не доступна",mtError); ^False; fi;
 ID=aID;
 Level=aLevel;
 Ver=aVer;
 Cmnt=Trim(aCmnt);
 if Cmnt="{0}": Cmnt=""; fi;
 GUID=aGUID;
 ClearVariable(Раб.Настр.BufVar);
 ClearVariable(Раб.Настр.BufTyp);
 ClearVariable(Раб.Настр.BufVal);
 Alias=AliasName(SelfCrd);
 Schema=if(aLevel=1,SchemaName(Alias),"");
 User=if(aLevel=2,UserName(Alias),"");
 if Match(Cmnt,"{*}"):
    FW=ПолучитьФильтр(ID,Level,-1);
    FR="UKey="+Cmnt;
    Cmnt="";
   else
    FW=ПолучитьФильтр(ID,Level,Ver);
    if not Cmnt="":
       FW=Раб.Бюджет2005.Объединить(FW,"Cmnt='"+Cmnt+"'"," and ");
    fi;
    FR=FW;
 fi;
 ^True;
end;

Func Добавить(aVar:S; aTyp:S):L;
var z:i;
var Val:S;
var Var_:S;
 if ID="": Message("Инициализация не выполнена",mtError); ^False; fi;
 if Match(aVar,"*[*]*"):
    Var_=ExtractWord(1,aVar,"[")+ExtractWord(2,aVar,"]");
   else
    Var_=aVar;
 fi;
 if VariableExists(ID+"."+Var_):
    if aTyp="S": Val=Маскировать(GetVariableS(ID+"."+aVar));
      |aTyp="I": Val=Str(GetVariableI(ID+"."+aVar));
      |aTyp="N": Val=Str(GetVariableN(ID+"."+aVar),2);
      |aTyp="D": Val=DateToString(GetVariableD(ID+"."+aVar));
      |aTyp="R": Val=RecordToString(GetVariableR(ID+"."+aVar));
      |aTyp="L": Val=if(GetVariableL(ID+"."+aVar),"True","False");
    fi;
    z=SearchInArray(Раб.Настр.BufVar,aVar,True);
    if z=-1:
       z=InsertInArraySort(Раб.Настр.BufVar,aVar);
       InsertInArray(Раб.Настр.BufTyp,z,aTyp);
       InsertInArray(Раб.Настр.BufVal,z,Val);
      else
       BufTyp[z]=aTyp;
       BufVal[z]=Val;
    fi;
 fi;
 ^True;
end;

Func Загрузить(aVar:S; aTyp:S):S;
var OWA,OA,n,nr,n2,nr2,z:I;
var aVal,Var_,F_:S;
 if ID="": Message("Инициализация не выполнена",mtError); ^""; fi;
 OWA=OpenWorkArea(SelfCrd,"ver",FR);
 Try
  nr=Records(OWA);
  if nr=0: 
     SetFilter(OWA,"ID='"+ID+"' and Ver="+Str(Ver));
     nr=Records(OWA);
     if nr=0:
        SetFilter(OWA,"ID='"+ID+"'");
     fi;
     nr=Records(OWA);
  fi;
  if nr=0: ^""; fi;
  n=nr;
  if aVar="": F_=""; else F_="VAR='"+aVar+"'"; fi;
  if not aTyp="": F_=Раб.Бюджет2005.Объединить(F_,"TYP='"+aTyp+"'"," and "); fi;
  --читаем ревизию настройки
  z=SearchInArray(Раб.Настр.IDRev,ID,True);
  if z=-1:
     z=InsertInArraySort(Раб.Настр.IDRev,ID);
     InsertInArray(Раб.Настр.Rev,z,GetFieldI(OWA,n,"Rev"));
    else
     Rev[z]=GetFieldI(OWA,n,"Rev");
  fi;
  --читаем ревизию настройки
  Cmnt=GetFieldS(OWA,n,"Cmnt");
  if GUID=GetFieldS(OWA,n,"GUID"): ^GUID; else GUID=GetFieldS(OWA,n,"GUID"); fi;
  OA=OpenArray(OWA,n,"LINE","",F_);
  nr2=Records(OA);
  for n2=1..nr2 do
   aVar=GetFieldS(OA,n2,"VAR");
   aTyp=GetFieldS(OA,n2,"TYP");
   aVal=GetFieldS(OA,n2,"VAL");
   if Match(aVar,"*[*]*"):
      Var_=ExtractWord(1,aVar,"[")+ExtractWord(2,aVar,"]");
     else
      Var_=aVar;
   fi;
   if VariableExists(ID+"."+Var_):
      Try
       if aTyp="S": PutVariableS(ID+"."+aVar,ДеМаскировать(aVal));
         |aTyp="I": PutVariableI(ID+"."+aVar,Int(aVal));
         |aTyp="N": PutVariableN(ID+"."+aVar,Round(aVal,2));
         |aTyp="D": PutVariableD(ID+"."+aVar,if(aVal="",1.1.100,StringToDate(aVal)));
         |aTyp="R": PutVariableR(ID+"."+aVar,if(aVal="",nil,StringToRecord(aVal)));
         |aTyp="L": PutVariableL(ID+"."+aVar,if(aVal="True",True,False));
       fi;
      Except
      end;
   fi;
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 ^GUID;
end;

Func ВзятьЗначение(aVar:S):S;
var OWA,OA,nr:I;
var F_:S;
var Val:S;
 if ID="": Message("Инициализация не выполнена",mtError); ^""; fi;
 if aVar="": Message("Введите имя параметра",mtError); ^""; fi;
 OWA=OpenWorkArea(SelfCrd,"ver",FR);
 Try
  nr=Records(OWA);
  if nr=0: 
     SetFilter(OWA,"ID='"+ID+"' and Ver="+Str(Ver));
     nr=Records(OWA);
     if nr=0:
        SetFilter(OWA,"ID='"+ID+"'");
     fi;
     nr=Records(OWA);
  fi;
  if not nr=0:
     F_="Var='"+aVar+"'";
     OA=OpenArray(OWA,nr,"LINE","",F_);
     if not Records(OA)=0:
        val=GetFieldS(OA,1,"Val");
        if GetFieldS(OA,1,"TYP")="S":
           val=ДеМаскировать(val);
        fi;
        ^val;
     fi;
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^"";
end;

Func Сохранить:L;
var OWA,n,nr,OA,z,zz,i,ii,rev_:I;
var tmp:S;
var msmRev:L;
 FlagChange=False;
 msmRev=False;
 if ID="": Message("Инициализация не выполнена",mtError); ^False; fi;
 if not CanUpdate(SelfCrd) or not CanInsert(SelfCrd) or not CanDelete(SelfCrd): Message("У вас недостаточно прав на выполнение данной операции",mtError); ^False; fi;
 zz=LengthOfArray(Раб.Настр.BufVar);
 if zz=0: Message("Нет данных для сохранения",mtError); ^False; fi;
 OWA=OpenWorkArea(SelfCrd,"",FW);
 Try
  nr=Records(OWA);
  BeginChanging(OWA,False);
  Try
   if nr=0:
      n=InsertRecord(OWA);
     else
      n=nr;
   fi;
   OA=OpenArray(OWA,n,"LINE","");
   if not GetFieldS(OWA,n,"ID")=ID:  n=PutFieldS(OWA,n,"ID",ID); FlagChange=True; fi;
   if not GetFieldI(OWA,n,"VER")=Ver: n=PutFieldI(OWA,n,"VER",Ver); FlagChange=True; fi;
   if not GetFieldS(OWA,n,"CMNT")=Cmnt: n=PutFieldS(OWA,n,"CMNT",Cmnt); FlagChange=True; fi;
   if not GetFieldI(OWA,n,"LEVEL")=Level: n=PutFieldI(OWA,n,"LEVEL",Level); FlagChange=True; fi;
   ii=Records(OA);
   if zz<ii:
      for i=1..ii-zz do
       DeleteRecord(OA,ii-i+1);
      od;
   fi;
   for z=1..zz do
    if z>ii: z=InsertRecord(OA,z); fi;
    if not GetFieldS(OA,z,"VAR")=BufVar[z]: z=PutFieldS(OA,z,"VAR",BufVar[z]); FlagChange=True; fi;
    if not GetFieldS(OA,z,"TYP")=BufTyp[z]: z=PutFieldS(OA,z,"TYP",BufTyp[z]); FlagChange=True; fi;
    if not GetFieldS(OA,z,"VAL")=BufVal[z]: z=PutFieldS(OA,z,"VAL",BufVal[z]); FlagChange=True; fi;
   od;
   if FlagChange:
      if not GetFieldS(OWA,n,"SCHEMA")=Schema: n=PutFieldS(OWA,n,"SCHEMA",Schema); FlagChange=True; fi;
      if not GetFieldS(OWA,n,"USER")=User: n=PutFieldS(OWA,n,"USER",User); FlagChange=True; fi;
      if not GetFieldS(OWA,n,"GUID")=GUID: n=PutFieldS(OWA,n,"GUID",GUID); FlagChange=True; fi;
      --читаем ревизию настройки
      z=SearchInArray(Раб.Настр.IDRev,ID,True);
      if z=-1: Rev_=-1; else Rev_=Rev[z]; fi;
      if Rev_<GetFieldI(OWA,n,"REV") and not nr=0 and not GetFieldS(OWA,n,"MODIFIEDUSER")=User:
         Message("Вы пытаетесь сохранить устаревшию настройку (rev. "+Str(Rev_)+"), актуальную настроку (rev. "+Str(GetFieldI(OWA,n,"REV"))+") сохранил пользователь: "+GetFieldS(OWA,n,"MODIFIEDUSER")+"^MАктуальная настройка будет прочитана автоматически",mtWarning);
         FlagChange=False;
         msmRev=True;
      fi;
      --читаем ревизию настройки
   fi;
   if FlagChange: 
      Rev_=GetFieldI(OWA,n,"REV")+1;
      z=PutFieldI(OWA,n,"REV",Rev_);
      z=SearchInArray(Раб.Настр.IDRev,ID,True);
      if z=-1:
         z=InsertInArraySort(Раб.Настр.IDRev,ID);
         InsertInArray(Раб.Настр.Rev,z,Rev_);
        else
         Rev[z]=Rev_;
      fi;
      EndChanging(OWA); 
     else 
      CancelChanging(OWA);  
      if VariableExists(ID+".НастрGUID"): --конечно это через ж...., а как подругому?
         PutVariableS(ID+".НастрGUID",GetFieldS(OWA,n,"GUID")); --возращаем GUID  бланк т.к. измнение не произошло
      fi;
      if msmRev:
         tmp=Загрузить("","");
         if VariableExists(ID+".НастрGUID"): PutVariableS(ID+".НастрGUID",tmp); fi;
      fi;
   fi;
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
  ID="";
 end;
 ^True;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
--Обработчики событий шаблона -----
--
Конец
