-- Шаблон создан мастером бланков
-- 05.08.2003 15:44:05
--
БланкСШаблоном "Импорт справочников";

var OpenBln:L;

var YYYY:S;
var SelfDbf:S=if(YYYY>="2013","Rpo_Voc2006."+YYYY+".dbf","Rpo_Voc2006.2012.dbf");

var FStruct:S;
var FDbf:S="\Dbf\"+SelfDbf;
var Name_Voc:S;
var Code:S;
var Txt:S;
var Txt2:S;
var Txt3:S;
var Txt4:S;
var Comment:S;
var S01:S;
var S02:S;
var S03:S;
var S04:S;
var S05:S;

var NDel:I;
var NAdd:I;
var NUpd:I;

var OWA:I;

var BufKey[]:S;
var BufName_Voc[]:S;
var BufCode[]:S;
var BufTxt[]:S;
var BufTxt2[]:S;
var BufTxt3[]:S;
var BufTxt4[]:S;
var BufCmnt[]:S;
var BufS01[]:S;
var BufS02[]:S;
var BufS03[]:S;
var BufS04[]:S;
var BufS05[]:S;
var BufState[]:L;
var BufUKey[]:Record;

var updОКДП_Гр   :L;
var updОКДП_Гр273:L;

var SelfCrd:S="РПО_Бюдж_Класс";
var Статус :I;
var Статус_:S=if(Статус=0,"Обновление справочников не требуется",if(Статус=1,"Требуется выполнить операцию импорта справочников",if(Статус=-1,"Ошибка","")));
--
--Процедуры и функции -------------
Func CreateStructFile:L;
 if not FStruct="":
    if ExistFile(FStruct): DeleteFile(FStruct); fi;
 fi;
 FStruct=PlanVar("CACHE")+"\"+GetGUID;
 CreateFile(FStruct);
 if ExistFile(FStruct)=False: Message("Ошибка создания структурного файла: "+FStruct,mtError); ^False; fi;
 Try
  WriteLn(FStruct,"Name_Voc:STRING=Name_Voc");
  WriteLn(FStruct,"Code:STRING=Code");
  WriteLn(FStruct,"Txt:STRING=Txt");
  if YYYY>="2012":
     WriteLn(FStruct,"Txt2:STRING=Txt2");
     WriteLn(FStruct,"Txt3:STRING=Txt3");
     WriteLn(FStruct,"Txt4:STRING=Txt4");
  fi;
  WriteLn(FStruct,"Comment:STRING=Comment");
  WriteLn(FStruct,"S01:STRING=S01");
  WriteLn(FStruct,"S02:STRING=S02");
  WriteLn(FStruct,"S03:STRING=S03");
  WriteLn(FStruct,"S04:STRING=S04");
  WriteLn(FStruct,"S05:STRING=S05");
 Except
  Message("Ошибка создания структурного файла: "+FStruct,mtError);
  Raise;
  ^False;
 End;
 ^True;
end;

Func NeedUpdate:I;
var Dbf:i;
var Std_Rpo,Code_:S;
var OWA:I;
 if CreateStructFile=False: ^-1; fi;
 Try
  Std_Rpo=PlanVar("Std_Rpo");
  if ExistFile(Std_Rpo+FDbf)=False: ^-1; fi;
  Dbf=DbfOpen(Std_Rpo+FDbf,FStruct,False,True,True);
  Try
   DbfFirstRecord(Dbf);
   While not DbfEndOfFile(Dbf) do
    if DbfReadBlank(Dbf,"")=False: ^-1; fi;
    if Name_Voc="VER": Break; fi;
    DbfNextRecord(Dbf);
   od;
  Finally
   DbfClose(Dbf);
  end;
  if not Name_Voc="VER": ^-1; fi;
  OWA=OpenWorkArea("РПО_Бюдж_Класс","","Name_Voc='VER'");
  Try
   if Records(OWA)=0: 
      Code_="";
     else
      Code_=GetFieldS(OWA,1,"Code");
   fi;
  Finally
   CloseWorkArea(OWA);
  end;
 Finally
  if ExistFile(FStruct): DeleteFile(FStruct); fi;
 end;
 if Code=Code_: ^0; else ^1; fi;
