-- Шаблон создан мастером бланков
-- 06.06.2006 14:37:16
--
БланкСШаблоном [20.04.2006] "Добавление отсутствующих признаков";


УпрСправ:I;

Справ[]:S;
НаимСправ[]:S;
Призн000[]:S;
НаимПризн000[]:S;
ДопАнаУсл[]:S;


УпрКарт:I;

var пп[]:i=$;
Жур[]:S;
Карт[]:S;
КартНаим[]:S;
КартПолеСчДеб[]:S;
КартПолеСчКре[]:S;
КартПоляАн[]:S;
var КартПоляАн_[]:S=КартПоляАн[$];
КартПолеАн[]:S;
ИсклСправ[]:S;
var ИсклСправ_[]:S=ИсклСправ[$];
КартДопФ[]:S;

var ППП:S;

var A:S="+";
var D:S="-";

var StoreField:S;
var StoreJur:S;

var Buf[]:S;
var Buf1[]:S;
var Buf2[]:S;

var FKey[]:S;
var FСчДеб[]:S;
var FСчКре[]:S;
var FПризнаки[]:S;
var FПризнак[]:S;

var ИС:S="Выбрать...";

Связанные:L;
var МаскаСвязанСправ:S;
--
--Процедуры и функции -------------
Proc Очистить;
 ClearVariable(УпрКарт);
 ClearVariable(Жур);
 ClearVariable(Карт);
 ClearVariable(КартНаим);
 ClearVariable(КартПолеСчДеб);
 ClearVariable(КартПолеСчКре);
 ClearVariable(КартПоляАн);
 ClearVariable(КартПолеАн);
 ClearVariable(ИсклСправ);
 ClearVariable(КартДопФ);
end;

Proc УдалитьПустыеСтроки;
var Iter:I;
 Iter=1;
 While Iter<=УпрСправ do
  if Справ[Iter]="": DeleteFrame(УпрСправ,Iter); else Iter=Iter+1; fi;
 od;
 if УпрСправ<1: InsertFrame(УпрСправ,УпрСправ+1); fi;
 --
 Iter=1;
 While Iter<=УпрКарт do
  if Жур[Iter]="" and КартДопФ[Iter]="": DeleteFrame(УпрКарт,Iter); else Iter=Iter+1; fi;
 od;
 if УпрКарт<1: InsertFrame(УпрКарт,УпрКарт+1); fi;
end;

Func ВзятьКлючРаздела(vРаздел:S):Record;-- возвращает UKEY раздела
var OWA,i:i;
 OWA=OpenWorkArea('Table_Razd','','РАЗДЕЛ="'+vРаздел+'"');
 Try
  if Records(OWA)=0: ^nil; fi;
  ^GetRecordKey(OWA,1);
 Finally
  CloseWorkArea(OWA);
 end;
end;

Func СформПакетПолей (vFСчДеб:S; vFСчКре:S; vFПризнаки:S; vFПризнак:S):I;
var w,ww,z:i;
var tmp,sub:s;
 ClearVariable(FKey);
 ClearVariable(FСчДеб);
 ClearVariable(FСчКре);
 ClearVariable(FПризнаки);
 ClearVariable(FПризнак);
 --
 if Pos("@",vFСчДеб)=0: Sub=""; else Sub=ExtractWord(1,vFСчДеб,"@"); fi;
 z=SearchInArray(FKey,Sub,True);
 if z=-1:
    z=InsertInArraySort(FKey,sub);
    InsertInArray(FСчДеб,z,vFСчДеб);
    InsertInArray(FСчКре,z,"");
    InsertInArray(FПризнаки,z,"");
    InsertInArray(FПризнак,z,"");
   else
    FСчДеб[z]=vFСчДеб;
 fi;
 --
 if Pos("@",vFСчКре)=0: Sub=""; else Sub=ExtractWord(1,vFСчКре,"@"); fi;
 z=SearchInArray(FKey,Sub,True);
 if z=-1:
    z=InsertInArraySort(FKey,sub);
    InsertInArray(FСчДеб,z,"");
    InsertInArray(FСчКре,z,vFСчКре);
    InsertInArray(FПризнаки,z,"");
    InsertInArray(FПризнак,z,"");
   else
    FСчКре[z]=vFСчКре;
 fi;
 --
 ww=WordsCount(vFПризнаки," ");
 for w=1..ww do
  tmp=ExtractWord(w,vFПризнаки," ");
  if Pos("@",tmp)=0: Sub=""; else Sub=ExtractWord(1,tmp,"@"); fi;
  z=SearchInArray(FKey,Sub,True);
  if z=-1:
     z=InsertInArraySort(FKey,sub);
     InsertInArray(FСчДеб,z,"");
     InsertInArray(FСчКре,z,"");
     InsertInArray(FПризнаки,z,tmp);
     InsertInArray(FПризнак,z,"");
    else
     FПризнаки[z]=Раб.Бюджет2005.Объединить(FПризнаки[z],tmp," ");
  fi;
 od;
 --
 if Pos("@",vFПризнак)=0: Sub=""; else Sub=ExtractWord(1,vFПризнак,"@"); fi;
 z=SearchInArray(FKey,Sub,True);
 if z=-1:
    z=InsertInArraySort(FKey,sub);
    InsertInArray(FСчДеб,z,"");
    InsertInArray(FСчКре,z,"");
    InsertInArray(FПризнаки,z,"");
    InsertInArray(FПризнак,z,tmp);
   else
    FПризнак[z]=vFПризнак;
 fi;
 ^LengthOfArray(FKey);
end;

Func ПолучитьППП:S;
var n:i;
 ClearVariable(Buf);
 Раб.Бюджет2005.РежимМаски="?";
 n=GetGroupAccounts(Раб.Бюджет2005.МаскаСчетаФКР+"|"+Раб.Бюджет2005.МаскаСчетаКД+"|"+Раб.Бюджет2005.МаскаСчетаКИФД,Buf,1);
 if n=0: ^"000"; else ^Buf[1]; fi;
end;

func ПроверитАнаУсл(Признаки:S; Усл:S):L;
var i,ii:I;
 if Усл="": return true; fi;
 ii=WordsCount(Признаки, " ");
 for i=1..ii do
   if Раб.Бюджет2005.MatchMask(ExtractWord(i,Признаки, " "),Усл):
      return True;
   fi;
 od;
 return False;
end;

Func ДобавитьПризнак (Iter:I; vСчДеб:S; vСчКре:S; vПризнаки:S):S;
var МаскаСправ,Справ_,Признак,Роль,Признак2,ТипСчДеб,ТипСчКре,tmp:S;
var z,w,ww,n:i;
 if vСчДеб="" or vСчКре="": ^""; fi;
 if Name_S(vСчДеб)=" " or Name_S(vСчКре)=" ": ^""; fi;
 if not Correspond(vСчДеб,vСчКре): ^""; fi;
 ClearVariable(Buf);
 ClearVariable(Buf1);
 ClearVariable(Buf2);
 ww=WordsCount(vПризнаки," ");
 for w=1..ww do
  Признак=ExtractWord(w,vПризнаки," ");
  Справ_=SubStr(Признак,1,Pos(".",Признак)-1);
  Роль=VocRole(Справ_);
  z=InsertInArraySort(Buf,Роль);
  InsertInArray(Buf1,z,Справ_);
  InsertInArray(Buf2,z,"");
 od;
 if Связанные:
    МаскаСправ=Раб.Бюджет2005.Объединить(SignsMask(vСчДеб,False),SignsMask(vСчКре,False),"|");
    МаскаСправ=Раб.Бюджет2005.ПривестиВСоотвНаборСлов(МаскаСправ,"|",МаскаСвязанСправ,"|");
    МаскаСправ=Раб.Бюджет2005.Объединить(МаскаСправ,SignsMask(vСчДеб,True),"|");
    МаскаСправ=Раб.Бюджет2005.Объединить(МаскаСправ,SignsMask(vСчКре,True),"|");
   else
    МаскаСправ=Раб.Бюджет2005.Объединить(SignsMask(vСчДеб,True),SignsMask(vСчКре,True),"|");
 fi;
 if not ИсклСправ[Iter]="": МаскаСправ=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(МаскаСправ,"|",ИсклСправ[Iter],"|"); fi;
 ww=WordsCount(МаскаСправ,"|");
 for w=1..ww do
   Справ_=ExtractWord(w,МаскаСправ,"|");
   Справ_=SubStr(Справ_,1,Pos(".",Справ_)-1);
   Роль=VocRole(Справ_);
   if not Роль="": z=SearchInArray(Buf,Роль,True); else z=SearchInArray(Buf1,Справ_,False); fi;
   if z=-1 or (not z=-1 and Роль="КБК" and not Buf2[z]=""):
      n=SearchInArray(Справ,Справ_+".*",False);
      if n=-1:
         if Справ_="ФКР": Признак=Справ_+"."+ППП+".0000.0000000.000";
           |Справ_="КД": Признак=Справ_+"."+ППП+".0.00.00000.00.0000";
           |Справ_="КИФД": Признак=Справ_+"."+ППП+".00.00.00.00.00.0000";
           |True: Признак=Справ_+".000";
         fi;
        else
         Признак=Призн000[n];
      fi;
      if n<>-1:
         if ПроверитАнаУсл(vПризнаки,ДопАнаУсл[n]):
           n=-1;
         fi;
      fi;
      if n=-1:
         z=InsertInArraySort(Buf,Роль);
         InsertInArray(Buf1,z,Справ_);
         InsertInArray(Buf2,z,Признак);
      fi;
   fi;
 od;
 ww=LengthOfArray(Buf);
 Признак="";
 Признак2="";
 for w=1..ww do
  if not Buf2[w]="": 
     if not Buf[w]="КБК":
        Признак=Признак+" "+Buf2[w];
       else
        Признак2=Признак2+" "+Buf2[w];
     fi;
  fi;
 od;
 --Корректировка роли КБК
 if WordsCount(Признак2," ")>1:
    ТипСчДеб=Раб.Бюджет2005.ТипКБКСчета(vСчДеб);
    ТипСчКре=Раб.Бюджет2005.ТипКБКСчета(vСчКре);
    if ТипСчДеб="ФКР" or ТипСчКре="ФКР": tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Признак2," ","ФКР.*","");
      |ТипСчДеб="КД" or ТипСчКре="КД": tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Признак2," ","КД.*","");
      |True:
       tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(vПризнаки+Признак," ","КОСГУ.*","");
       if Match(tmp,Раб.Бюджет2005.МаскаРасхКОСГУ): tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Признак2," ","ФКР.*","");
         |Match(tmp,Раб.Бюджет2005.МаскаДоходКОСГУ): tmp=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Признак2," ","КД.*","");
         |True: tmp=ExtractWord(1,Признак2," "); --если ничего не помогло тогда по алфавиту
       fi;
    fi;
    Признак2=tmp;
 fi;
 Признак=Раб.Бюджет2005.Объединить(Признак,Признак2," ");
 ^Trim(Признак);