end;

Func ЕстьЗаписиОКДП:L;
var OWA:I;
 OWA=OpenWorkArea("РПО_ОКДП","");
 Try
  ^Records(OWA)>0;
 Finally
  CloseWorkArea(OWA);
 end;
end;

Proc СинхронПризнакОКДП(aГр:S; aКод:S; aНаим:S; v:i);
var Признак_,voc:S;
var OWA,n:I;
 if aГр="": Exit; fi;
 voc=if(v=273,"ОКДП2.","ОКДП.");
 Признак_=aГр+if(aКод="","","."+aКод);
 if Name_A(voc+Признак_)=" ":
    OWA=OpenWorkArea("РПО_Признак_ОКДП","","Признак='"+Признак_+"'");
    Try
     BeginChanging(OWA,False);
     Try
      n=Records(OWA);
      if n=0: n=InsertRecord(OWA); fi;
      if not GetFieldS(OWA,n,"Признак")=Признак_: n=PutFieldS(OWA,n,"Признак",Признак_); fi;
      if not GetFieldS(OWA,n,"Признак_Кмнт")=aНаим: n=PutFieldS(OWA,n,"Признак_Кмнт",aНаим); fi;
      if not GetFieldL(OWA,n,"Разрешено"): n=PutFieldL(OWA,n,"Разрешено",True); fi;
      if not GetFieldI(OWA,n,"ver")=v: n=PutFieldI(OWA,n,"ver",v); fi;
      EndChanging(OWA);
     Except
      CancelChanging(OWA);
      Raise;
     end;
    Finally
     CloseWorkArea(OWA);
    end;
 fi;
end;