end;

Func АнализПодТаб(Iter:I; vOWA:I; vN:i; vFСчДеб:S; vFСчКре:S; vFПризнаки:S; vFПризнак:S; vСчДеб:S; vСчКре:S; vПризнаки:S; vПризнак:S):L;
var OA,nr,n,w,ww:I;
var Struct,СчДеб,СчКре,Признаки,Признак,tmp:S;
 if not vFСчДеб="": Struct=ExtractWord(1,vFСчДеб,"@");
   |not vFСчКре="": Struct=ExtractWord(1,vFСчКре,"@");
   |not vFПризнаки="": Struct=ExtractWord(1,vFПризнаки,"@");
   |not vFПризнак="": Struct=ExtractWord(1,vFПризнак,"@");
   |True: ^False;
 fi;
 OA=OpenArray(vOWA,vN,Struct,"");
  nr=Records(OA);
  for n=1..nr do
   if vСчДеб="" and not vFСчДеб="": СчДеб=GetFieldS(OA,n,ExtractWord(2,vFСчДеб,"@")); else СчДеб=vСчДеб; fi;
   if vСчКре="" and not vFСчКре="": СчКре=GetFieldS(OA,n,ExtractWord(2,vFСчКре,"@")); else СчКре=vСчКре; fi;
   if vПризнак="" and not vFПризнак="": Признак=GetFieldS(OA,n,ExtractWord(2,vFПризнак,"@")); else Признак=vПризнак; fi;
   Признаки=vПризнаки;
   ww=WordsCount(vFПризнаки," ");
   for w=1..ww do
    Признаки=Раб.Бюджет2005.Объединить(Признаки,GetFieldS(OA,n,ExtractWord(2,vFПризнак,"@"))," ");
   od;
   if not vFПризнак="":
      tmp=ДобавитьПризнак(Iter,СчДеб,СчКре,Признаки);
      if not tmp="":
         Признак=Раб.Бюджет2005.Объединить(Признак,tmp," ");
         n=PutFieldS(OA,n,ExtractWord(2,vFПризнак,"@"),Признак);
      fi;
   fi;
  od;
 CloseWorkArea(OA);
 ^True;
end;

Proc Анализ (Iter:I);
var OWA,n,nr,p,f,ff,w,ww:I;
var hint_,Ф,СчДеб,СчКре,Признаки,Признак,tmp:S;
 ППП=ПолучитьППП;
 МаскаСвязанСправ="";
 if Связанные:
    for n=1..УпрСправ do
     if not Справ[n]="": МаскаСвязанСправ=МаскаСвязанСправ+"|"+Справ[n]; fi;
    od;
    МаскаСвязанСправ=SubStr(МаскаСвязанСправ,2,255);
 fi;
 ff=СформПакетПолей(КартПолеСчДеб[Iter],КартПолеСчКре[Iter],КартПоляАн[Iter],КартПолеАн[Iter]);
 if Карт[Iter]="Table_Oper":
    Hint_="Анализ журнала "+Жур[Iter]+if(КартДопФ[Iter]="",""," ("+КартДопФ[Iter]+")")+"...";
    Ф=Раб.Бюджет2005.Объединить(КартДопФ[Iter],"Раздел="+RecordToString(ВзятьКлючРаздела(Жур[Iter]))," and ");
   else
    Hint_="Анализ картотеки "+Карт[Iter]+if(КартДопФ[Iter]="",""," ("+КартДопФ[Iter]+")")+"...";
    Ф=КартДопФ[Iter];
 fi;
 OWA=OpenWorkArea(Карт[Iter],"",Ф);
 Try
  nr=Records(OWA);
  BeginChanging(OWA);
  Try
   for n=1..nr do
    p=Int(n*100/nr);
    Hint(Hint_+Str(p)+"%");
    for f=1..ff do
     if FKey[f]="":
        if not FСчДеб[f]="": СчДеб=GetFieldS(OWA,n,FСчДеб[f]); else СчДеб=""; fi;
        if not FСчКре[f]="": СчКре=GetFieldS(OWA,n,FСчКре[f]); else СчКре=""; fi;
        if not FПризнак[f]="": Признак=GetFieldS(OWA,n,FПризнак[f]); else Признак=""; fi;
        Признаки="";
        ww=WordsCount(FПризнаки[f]," ");
        for w=1..ww do
         Признаки=Раб.Бюджет2005.Объединить(Признаки,GetFieldS(OWA,n,ExtractWord(w,FПризнаки[f]," "))," ");
        od;
        if not FПризнак[f]="":
           tmp=ДобавитьПризнак(Iter,СчДеб,СчКре,Признаки);
           if not tmp="":
              Признак=Раб.Бюджет2005.Объединить(Признак,tmp," ");
              n=PutFieldS(OWA,n,FПризнак[f],Признак);
           fi;
        fi;
       else
        АнализПодТаб(Iter,OWA,n,FСчДеб[f],FСчКре[f],FПризнаки[f],FПризнак[f],СчДеб,СчКре,Признаки,Признак);
     fi; --if FKey[f]="":
    od; --for f=1..ff do
   od; --for n=1..nr do
   EndChanging(OWA);
  Except
   CancelChanging(OWA);
   Raise;
  end;
 Finally
  CloseWorkArea(OWA);
 end;
end;

Func ВыбратьКартПоле(vКарт:S; isАн:L):S;
var n,nn,z,zz:i;
var tmp:S;
 ClearVariable(Buf);
 ClearVariable(Buf1);
 ClearVariable(Buf2);
 if not vКарт="TABLE_OPER":
    nn=GetCardFileFields(vКарт,Buf,mtlSUBTAB);
    for n=1..nn do
     zz=GetCardFileFields(vКарт+"@"+Buf[n],Buf1,mtlSTRING);
     InsertInArray(Buf2,1,Buf[n]+"@"+" --"+GetCardFileFieldComment(vКарт,Buf[n]));
     for z=1..zz do
      InsertInArray(Buf2,1,Buf[n]+"@"+Buf1[z]+" --"+GetCardFileFieldComment(vКарт+"@"+Buf[n],Buf1[z]));
     od;
    od;
    SortArray(Buf2);
    nn=GetCardFileFields(vКарт,Buf,mtlSTRING);
    for n=1..nn do
     Buf[n]=Buf[n]+" --"+GetCardFileFieldComment(vКарт,Buf[n]);
    od;
    CopyArray(Buf2,Buf,1,nn+1);
    z=0;
    tmp=ExtractWord(2,StoreField,":");
    if ExtractWord(1,StoreField,":")=vКарт and not tmp="":
       zz=LengthOfArray(Buf);
       for z=1..zz do
        if tmp=SubStr(Buf[z],1,Pos(" --",Buf[z])-1): Break; fi;
       od;
       if z>zz: z=0; fi;
    fi;
   else
    if not isАн:
       Buf[1]="DEBET --Счет дебета";
       Buf[2]="CREDIT --Счет кредита";
      else
       Buf[1]="АНАЛИТИКА --Аналитические признаки";
       Buf[2]="КОЛАНАЛИТИКА --Количественный аналитический признак";
    fi;
 fi;
 n=AlternateTree("Список полей",Buf,-1,z,0,"@","Картотека","Наименование",-1,False);
 if n=0: ^""; fi;
 tmp=SubStr(Buf[n],1,Pos(" --",Buf[n])-1);
 StoreField=vКарт+":"+tmp;
 ^tmp;
end;

Func ПроверитьДопФ (vКарт:S; vФ:S):L;
var OWA:I;
 OWA=OpenWorkArea(vКарт,"",vФ);
 Try
 Finally
  CloseWorkArea(OWA);
 end;
 ^True;
end;

Func Проверить:L;
var sub1,sub2,tmp:S;
var Iter,w,ww:I;
 УдалитьПустыеСтроки;
 for Iter=1..УпрСправ do
  if not Справ[Iter]="" and Призн000[Iter]="": Message("Введите признак",mtError); Template.Field="Призн000"; Template.Frame=Iter; ^False; fi;
  if not Призн000[Iter]="" and Name_A(Призн000[Iter])=" ": Message("Неизвестный признак "+Призн000[Iter],mtError); Template.Field="Призн000"; Template.Frame=Iter; ^False; fi;
 od;
 Try
  for Iter=1..УпрКарт do
   if Жур[Iter]="": Message("Выберите журнал",mtError); Template.Field="Жур"; Template.Frame=Iter; ^False; fi;
   if not Карт[Iter]="":
      if КартПолеСчДеб[Iter]="": Message("Выберите поле счета дебета",mtError); Template.Field="КартПолеСчДеб"; Template.Frame=Iter; ^False; fi;
      if КартПолеСчКре[Iter]="": Message("Выберите поле счета кредита",mtError); Template.Field="КартПолеСчКре"; Template.Frame=Iter; ^False; fi;
      if КартПоляАн[Iter]="": Message("Выберите поля аналитического учета",mtError); Template.Field="КартПоляАн_"; Template.Frame=Iter; ^False; fi;
      if КартПолеАн[Iter]="": Message("Выберите поле аналитического учета",mtError); Template.Field="КартПолеАн"; Template.Frame=Iter; ^False; fi;
      if Pos("@",КартПолеСчДеб[Iter])=0: sub1=""; else sub1=ExtractWord(1,КартПолеСчДеб[Iter],"@"); fi;
      ww=WordsCount(КартПолеАн[Iter]," ");
      for w=1..ww do
       tmp=ExtractWord(w,КартПолеАн[Iter]," ");
       if Pos("@",tmp)=0: sub2=""; else sub2=ExtractWord(1,tmp,"@"); fi;
       if not sub1="" and not sub2="" and not sub1=sub2: Message("Поле счета дебета и поля аналитического учета находятся в разных подтаблицах",mtError); Template.Field="КартПолеСчДеб"; Template.Frame=Iter; ^False; fi;
      od;
      if Pos("@",КартПолеСчКре[Iter])=0: sub1=""; else sub1=ExtractWord(1,КартПолеСчКре[Iter],"@"); fi;
      for w=1..ww do
       tmp=ExtractWord(w,КартПолеАн[Iter]," ");
       if Pos("@",tmp)=0: sub2=""; else sub2=ExtractWord(1,tmp,"@"); fi;
       if not sub1="" and not sub2="" and not sub1=sub2: Message("Поле счета дебета и поля аналитического учета находятся в разных подтаблицах",mtError); Template.Field="КартПолеСчДеб"; Template.Frame=Iter; ^False; fi;
      od;
   fi;
   if not ПроверитьДопФ(Карт[Iter],КартДопФ[Iter]): ^False; fi;
  od;
 Except
  Template.Field="КартДопФ";
  Template.Frame=Iter;
  Raise;
 end;
 SortSection(УпрСправ,3);
 Template.Object="btnВыпол";
 ^True;