Proc СинхронОКДП(v:i);
var OWAs,OWAt,s,ss,t,tt,w,ww,z,i,ii,a,d,x,y,yy:i;
var tmp,s01,mask,mask_,гр,гр_,c12,c3,c4,c5,c6,c7,voc,grp:S;
var tm,p1,p2:i;
var Наим1,Наим2:S;
var Rec: Record;
var Flag1,Flag2:L;
 if Раб.Бюджет2005.Сетевая:
    i=Раб.Семафор.Статус("РПО_ОКДП",0);
    if not i=0 then
       if not GetActiveBlankName="РАБ.ВСПОМ.ИМПОРТ_СПРАВ" and i=1: Message("Операция уже выполняется пользователем "+Раб.Семафор.mUser,mtWarning); fi;
       Exit;
    fi;
    Раб.Семафор.Установить("РПО_ОКДП",0,0,"",True,1.1.100,0);
    Flag1=True;
    if not Раб.Семафор.Статус(SelfCrd,0)=1:
       Раб.Семафор.Установить(SelfCrd,0,0,"",True,1.1.100,0);
       Flag2=True;
    fi;
 fi;
 Try
  voc=if(v=273,"ОКДП_ГР273","ОКДП_ГР");
  grp=if(v=273,"ГР273","ГР");
  ClearVariable(Раб.Вспом.Импорт_Справ.BufUKey);
  ClearVariable(Раб.Вспом.Импорт_Справ.BufS01);
  ClearVariable(Раб.Вспом.Импорт_Справ.BufS02);
  RefreshAna;
  a=0; d=0;
  tm=Time;
  OWAs=OpenWorkArea(SelfCrd,"","Name_Voc='"+voc+"'");
  Try
   ss=Records(OWAs);
   if ss=0: Exit; fi;
   OWAt=OpenWorkArea("РПО_ОКДП","","");
   Try
    tt=Records(OWAt);
    if tt=0: Exit; fi;
    ShowProgress(ss*2,"Синхронизация номенклатурных групп ОКДП "+if(v=273,"(в ред. приказа 273)","(в ред. приказа 601)")+"...");
    BeginChanging(OWAt,False);
    Try
     z=0;
     for s=1..ss do
      ProgressPos(s);
      гр=GetFieldS(OWAs,s,"CODE");
      СинхронПризнакОКДП(гр,"0000000",GetFieldS(OWAs,s,"TXT"),v);
      s01=GetFieldS(OWAs,s,"S01");
      ww=WordsCount(s01," ");
      ClearVariable(Раб.Вспом.Импорт_Справ.BufCode);
      ClearVariable(Раб.Вспом.Импорт_Справ.BufCmnt);
      for w=1..ww do
       mask=ExtractWord(w,s01," ");
       mask_=mask;
       if SubStr(mask,1,1)="~": mask=SubStr(mask,2,255); гр_=""; else гр_=гр; fi;
       if Pos("-",mask)=0: --если не указан диапазон
          c12=SubStr(mask,1,2);
          c3=SubStr(mask,3,1);
          c4=SubStr(mask,4,1);
          c5=SubStr(mask,5,1);
          c6=SubStr(mask,6,1);
          c7=SubStr(mask,7,1);
          if c5="0" and not c6+c7="00": mask=c12+c3+c4+c5+c6+if(c7="0","?",c7); --это подкласс
            |c3+c4+c5+c6+c7="00000": mask=c12+"?????";
            |c5+c6+c7="000": mask=c12+c3+if(c4="0","?",c4)+"???";
            |True: mask=c12+c3+c4+c5+c6+if(c7="0","?",c7);
          fi;
          SetFilter(OWAt,"Match(КОД,'"+mask+"')");
         else
          SetFilter(OWAt,"Код>='"+Trim(ExtractWord(1,mask,"-"))+"' and Код<='"+Trim(ExtractWord(2,mask,"-"))+"'"); -- если задан диапазон
       fi;
       ClearVariable(Раб.Вспом.Импорт_Справ.BufS01);
       tt=Records(OWAt);
       for t=1..tt do
        Hint("Группа "+Гр+" ОКДП "+Mask_+" Записей "+Str(t)+" из "+Str(tt));
        Rec=GetRecordKey(OWAt,t);
        x=SearchInArray(Раб.Вспом.Импорт_Справ.BufUKey,Rec,True);
        if x=-1:
           if not GetFieldS(OWAt,t,grp)=Гр_:
              t=PutFieldS(OWAt,t,grp,Гр_);
              z=z+1;
              a=a+1;
           fi;
           x=InsertInArraySort(Раб.Вспом.Импорт_Справ.BufUKey,Rec);
           InsertInArray(Раб.Вспом.Импорт_Справ.BufS02,x,if(гр_="","",гр));
          else
           if (BufS02[x]=гр and not BufS02[x]=гр_) or BufS02[x]="":
              if not GetFieldS(OWAt,t,grp)=Гр_:
                 t=PutFieldS(OWAt,t,grp,Гр_);
                 z=z+1;
                 a=a+if(гр_="",-1,1);
              fi;
              BufS02[x]=if(гр_="","",гр);
             else
              --debug
 --             if гр_="" and not BufS02[x]=гр:
 --                y=SearchInArray(Раб.Вспом.Импорт_Справ.BufCode,RecordToString(Раб.Вспом.Импорт_Справ.BufUKey[x]),True);
 --                if y=-1:
 --                   y=InsertInArraySort(Раб.Вспом.Импорт_Справ.BufCode,RecordToString(Раб.Вспом.Импорт_Справ.BufUKey[x]));
 --                   InsertInArray(Раб.Вспом.Импорт_Справ.BufCmnt,y,"Внимание! Сброс чужой группы old="+BufS02[x]+" new="+гр+" ОКДП="+GetFieldS(OWAt,t,"КОД")+", присвоение пропущено");
 --                  else
 --                   DeleteFromArray(Раб.Вспом.Импорт_Справ.BufCode,y);
 --                   DeleteFromArray(Раб.Вспом.Импорт_Справ.BufCmnt,y);
 --                fi;
 --               |not гр_="" and not BufS02[x]=гр:
 --                y=SearchInArray(Раб.Вспом.Импорт_Справ.BufCode,RecordToString(Раб.Вспом.Импорт_Справ.BufUKey[x]),True);
 --                if y=-1:
 --                   y=InsertInArraySort(Раб.Вспом.Импорт_Справ.BufCode,RecordToString(Раб.Вспом.Импорт_Справ.BufUKey[x]));
 --                   InsertInArray(Раб.Вспом.Импорт_Справ.BufCmnt,y,"Внимание! Переопределение группы old="+BufS02[x]+" new="+гр+" ОКДП="+GetFieldS(OWAt,t,"КОД")+", присвоение пропущено");
 --                fi;
 --             fi;
              --debug
           fi;
        fi;
        if GetFieldL(OWAt,t,"ЭтоКласс"):
           Наим1=GetFieldS(OWAt,t,"Наим");
           Наим2=GetFieldS(OWAt,t,"Наим2");
           p1=Pos("[",Наим1);
           p2=Pos("[",Наим2);
           if not p1=0:
              Наим1=SubStr(Наим1,p1,255)+Наим2; --стыкуем строки
              p1=1;
              tmp=SubStr(Наим1,p1+1,7);
              Наим1=SubStr(Наим1,p1+8,255);
              p1=Pos("[",Наим1);
              tmp=tmp+"#"+SubStr(Наим1,p1+1,7);
              AddInArray(Раб.Вспом.Импорт_Справ.BufS01,True,False,tmp);
             |not p2=0:
              tmp=SubStr(Наим2,p2+1,7);
              Наим2=SubStr(Наим2,p2+8,255);
              p2=Pos("[",Наим2);
              tmp=tmp+"#"+SubStr(Наим2,p2+1,7);
              AddInArray(Раб.Вспом.Импорт_Справ.BufS01,True,False,tmp);
           fi;
        fi;
        if z>=1000:
           Hint("Фиксация...");
           EndChanging(OWAt);
           if Раб.Бюджет2005.Сетевая:
              Раб.Семафор.Обновить(True,SelfCrd,0,0,"",True,1.1.100);
              Раб.Семафор.Обновить(True,"РПО_ОКДП",0,0,"",True,1.1.100);
           fi;
           BeginChanging(OWAt,False);
           z=0;
        fi;
       od; --for t=1..tt do
       ii=LengthOfArray(Раб.Вспом.Импорт_Справ.BufS01);
       for i=1..ii do
        SetFilter(OWAt,"Код>='"+ExtractWord(1,Раб.Вспом.Импорт_Справ.BufS01[i],"#")+"' and Код<='"+ExtractWord(2,Раб.Вспом.Импорт_Справ.BufS01[i],"#")+"'");
        mask_=ExtractWord(1,Раб.Вспом.Импорт_Справ.BufS01[i],"#")+"-"+ExtractWord(2,Раб.Вспом.Импорт_Справ.BufS01[i],"#");
        tt=Records(OWAt);
        for t=1..tt do
         Hint("Группа "+Гр+" ОКДП ("+Mask_+") Записей "+Str(t)+" из "+Str(tt));
         Rec=GetRecordKey(OWAt,t);
         x=SearchInArray(Раб.Вспом.Импорт_Справ.BufUKey,Rec,True);
         if x=-1:
            if not GetFieldS(OWAt,t,grp)=Гр_:
               t=PutFieldS(OWAt,t,grp,Гр_);
               z=z+1;
               a=a+1;
            fi;
            x=InsertInArraySort(Раб.Вспом.Импорт_Справ.BufUKey,Rec);
            InsertInArray(Раб.Вспом.Импорт_Справ.BufS02,x,if(гр_="","",гр));
           else
           if (BufS02[x]=гр and not BufS02[x]=гр_) or BufS02[x]="":
              if not GetFieldS(OWAt,t,grp)=Гр_:
                 t=PutFieldS(OWAt,t,grp,Гр_);
                 z=z+1;
                 a=a+if(гр_="",-1,1);
              fi;
              BufS02[x]=if(гр_="","",гр);
             else
              --debug
 --             if гр_="" and not BufS02[x]=гр:
 --                y=SearchInArray(Раб.Вспом.Импорт_Справ.BufCode,RecordToString(Раб.Вспом.Импорт_Справ.BufUKey[x]),True);
 --                if y=-1:
 --                   y=InsertInArraySort(Раб.Вспом.Импорт_Справ.BufCode,RecordToString(Раб.Вспом.Импорт_Справ.BufUKey[x]));
 --                   InsertInArray(Раб.Вспом.Импорт_Справ.BufCmnt,y,"Внимание! Сброс чужой группы old="+BufS02[x]+" new="+гр+" ОКДП="+GetFieldS(OWAt,t,"КОД")+", присвоение пропущено");
 --                  else
 --                   DeleteFromArray(Раб.Вспом.Импорт_Справ.BufCode,y);
 --                   DeleteFromArray(Раб.Вспом.Импорт_Справ.BufCmnt,y);
 --                fi;
 --               |not гр_="" and not BufS02[x]=гр:
 --                y=SearchInArray(Раб.Вспом.Импорт_Справ.BufCode,RecordToString(Раб.Вспом.Импорт_Справ.BufUKey[x]),True);
 --                if y=-1:
 --                   y=InsertInArraySort(Раб.Вспом.Импорт_Справ.BufCode,RecordToString(Раб.Вспом.Импорт_Справ.BufUKey[x]));
 --                   InsertInArray(Раб.Вспом.Импорт_Справ.BufCmnt,y,"Внимание! Переопределение группы old="+BufS02[x]+" new="+гр+" ОКДП="+GetFieldS(OWAt,t,"КОД")+", присвоение пропущено");
 --                fi;
 --             fi;
              --debug
           fi;
         fi;
         if z>=1000:
            Hint("Фиксация...");
            EndChanging(OWAt);
            if Раб.Бюджет2005.Сетевая:
               Раб.Семафор.Обновить(True,SelfCrd,0,0,"",True,1.1.100);
               Раб.Семафор.Обновить(True,"РПО_ОКДП",0,0,"",True,1.1.100);
            fi;
            BeginChanging(OWAt,False);
            z=0;
         fi;
        od; --for t=1..tt do
       od; --for i=1..ii do
      od; --for w=1..ww do
      --debug
 --     yy=LengthOfArray(Раб.Вспом.Импорт_Справ.BufCode);
 --     if not yy=0:
 --        Trace("---------");
 --     fi;
 --     for y=1..yy do
 --      Trace(Раб.Вспом.Импорт_Справ.BufCmnt[y]);
 --     od;
      --debug
     od; --for s=1..ss do
     EndChanging(OWAt);
     SetFilter(OWAt,"not "+grp+"='' and UpdateTimeSec<"+Str(tm));
     tt=Records(OWAt);
     if not tt=0:
        ShowProgress(tt*2,"Синхронизация номенклатурных групп ОКДП "+if(v=273,"(в ред. приказа 273)","(в ред. приказа 601)")+"...");
        z=0;
        BeginChanging(OWAt,False);
        for t=1..tt do
         ProgressPos(tt+t);
         Hint("Проверка групп..."+Str(t)+" из "+Str(tt)+" сброшено записей "+Str(d));
         if SearchInArray(Раб.Вспом.Импорт_Справ.BufUKey,GetRecordKey(OWAt,tt-(t-1)),True)=-1:
            w=PutFieldS(OWAt,tt-(t-1),grp,"");
            z=z+1;
            d=d+1;
            if z>=1000:
               Hint("Фиксация...");
               EndChanging(OWAt);
               if Раб.Бюджет2005.Сетевая:
                  Раб.Семафор.Обновить(True,SelfCrd,0,0,"",True,1.1.100);
                  Раб.Семафор.Обновить(True,"РПО_ОКДП",0,0,"",True,1.1.100);
               fi;
               BeginChanging(OWAt,False);
               z=0;
            fi;
         fi;
        od;
        EndChanging(OWAt);
       else
        ProgressPos(ss*2);
     fi;
    Except
     CancelChanging(OWAt);
     Raise;
    end;
   Finally
    CloseWorkArea(OWAt);
   end;
  Finally
   CloseWorkArea(OWAs);
   CloseProgress;
  end;
  if Раб.Бюджет2005.Сетевая:
     Раб.Семафор.Обновить(True,SelfCrd,0,0,"",True,1.1.100);
     Раб.Семафор.Обновить(True,"РПО_ОКДП",0,0,"",True,1.1.100);
  fi;
  OWAt=OpenWorkArea("РПО_СТАТУС","","ID='РПО_ОКДП'");
  Try
   tt=Records(OWAt);
   BeginChanging(OWAt,False);
   Try
    if tt=0:
       tt=InsertRecord(OWAt);
    fi;
    tt=PutFieldS(OWAt,tt,"ID","РПО_ОКДП");
    tt=PutFieldI(OWAt,tt,"VAL_I",5);
    EndChanging(OWAt);
   Except
    CancelChanging(OWAt);
    Raise;
   end;
  Finally
   CloseWorkArea(OWAt);
  end;
 Finally
  if Раб.Бюджет2005.Сетевая:
     if Flag1: Раб.Семафор.Снять("РПО_ОКДП",true); fi;
     if Flag2: Раб.Семафор.Снять(SelfCrd,true); fi;
  fi;
 end;
 Message("Синхронизация завершена");
end;

--Процедуры и функции -------------
--
--Обработчики событий объектов--------
Proc btnЗагрузить_onClick (Obj:S);
var Dbf,n,nrDBF,nrOWA,z,i:i;
var Std_Rpo:S;
var Flag,FlagS:L;
var Err:I;
 if CanInsert(SelfCrd)=False or CanUpdate(SelfCrd)=False or CanDelete(SelfCrd)=False: Message("Вы необладаете достаточными правами для выполнения операции импорта справочников",mtError); Exit; fi;
 if Раб.Бюджет2005.Сетевая:
    n=Раб.Семафор.Статус(SelfCrd,0);
    if not n=0 then
       if GetActiveBlankName="РАБ.ВСПОМ.ИМПОРТ_СПРАВ" and n=1: Message("Операция уже выполняется пользователем "+Раб.Семафор.mUser,mtWarning); fi;
       Exit;
    fi;
    Раб.Семафор.Установить(SelfCrd,0,0,"",True,1.1.100,0);
    FlagS=True;
 fi;
 ClearVariable(BufKey);
 ClearVariable(BufName_Voc);
 ClearVariable(BufCode);
 ClearVariable(BufTxt);
 ClearVariable(BufTxt2);
 ClearVariable(BufTxt3);
 ClearVariable(BufTxt4);
 ClearVariable(BufCmnt);
 ClearVariable(BufS01);
 ClearVariable(BufS02);
 ClearVariable(BufS03);
 ClearVariable(BufS04);
 ClearVariable(BufS05);
 ClearVariable(BufUKey);
 ClearVariable(BufState);
 NDel=0; NAdd=0; NUpd=0;
 Err=0;
 updОКДП_ГР=False;
 updОКДП_ГР273=False;
 if CreateStructFile=False: Exit; fi;
 Try
  Std_Rpo=PlanVar("Std_Rpo");
  if ExistFile(Std_Rpo+FDbf)=False: Message("Отсутствует справочный файл ("+Std_Rpo+FDbf+") Импорт не возможен.",mtError); Статус=-1; Exit; fi;
  Dbf=DbfOpen(Std_Rpo+FDbf,FStruct,False,True,True);
  Try
   DbfFirstRecord(Dbf);
   nrDBF=0;
   While not DbfEndOfFile(Dbf) do
    NrDbf=NrDbf+1;
    DbfNextRecord(Dbf);
   od;
   ShowProgress(nrDBF*2,"Импорт справочников");
   DbfFirstRecord(Dbf);
   for n=1..nrDBF do
    ProgressPos(n);
    Hint("Чтение данных..."+Str(n));
    if DbfReadBlank(Dbf,"")=False: Message("Ошибка чтения справочного файла",mtError); Статус=-1; Exit; fi;
    z=InsertInArraySort(BufKey,Up(Name_Voc+"#"+Code));
    InsertInArray(BufName_Voc,z,Name_Voc);
    InsertInArray(BufCode,z,Code);
    InsertInArray(BufTxt,z,Txt);
    InsertInArray(BufTxt2,z,Txt2);
    InsertInArray(BufTxt3,z,Txt3);
    InsertInArray(BufTxt4,z,Txt4);
    InsertInArray(BufCmnt,z,Comment);
    InsertInArray(BufS01,z,S01);
    InsertInArray(BufS02,z,S02);
    InsertInArray(BufS03,z,S03);
    InsertInArray(BufS04,z,S04);
    InsertInArray(BufS05,z,S05);
    DbfNextRecord(Dbf);
   od;
  Finally
   DbfClose(dbf);
  end;
  OWA=OpenWorkArea(SelfCrd,"");
  Try
   nrOWA=Records(OWA);
   ShowProgress(Max(nrOWA,nrDbf)*2,"Импорт справочников");
   ProgressPos(Max(nrOWA,nrDbf));
   BeginChanging(OWA,True);
   Try
    for i=1..nrOWA do
     ProgressPos(nrOWA+i);
     n=nrOWA-(i-1); --идем с конца
     Hint("Синхронизация данных..."+Str(n));
     --if not LockRecord(OWA,n,0): SetError(ErrUserBasis+1,"Выполнение операции импорта справочников отменено. ^MВ данный момент операция импорта уже выполняется другим пользователем."); fi;
     z=SearchInArray(BufKey,Up(GetFieldS(OWA,n,"Name_Voc")+"#"+GetFieldS(OWA,n,"Code")),True);
     if z=-1:
        DeleteRecord(OWA,n);
        NDel=NDel+1;
       else
        if BufState[z]: --дубль
           DeleteRecord(OWA,n);
           NDel=NDel+1;
          else
           Flag=False;
           if not BufTxt[z]=GetFieldS(OWA,n,"Txt"):      n=PutFieldS(OWA,n,"Txt",BufTxt[z]); Flag=True; fi;
           if not BufTxt2[z]=GetFieldS(OWA,n,"Txt2"):    n=PutFieldS(OWA,n,"Txt2",BufTxt2[z]); Flag=True; fi;
           if not BufTxt3[z]=GetFieldS(OWA,n,"Txt3"):    n=PutFieldS(OWA,n,"Txt3",BufTxt3[z]); Flag=True; fi;
           if not BufTxt4[z]=GetFieldS(OWA,n,"Txt4"):    n=PutFieldS(OWA,n,"Txt4",BufTxt4[z]);  Flag=True; fi;
           if not BufCmnt[z]=GetFieldS(OWA,n,"Comment"): n=PutFieldS(OWA,n,"Comment",BufCmnt[n]); Flag=True; fi;
           if not BufS01[z]=GetFieldS(OWA,n,"S01"):      n=PutFieldS(OWA,n,"S01",BufS01[z]); Flag=True;  fi;
           if not BufS02[z]=GetFieldS(OWA,n,"S02"):      n=PutFieldS(OWA,n,"S02",BufS02[z]); Flag=True; fi;
           if not BufS03[z]=GetFieldS(OWA,n,"S03"):      n=PutFieldS(OWA,n,"S03",BufS03[z]); Flag=True; fi;
           if not BufS04[z]=GetFieldS(OWA,n,"S04"):      n=PutFieldS(OWA,n,"S04",BufS04[z]); Flag=True; fi;
           if not BufS05[z]=GetFieldS(OWA,n,"S05"):      n=PutFieldS(OWA,n,"S05",BufS05[z]); Flag=True; fi;
           if Flag:
              if BufName_Voc[z]="ОКДП_ГР" and not updОКДП_ГР: updОКДП_ГР=True; fi;
              if BufName_Voc[z]="ОКДП_ГР273" and not updОКДП_ГР273: updОКДП_ГР273=True; fi;
              NUpd=NUpd+1;
           fi;
           BufState[z]=True;
        fi;
     fi;
    od; --for i=1..nrOWA do
    --Добавляем новые записи
    i=SearchInArray(BufState,False,False);
    if LengthOfArray(BufState)=0: i=1; fi;
    if i>0:
       for z=i..nrDbf do
        Hint("Добавление данных..."+Str(z));
        ProgressPos(nrDbf+z);
        if not BufState[z]:
           n=InsertRecord(OWA);
           n=PutFieldS(OWA,n,"Name_Voc",BufName_Voc[z]);
           n=PutFieldS(OWA,n,"Code",BufCode[z]);
           n=PutFieldS(OWA,n,"Txt",BufTxt[z]);
           n=PutFieldS(OWA,n,"Txt2",BufTxt2[z]);
           n=PutFieldS(OWA,n,"Txt3",BufTxt3[z]);
           n=PutFieldS(OWA,n,"Txt4",BufTxt4[z]);
           n=PutFieldS(OWA,n,"Comment",BufCmnt[z]);
           n=PutFieldS(OWA,n,"S01",BufS01[z]);
           n=PutFieldS(OWA,n,"S02",BufS02[z]);
           n=PutFieldS(OWA,n,"S03",BufS03[z]);
           n=PutFieldS(OWA,n,"S04",BufS04[z]);
           n=PutFieldS(OWA,n,"S05",BufS05[z]);
           if BufName_Voc[z]="ОКДП_ГР" and not updОКДП_ГР: updОКДП_ГР=True; fi;
           if BufName_Voc[z]="ОКДП_ГР273" and not updОКДП_ГР273: updОКДП_ГР273=True; fi;
           NAdd=NAdd+1;
        fi;
       od;
    fi;
    updОКДП_Гр=False;
    updОКДП_ГР273=False;
    if (updОКДП_ГР or updОКДП_ГР273) and ЕстьЗаписиОКДП:
       if not CanUpdate("РПО_ОКДП") or not CanUpdate("РПО_СТАТУС") or not CanInsert("РПО_СТАТУС") or not CanUpdate("РПО_ПРИЗНАК_ОКДП") or not CanInsert("РПО_ПРИЗНАК_ОКДП"):
          Message("Вы необладаете достаточными правами для выполнения операции импорта справочников (ОКДП)",mtError); Err=-1; Статус=-1; CancelChanging(OWA); Exit; 
       fi;
    fi;
    if not nAdd=0 or not nUpd=0 or not nDel=0:
       Hint("Фиксация данных...");
       EndChanging(OWA);
    fi;
   Except
    CancelChanging(OWA);
    Статус=-1;
    Err=ErrorCode;
    nrDbf=0; nAdd=0; nUpd=0; nDel=0;
    Raise;
   end;
  Finally
   CloseProgress;
   CloseWorkArea(OWA);
  end;
 Finally
  if ExistFile(FStruct): DeleteFile(FStruct); fi;
  if Раб.Бюджет2005.Сетевая and FlagS: Раб.Семафор.Снять(SelfCrd,true); fi;
 end;
 if updОКДП_ГР: СинхронОКДП(601); fi;
 if updОКДП_ГР273: СинхронОКДП(273); fi;
 Статус=2;
 Message("Импорт справочников завершен. Обработано записей всего: "+Str(nrDBF)+" из них обновлено : "+Str(NUpd)+" добавлено: "+Str(NAdd)+" удалено: "+Str(NDel));
 Close;