end;

Proc Расчет;
var Iter:I;
 ShowProgress(УпрКарт,"Анализ аналитики....");
 Try
  for Iter=1..УпрКарт do
   ProgressPos(Iter);
   Анализ(Iter);
  od;
 Finally
  CloseProgress;
 end;
 Message("Операция завершена");
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func A1_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(УпрСправ,Iter+1);
 Return False;
end;

Func D1_OnEnter(FieldName: String; Iter: Integer): logical;
 DeleteFrame(УпрСправ,Iter);
 if УпрСправ<1: InsertFrame(УпрСправ,1); fi;
 Return False;
end;

Func Справ_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("*",True);
 if tmp="": ^False; fi;
 Справ[Iter]=tmp+".*";
 НаимСправ[Iter]=Name_A(tmp+".");
 if tmp="ФКР": Призн000[Iter]=tmp+"."+ПолучитьППП+".0000.0000000.000";
   |tmp="КД": Призн000[Iter]=tmp+"."+ПолучитьППП+".0.00.00000.00.0000";
   |tmp="КИФД": Призн000[Iter]=tmp+"."+ПолучитьППП+".00.00.00.00.00.0000";
   |True: Призн000[Iter]=tmp+".000";
 fi;
 НаимПризн000[Iter]=Name_A(Призн000[Iter]);
 if НаимПризн000[Iter]=" ": Призн000[Iter]=""; fi;
 Return False;
end;

Proc Справ_OnExit(FieldName: String; Iter: Integer);
 НаимСправ[Iter]="";
 Призн000[Iter]="";
 НаимПризн000[Iter]="";
end;

Func Призн000_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Справ[Iter]="": Message("Выберите справочник",mtError); Template.Field="Справ"; Template.Frame=Iter; ^False; fi;
 tmp=AnaElection(Справ[Iter]);
 if tmp="": ^False; fi;
 Призн000[Iter]=tmp;
 НаимПризн000[Iter]=Name_A(Призн000[Iter]);
 Return False;
end;

Proc Призн000_OnExit(FieldName: String; Iter: Integer);
 НаимПризн000[Iter]="";
end;

Func ИС_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("*",True);
 if tmp="": ^False; fi;
 tmp=tmp+".*";
 for Iter=1..УпрКарт do
  if not Жур[Iter]="":
     ИсклСправ[Iter]=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(ИсклСправ[Iter],"|",tmp,tmp,"");
  fi;
 od;
 Return False;
end;