end;

Proc btnЗакрыть_onClick (Obj:S);
 Close;
end;
--Обработчики событий объектов--------
--
--Обработчики событий полей--------
--Обработчики событий полей--------
--
--
--Обработчики событий шаблона---------
Proc Template_onOpen (Create:L);
 if not ExistsCardFile(SelfCrd): Close; fi;
 Try
  YYYY=PlanVar("ГОД");
 Except
  YYYY="";
 end;
 Статус=NeedUpdate;
 if OpenBln=True:
    OpenBln=False;
    if Статус=-1 or Статус=0 or IsReadOnly(SelfCrd) or not Раб.Семафор.Статус(SelfCrd,0)=0: Close; fi;
 fi;
end;

Proc Template_onClose(Destroy: Logical);
 ClearVariable(BufKey);
 ClearVariable(BufName_Voc);
 ClearVariable(BufCode);
 ClearVariable(BufTxt);
 ClearVariable(BufTxt2);
 ClearVariable(BufTxt3);
 ClearVariable(BufTxt4);
 ClearVariable(BufCmnt);
 ClearVariable(BufS01);
 ClearVariable(BufS02);
 ClearVariable(BufS03);
 ClearVariable(BufS04);
 ClearVariable(BufS05);
 ClearVariable(BufUKey);
 ClearVariable(BufState);
 if ExistFile(FStruct): DeleteFile(FStruct); fi;
end;
--Обработчики событий шаблона---------
--


Конец