Proc ИС_OnExit(FieldName: String; Iter: Integer);
var w,ww:i;
 ClearVariable(Buf);
 for Iter=1..УпрКарт do
  ww=WordsCount(ИсклСправ[Iter],"|");
  for w=1..ww do
   AddInArray(Buf,True,False,ExtractWord(w,ИсклСправ[Iter],"|"));
  od;
 od;
 InsertInArray(Buf,1,"Удалить все");
 w=Alternate("Удалить",buf,-1,1,12);
 if w=0: Exit; fi;
 for Iter=1..УпрКарт do
  if w=1: ИсклСправ[Iter]=""; else ИсклСправ[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(ИсклСправ[Iter],"|",Buf[w],""); fi;
 od;
end;

Func A2_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(УпрКарт,Iter+1);
 Return False;
end;

Func D2_OnEnter(FieldName: String; Iter: Integer): logical;
 DeleteFrame(УпрКарт,Iter);
 if УпрКарт<1: InsertFrame(УпрКарт,1); fi;
 Return False;
end;

Func Жур_OnEnter(FieldName: String; Iter: Integer): logical;
var j,jj,n:i;
var tmp,ТипЖур,СчДеб,СчКре,Признаки,Признак:S;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 jj=JournalsCount;
 for j=0..jj do
  tmp=JournalName(j);
  ТипЖур=JournalType(tmp);
  if ТипЖур="КАРТ": tmp=JournalCardfile(tmp); fi;
  if SearchInArray(Buf,tmp)=-1 and not tmp="":
     InsertInArray(Buf,LengthOfArray(Buf)+1,tmp);
     InsertInArray(Buf2,LengthOfArray(Buf2)+1,ТипЖур);
  fi;
 od;
 jj=LengthOfArray(Buf2);
 for j=1..jj do
  if Buf2[j]="РАЗД": Buf[j]=Buf[j]+" --Раздел табличного журнала";
    |Buf2[j]="КАРТ": Buf[j]=Buf[j]+" --Журнал картотека";
    |Buf2[j]="ТЕКСТ": Buf[j]=Buf[j]+" --Текстовый журнал";
    |True: tmp=" --";
  fi;
 od;
 if jj=0: Message("В данном плане бухгалтерии не описан ни один журнал");  ^False; fi;
 j=Alternate("Список журналов",Buf,-1,SearchInArray(Buf,StoreJur),12);
 if j=0: ^False; fi;
 Жур[Iter]=SubStr(Buf[j],1,Pos(" --",Buf[j])-1);
 StoreJur=Buf[j];
 Раб.ИмяПолеКарт.Инициализация;
 if Buf2[j]="РАЗД": 
    Карт[Iter]="TABLE_OPER"; 
    КартНаим[Iter]="Раздел табличного журнала"; 
    КартПолеСчДеб[Iter]="DEBET"; 
    КартПолеСчКре[Iter]="CREDIT";
    КартПоляАн[Iter]="АНАЛИТИКА КОЛАНАЛИТИКА";
    КартПолеАн[Iter]="АНАЛИТИКА";
   |Buf2[j]="КАРТ" :
    Карт[Iter]=Жур[Iter]; 
    n=GetCardFileNames(Карт[Iter],Buf2,False,True,"");
    КартНаим[Iter]=SubStr(Buf2[j],Pos(" --",Buf2[j])+4,255);
    СчДеб=Раб.ИмяПолеКарт.ИмяПоля(Карт[Iter],"СчДеб");
    СчКре=Раб.ИмяПолеКарт.ИмяПоля(Карт[Iter],"СчКре");
    Признаки=Раб.ИмяПолеКарт.ИмяПоля(Карт[Iter],"Признаки");
    Признак=Раб.ИмяПолеКарт.ИмяПоля(Карт[Iter],"Признак");
    n=SearchInArray(Карт,Карт[Iter]);
    if n=-1 or (n=Iter and SearchInArray(Карт,Карт[Iter],False,Iter+1)=-1):
       jj=WordsCount(СчДеб,"|");
       for j=1..jj do
        if j>1: 
           Iter=Iter+1; 
           InsertFrame(УпрКарт,Iter); 
           Карт[Iter]=Карт[Iter-1];
           Жур[Iter]=Жур[Iter-1];
           КартНаим[Iter]=КартНаим[Iter-1];
        fi;
        КартПолеСчДеб[Iter]=ExtractWord(j,СчДеб,"|");
        КартПолеСчКре[Iter]=ExtractWord(j,СчКре,"|");
        КартПоляАн[Iter]=ExtractWord(j,Признаки,"|");
        КартПолеАн[Iter]=ExtractWord(j,Признак,"|");
       od;
    fi;
   |Buf2[j]="ТЕКСТ": 
    Карт[Iter]=""; 
    КартНаим[Iter]="Текстовый журнал";
    КартПолеСчДеб[Iter]="*";
    КартПолеСчКре[Iter]="*";
   |True: 
    Карт[Iter]=""; 
    КартНаим[Iter]="";
    КартПолеСчДеб[Iter]="";
    КартПолеСчКре[Iter]="";
 fi;
 КартДопФ[Iter]="";
 Return False;
end;

Proc Жур_OnExit(FieldName: String; Iter: Integer);
 Карт[Iter]="";
 КартНаим[Iter]="";
end;

Func КартПолеСчДеб_onEnter(FieldName: String; Iter: Integer): logical;
var tmp,sub1,sub2:S;
 if Жур[Iter]="": Message("Выберите журнал",mtError); Template.Field="Жур"; Template.Frame=Iter; ^False; fi;
 if Карт[Iter]="": ^False; fi;
 tmp=ВыбратьКартПоле(Карт[Iter],False);
 if tmp="": ^False; fi;
 if КартПолеСчКре[Iter]=tmp: Message("Поле введено уже как счет кредита",mtError); Template.Field="КартПолеСчКре"; Template.Frame=Iter; ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(КартПоляАн[Iter]," ",tmp,"",""): Message("Поле "+tmp+" было выбрано ранее как поле аналитического учета",mtError); Template.Field="КартПоляАн_"; Template.Frame=Iter; ^False; fi;
 if not КартПолеСчКре[Iter]="":
    if Pos("@",tmp)=0: sub1=""; else sub1=ExtractWord(1,tmp,"@"); fi;
    if Pos("@",КартПолеСчКре[Iter])=0: sub2=""; else sub2=ExtractWord(1,КартПолеСчКре[Iter],"@"); fi;
    if not sub1="" and not sub2="" and not sub1=sub2: Message("Указаны поля в разных подтаблицах",mtError); ^False; fi;
 fi;
 КартПолеСчДеб[Iter]=tmp;
 Return False;
end;

Func КартПолеСчКре_onEnter(FieldName: String; Iter: Integer): logical;
var tmp,sub1,sub2:S;
 if Жур[Iter]="": Message("Выберите журнал",mtError); Template.Field="Жур"; Template.Frame=Iter; ^False; fi;
 if Карт[Iter]="": ^False; fi;
 tmp=ВыбратьКартПоле(Карт[Iter],False);
 if tmp="": ^False; fi;
 if КартПолеСчДеб[Iter]=tmp: Message("Поле введено уже как счет дебета",mtError); Template.Field="КартПолеСчДеб"; Template.Frame=Iter; ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(КартПоляАн[Iter]," ",tmp,"",""): Message("Поле "+tmp+" было выбрано ранее как поле аналитического учета",mtError); Template.Field="КартПоляАн_"; Template.Frame=Iter; ^False; fi;
 if not КартПолеСчДеб[Iter]="":
    if Pos("@",tmp)=0: sub1=""; else sub1=ExtractWord(1,tmp,"@"); fi;
    if Pos("@",КартПолеСчДеб[Iter])=0: sub2=""; else sub2=ExtractWord(1,КартПолеСчДеб[Iter],"@"); fi;
    if not sub1="" and not sub2="" and not sub1=sub2: Message("Указаны поля в разных подтаблицах",mtError); ^False; fi;
 fi;
 КартПолеСчКре[Iter]=tmp;
 Return False;
end;

Func КартПоляАн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,sub1,sub2,tmp2:S;
var w,ww:i;
 if Жур[Iter]="": Message("Выберите журнал",mtError); Template.Field="Жур"; Template.Frame=Iter; ^False; fi;
 if Карт[Iter]="": ^False; fi;
 tmp=ВыбратьКартПоле(Карт[Iter],True);
 if tmp="": ^False; fi;
 if Length(КартПолеАн[Iter])+Length(tmp)+1>255: Message("Слишком длинная строка. Обратитесь к разработчику",mtError); ^False; fi;
 if Раб.Бюджет2005.ПроверитьНаборСлов(КартПоляАн[Iter]," ",tmp,"",""): Message("Повторный ввод поля "+tmp,mtError); ^False;
   |Раб.Бюджет2005.ПроверитьНаборСлов(КартПолеСчДеб[Iter]," ",tmp,"",""): Message("Поле "+tmp+" было выбрано ранее как поле синтетического учета",mtError); Template.Field="КартПолеСчДеб"; Template.Frame=Iter; ^False;
   |Раб.Бюджет2005.ПроверитьНаборСлов(КартПолеСчКре[Iter]," ",tmp,"",""): Message("Поле "+tmp+" было выбрано ранее как поле синтетического учета",mtError); Template.Field="КартПолеСчКре"; Template.Frame=Iter; ^False;
 fi;
 if not КартПоляАн[Iter]="":
    if Pos("@",tmp)=0: sub1=""; else sub1=ExtractWord(1,tmp,"@"); fi;
    ww=WordsCount(КартПоляАн[Iter]," ");
    for w=1..ww do
     tmp2=ExtractWord(w,КартПоляАн[Iter]," ");
     if Pos("@",tmp2)=0: sub2=""; else sub2=ExtractWord(1,tmp2,"@"); fi;
     if not sub1="" and not sub2="" and not sub1=sub2: Message("Указаны поля в разных подтаблицах",mtError); ^False; fi;
    od;
 fi;
 КартПоляАн[Iter]=Раб.Бюджет2005.Объединить(КартПоляАн[Iter],tmp," ");
 Return False;
end;

Proc КартПоляАн_OnExit(FieldName: String; Iter: Integer);
 КартПоляАн[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(КартПоляАн[Iter]," ");
 if not Раб.Бюджет2005.ПроверитьНаборСлов(КартПоляАн[Iter]," ",КартПолеАн[Iter],"",""): КартПолеАн[Iter]=""; fi;
end;

Func КартПолеАн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
var w,ww:i;
 if КартПоляАн[Iter]="": Message("Выберите поля аналитического учета",mtError); Template.Field="КартПоляАн_"; Template.Frame=Iter; ^False; fi;
 ClearVariable(Buf);
 ww=WordsCount(КартПоляАн[Iter]," ");
 for w=1..ww do
  Buf[w]=ExtractWord(w,КартПоляАн[Iter]," ");
 od;
 w=Alternate("Выберите поле аналитического учета",Buf,-1,SearchInArray(Buf,КартПолеАн[Iter]),12);
 if w=0: ^False; fi;
 КартПолеАн[Iter]=Buf[w];
 Return False;
end;

Func ИсклСправ_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("*",True);
 if tmp="": ^False; fi;
 tmp=tmp+".*";
 ИсклСправ[Iter]=Раб.Бюджет2005.ДобавитьСловоВНаборСЗаменой(ИсклСправ[Iter],"|",tmp,tmp,"");
 Return False;
end;

Proc ИсклСправ_OnExit(FieldName: String; Iter: Integer);
 ИсклСправ[Iter]=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог(ИсклСправ[Iter],"|");
end;

Func КартДопФ_OnEnter(FieldName: String; Iter: Integer): logical;
 if Жур[Iter]="": Message("Выберите журнал",mtError); Template.Field="Жур"; Template.Frame=Iter; ^False; fi;
 if Карт[Iter]="": ^False; fi;
 Return True;
end;

Func КартДопФ_OnVerify(FieldName: String; Iter: Integer; Value: S):L;
 Return ПроверитьДопФ (Карт[Iter],Value);
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnЗагрузить_OnClick(Sender: String);
var j,jj,n,w,ww:i;
var tmp,ТипЖур,СчДеб,СчКре,Признаки,Признак:S;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 jj=JournalsCount;
 for j=0..jj do
  tmp=JournalName(j);
  ТипЖур=JournalType(tmp);
  if ТипЖур="КАРТ": tmp=JournalCardfile(tmp); fi;
  if SearchInArray(Buf,tmp)=-1 and not tmp="":
     InsertInArray(Buf,LengthOfArray(Buf)+1,tmp);
     InsertInArray(Buf2,LengthOfArray(Buf2)+1,ТипЖур);
  fi;
 od;
 jj=LengthOfArray(Buf2);
 for j=1..jj do
  if Buf2[j]="РАЗД": Buf[j]=Buf[j]+" --Раздел табличного журнала";
    |Buf2[j]="КАРТ": Buf[j]=Buf[j]+" --Журнал картотека";
    |Buf2[j]="ТЕКСТ": Buf[j]=Buf[j]+" --Текстовый журнал";
    |True: tmp=" --";
  fi;
 od;
 if jj=0: Message("В данном плане бухгалтерии не описан ни один журнал");  Exit; fi;
 if EnqOkCancel("Текукщий список будет очищен, продолжить?",mtWarning)=cmCancel: Exit; fi;
 Очистить;
 Раб.ИмяПолеКарт.Инициализация;
 for j=1..jj do
  InsertFrame(УпрКарт,УпрКарт+1);
  Жур[УпрКарт]=SubStr(Buf[j],1,Pos(" --",Buf[j])-1);
  if Buf2[j]="РАЗД":
     Карт[УпрКарт]="TABLE_OPER";
     КартНаим[УпрКарт]="Раздел табличного журнала";
     КартПолеСчДеб[УпрКарт]="DEBET";
     КартПолеСчКре[УпрКарт]="CREDIT";
     КартПоляАн[УпрКарт]="АНАЛИТИКА КОЛАНАЛИТИКА";
     КартПолеАн[УпрКарт]="АНАЛИТИКА";
    |Buf2[j]="КАРТ" :
     Карт[УпрКарт]=Жур[УпрКарт];
     n=GetCardFileNames(Карт[УпрКарт],Buf1,False,True,"");
     КартНаим[УпрКарт]=SubStr(Buf1[n],Pos(" --",Buf1[n])+4,255);
     СчДеб=Раб.ИмяПолеКарт.ИмяПоля(Карт[УпрКарт],"СчДеб");
     СчКре=Раб.ИмяПолеКарт.ИмяПоля(Карт[УпрКарт],"СчКре");
     Признаки=Раб.ИмяПолеКарт.ИмяПоля(Карт[УпрКарт],"Признаки");
     Признак=Раб.ИмяПолеКарт.ИмяПоля(Карт[УпрКарт],"Признак");
     ww=WordsCount(СчДеб,"|");
     for w=1..ww do
      if w>1:
         InsertFrame(УпрКарт,УпрКарт+1);
         Карт[УпрКарт]=Карт[УпрКарт-1];
         Жур[УпрКарт]=Жур[УпрКарт-1];
         КартНаим[УпрКарт]=КартНаим[УпрКарт-1];
      fi;
      КартПолеСчДеб[УпрКарт]=ExtractWord(w,СчДеб,"|");
      КартПолеСчКре[УпрКарт]=ExtractWord(w,СчКре,"|");
      КартПоляАн[УпрКарт]=ExtractWord(w,Признаки,"|");
      КартПолеАн[УпрКарт]=ExtractWord(w,Признак,"|");
     od;
    |Buf2[j]="ТЕКСТ":
     Карт[УпрКарт]="";
     КартНаим[УпрКарт]="Текстовый журнал";
     КартПолеСчДеб[УпрКарт]="*";
     КартПолеСчКре[УпрКарт]="*";
    |True:
     Карт[УпрКарт]="";
     КартНаим[УпрКарт]="";
     КартПолеСчДеб[УпрКарт]="";
     КартПолеСчКре[УпрКарт]="";
  fi;
 od;
end;

Proc btnВыпол_OnClick(Sender: String);
 if not Проверить: Exit; fi;
 Расчет;
end;

Proc btnОчистить_OnClick(Sender: String);
 if EnqOkCancel("Таблица журналов будет очищена, продолжить ?",mtWarning)=cmCancel: Exit; fi;
 Очистить;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 Message("Внимание!^MИспользование функций данного бланка МОЖЕТ привести к потере данных^MПеред использованием данного бланка НЕОБХОДИМО создать резервную копию базы данных и табличных журналов",mtWarning);
end;
--Обработчики событий шаблона -----
--

Func ДопАнаУсл_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if Pos("(",Value)>0:
    Message("Допустимо только перечисление масок через '|'"); ^False;
 fi;
 if Pos(")",Value)>0:
    Message("Допустимо только перечисление масок через '|'"); ^False;
 fi;
 if Pos("&",Value)>0:
    Message("Допустимо только перечисление масок через '|'"); ^False;
 fi;
 if Pos("\",Value)>0:
    Message("Допустимо только перечисление масок через '|'"); ^False;
 fi;
 if Pos("~",Value)>0:
    Message("Допустимо только перечисление масок через '|'"); ^False;
 fi;
 if Pos("+",Value)>0:
    Message("Допустимо только перечисление масок через '|'"); ^False;
 fi;
 if Pos("-",Value)>0:
    Message("Допустимо только перечисление масок через '|'"); ^False;
 fi;
  Return true ;
end;


Конец
