-- Шаблон создан супер-марио бланков
-- 27.03.2008 17:44:42

-- сделать игнорирование ссылок на ссылки :) то есть, если стоит галка "Удалять картотеки по ссылкам",										  _____
-- то надо добавлять игнорируемые ссылки на ссылку, т.е. строить дерево.													 |о _л. о|
-- для этого надо добавить 1 колонку в секцию "Игнорировать ссылки" ("Картотека на кого"),											 |л|_|л|
-- а колонку "Картотека" переименовать в "Картотека откуда".															 |_о л о.|
-- ололо!

-- удалить нецензурные выражения из комментариев.

БланкСШаблоном "Ыыы!";

var sTmpMas[]: S;
var sTmpMas2[]: S;

Var iAddType: I;

var sDelRefCrd[]: S;

var Карт: S;
var КартНаим: S;
var ПолеПризн[]: S;
var ПолеПризнНаим[]: S;
var КартДопФ: S;

var Упр: I;
var Упр2: I;
var Упр3: I;
var Упр4: I;
var Упр5: I;

var A: S = "+";
var D: S = "-";
var A1: S = "+";
var D1: S = "-";
var A2: S = "+";
var D2: S = "-";
var A3: S = "+";
var D3: S = "-";
var AA: S = "+";
var DD: S = "-";

Var refКартНаКого[]: S;
var refКарт[]: S;
var refКартНаим[]: S;
var refПоле[]: S;
var refПолеНаим[]: S;
Var refПолеПризн[]: S;
var refКартР[]: S;		-- поле-ссылка на картотеку-родителя
var refКартНаимР[]: S;		-- картотека-родитель
Var refКартР2[]: S;		-- картотека-родитель в признаках
Var refКартРПризн[]: S; 	-- признак в картотеке-родителе
Var refКартРПризнИмя[]: S;	-- имя поля-признака в картотеке-родителе
Var refКартР3[]: S;		-- картотека-родитель в ссылках
Var refКартРСсылка[]: S;	-- картотека со ссылкой на родителя
var refКартРСсылкаИмя[]: S;	-- имя картотеки со ссылкой на родителя
Var refКартРСсылкаПоле[]: S;	-- поле картотеки со ссылкой на родителя
Var refКартРСсылкаПолеИмя[]: S; -- имя поля картотеки со ссылкой на родителя

var Buf[]: S;
var Buf2[]: S;
var Excl[]: S;
var BufParent[]: S;
var Buf2Parent[]: S;
var ExclParent[]: S;

var StoreCard: S;
var hField: S;
var NameField: S;
var sFieldType: S;

var Key[]: S;
var BufRefCard[]: S;
var BufRefField[]: S;
var BufRefOWA[]: I;
var BufRefMode[]: I;
var KeyParent[]: S;
var BufRefCardParent[]: S;
var BufRefFieldParent[]: S;
var BufRefOWAParent[]: I;
var BufRefModeParent[]: I;

var iNumDel: I; -- кол-во удаленных записей
var iNumDel2: I; -- кол-во удаленных записей

Var bRecursion: Logical;
Var bRecursion2: Logical;

--
--Процедуры и функции -------------
Proc Очистить;
  ClearVariable(ПолеПризн);
  ClearVariable(Упр);
  ClearVariable(Упр2);
  ClearVariable(Упр3);
  ClearVariable(Упр4);
  ClearVariable(refКартНаКого);
  ClearVariable(refКарт);
  ClearVariable(refКартНаим);
  ClearVariable(refПоле);
  ClearVariable(refПолеНаим);
  ClearVariable(refКартР);
  ClearVariable(refКартНаимР);
  ClearVariable(refКартР2);
  ClearVariable(refКартРПризн);
  ClearVariable(refКартРПризнИмя);
end;

Func ВыбратьКарт(vRef:S): S;
var n, nn: i;
var tmp: S;
  ClearVariable(Buf);
  nn = GetCardFileNames("*", Buf, False, True, vRef);
  if nn = 0
  :
     Message("Список картотек пуст");
     Return "";
  fi;
  for n = 1 to nn
  do
    if StoreCard = SubStr(Buf[n], 1, Pos(" --", Buf[n]) - 1)
    :
       Break;
    fi;
  od;
  if n > nn
  :
     n = 0;
  fi;
  n = Alternate("Список картотек", Buf, -1, n, 12);
  if n = 0
  :
     Return "";
  fi;
  tmp = SubStr(Buf[n], 1, Pos(" --", Buf[n]) - 1);
  StoreCard = tmp;
  Return Buf[n];
end;

Func ТипКартПоле(vКарт: S; vПоле: S): S;
var Ret: S;
var Тип: I;
  Тип = GetCardFileFieldType(vКарт, vПоле);
  if Тип = mtlREAL
  :
     Ret = "REAL";
  |  Тип = mtlINTEGER
  :
     Ret = "INTEGER";
  |  Тип = mtlBOOLEAN
  :
     Ret = "BOOLEAN";
  |  Тип = mtlSTRING
  : 
    Ret = "STRING";
  |  Тип = mtlDATE
  :
     Ret="DATE";
  |  Тип = mtlSUBTAB
  :
     Ret="SUBTAB";
  |  Тип = mtlREF
  :
     Ret = GetCardFileByRefField(vКарт, vПоле);
  |  Тип = mtlTimed
  :
     Ret = "TIMED";
  |True
  :
     Ret = "";
  fi;
  Return Ret;
end;

Func ВыбратьКартПоле(vКарт: S; vТипПоля: I; vRef: S): S;
var n, nn, z, zz: I;
var tmp, tmp2: S;
  ClearVariable(Buf);
  nn = GetCardFileFields(vКарт, Buf, vТипПоля);
  n = 1;
  While not Buf[n] = ""
  do
    if GetCardFileFieldType(vКарт, Buf[n]) = mtlSUBTAB
    :
       DeleteFromArray(Buf,n);
    else
       tmp2 = ТипКартПоле(vКарт, Buf[n]);
       if not vТипПоля = mtlRef or vRef = ""
       :
	  Buf[n] = Buf[n] + "  :" + tmp2 + " --" + GetCardFileFieldComment(vКарт, Buf[n]);
	  n = n + 1;
       else
	  if tmp2 = vRef
	  :
	     Buf[n] = Buf[n] + "  :" + tmp2 + " --" + GetCardFileFieldComment(vКарт,Buf[n]);
	     n = n + 1;
	  else
	     DeleteFromArray(Buf, n);
	  fi;
       fi;
    fi;
  od;
  nn = LengthOfArray(Buf);
  z = 0;
  tmp = ExtractWord(2, hField, ":");
  if ExtractWord(1, hField, ":") = vКарт and not tmp = ""
  :
     zz = LengthOfArray(Buf);
     for z = 1 to zz
     do
       tmp2 = SubStr(Buf[z], 1, Pos(" --", Buf[z]) - 1);
       tmp2 = SubStr(tmp2, 1, Pos("  :", tmp2) - 1);
       if tmp = tmp2
       :
	  Break;
       fi;
     od;
     if z > zz
     :
	z = 0;
     fi;
  fi;
  n = AlternateTree("Список полей картотеки " + vКарт, Buf, -1, z, 12, "@", "Картотека", "Наименование", -1, False);
  if n = 0
  :
     Return "";
  fi;
  tmp = SubStr(Buf[n], 1, Pos(" --", Buf[n]) - 1);
  NameField = SubStr(Buf[n], Pos(" --", Buf[n]) + 3, 255);
  sFieldType = SubStr(tmp, Pos("  :", tmp) + 3, length(tmp) - Pos("  :", tmp) - 2);
  tmp = SubStr(tmp, 1, Pos("  :", tmp) - 1);
  hField = vКарт + ":" + tmp;
  Return tmp;
end;

Func СписокСцылочныхПолей(vКарт: S; vRef: S): I;
var n, nn: I;
  ClearVariable(Buf2);
  nn = GetCardFileFields(vКарт, Buf2, mtlRef);
  n = 1;
  While not Buf2[n] = ""
  do
    if ТипКартПоле(vКарт, Buf2[n]) = vRef
    :
       n = n + 1;
    else
       DeleteFromArray(Buf2, n);
    fi;
  od;
  Return LengthOfArray(Buf2);
end;

Func СписокСцылочныхПолейParent(vКарт: S; vRef: S): I;
var n, nn: I;
  ClearVariable(Buf2Parent);
  nn = GetCardFileFields(vКарт, Buf2Parent, mtlRef);
  n = 1;
  While not Buf2Parent[n] = ""
  do
    if ТипКартПоле(vКарт, Buf2Parent[n]) = vRef
    :
       n = n + 1;
    else
       DeleteFromArray(Buf2Parent, n);
    fi;
  od;
  Return LengthOfArray(Buf2Parent);
end;

Func Проверить: L;
var Iter, i: I;
  if Карт = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "Карт";
     Return False;
  fi;
  i = 1; -- признаки основной картотеки
  while i <= Упр3
  do
    if ПолеПризн[i] = ""
    :
       DeleteFrame(Упр3, i);
    else
       i = i + 1;
    fi;
  od;
  Iter = 1; -- ссылки на основную картотеку
  While Iter <= Упр
  do
    if refКарт[Iter] = "" and refПоле[Iter] = ""
    :
       DeleteFrame(Упр, Iter);
    else
       if refКарт[Iter] = ""
       :
	  Message("Укажите картотеку", mtError);
	  Template.Field = "refКарт";
	  Template.Frame = 1;
	  Return False;
       fi;
       if refПоле[Iter] = ""
       :
	  Message("Укажите поле", mtError);
	  Template.Field = "refПоле";
	  Template.Frame = 1;
	  Return False;
       fi;
       Iter = Iter + 1;
    fi;
  od;
  i = 1; -- картотеки-родители
  while i<= Упр2
  do
    if refКартНаимР[i] = "" or refКартР[i] = ""
    :
       DeleteFrame(Упр2, i);
    else
       i = i + 1;
    fi;
  od;
  i = 1; -- признаки картотек-родителей
  while i <= Упр4
  do
    if refКартР2[i] = "" and refКартРПризн[i] = ""
    :
       DeleteFrame(Упр4, i);
    else
       if refКартР2[i] = ""
       :
	  Message("Укажите картотеку", mtError);
	  Template.Field = "refКартР2";
	  Template.Frame = 1;
	  Return False;
       fi;
       if refКартРПризн[i] = ""
       :
	  Message("Укажите признак", mtError);
	  Template.Field = "refКартРПризн";
	  Template.Frame = 1;
	  Return False;
       fi;
       i = i + 1;
    fi;
  od;
  i = 1; -- ссылки на картотеки-родители
  while i<= Упр5
  do
    if refКартР3[i] = "" and refКартРСсылка[i] = "" and refКартРСсылкаПоле[i] = ""
    :
       DeleteFrame(Упр5, i);
    else
       if refКартР3[i] = ""
       :
	  Message("Укажите картотеку-родителя", mtError);
	  Template.Field = "refКартР3";
	  Template.Frame = 1;
	  Return False;
       fi;
       if refКартРСсылка[i] = ""
       :
	  Message("Укажите картотеку со ссылкой", mtError);
	  Template.Field = "refКартРСсылка";
	  Template.Frame = 1;
	  Return False;
       fi;
       if refКартРСсылкаПоле[i] = ""
       :
	  Message("Укажите поле", mtError);
	  Template.Field = "refКартРСсылкаПоле";
	  Template.Frame = 1;
	  Return False;
       fi;
       i = i + 1;
    fi;
  od;
  Return True;
end;

Func funcSignUsed(sCrd: S; sFld: S; Rec: Record; Voc: S): S;
  Return Раб.Бюджет2005.КартПризнакИспользуется(sCrd, sFld, Rec, Voc);
End;

Func ПризнакИспользуется(Rec: Record; Voc: S): S;
var tmp: S;
Var i: I;
  for i = 1 to Упр3
  do
    if length(ПолеПризн[i]) > 0
    :
       tmp = funcSignUsed(Карт, ПолеПризн[i], Rec, Voc);
       if not tmp = ""
       :
	  Return tmp;
       fi;
    fi;
  od;
  Return "";
end;

Func ПризнакИспользуетсяParent(Rec: Record; Voc: S; sCardName: S): S;
var tmp: S;
Var i: I;
  for i = 1 to Упр4
  do
    if refКартР2[i] = sCardName and length(refКартРПризн[i]) > 0
    :
       tmp = Раб.Бюджет2005.КартПризнакИспользуется(sCardName, refКартРПризн[i], Rec, Voc);
       if not tmp = ""
       :
	  Return tmp;
       fi;
    fi;
  od;
  Return "";
end;

Func ЕстьСцылка(Rec: Record): L;
var n, nn, iLen: I;
  nn = LengthOfArray(BufRefCard);
  for n = 1 to nn
  do
    if BufRefMode[n] = 0
    :
       BufRefOWA[n] = OpenWorkArea(BufRefCard[n], "", BufRefField[n] + " = " + RecordToString(Rec));
       iLen = Records(BufRefOWA[n]);
       CloseWorkArea(BufRefOWA[n]);
       BufRefOWA[n] = 0;
       if iLen > 0
       :
	  Return True;
       fi;
    fi;
  od;
  Return False;
end;

Func ЕстьСцылкаParent(Rec: Record): L;
var n, nn, iLen: I;
  nn = LengthOfArray(BufRefCardParent);
  for n = 1 to nn
  do
    if BufRefModeParent[n] = 0
    :
       BufRefOWAParent[n] = OpenWorkArea(BufRefCardParent[n], "", BufRefFieldParent[n] + " = " + RecordToString(Rec));
       iLen = Records(BufRefOWAParent[n]);
       CloseWorkArea(BufRefOWAParent[n]);
       BufRefOWAParent[n] = 0;
       if iLen > 0
       :
	  Return True;
       fi;
    fi;
  od;
  Return False;
end;

Proc procCheckChildren(iPos: I; rRec: Record);
Var iOwa, i, j, k, iOwaLen, iTmp: I;
Var sTmp, sTmp2, sCrd, sFld, sPrizList, sDo: S;
Var bFlag, bResult, bTmp, bTmp2: Logical;
  bResult = false;
  bTmp2 = true;
  sCrd = refКарт[iPos];
  sFld = refПоле[iPos];
  sPrizList = refПолеПризн[iPos];
  sDo = sDelRefCrd[iPos];
  iOwa = OpenWorkArea(sCrd, "", sFld + " = " + RecordToString(rRec));
  Try
    iOwaLen = Records(iOwa);
    --hint(str(iOwaLen));
    if iOwaLen > 0 and sDo = "Проверять"
    :
       bResult = false;
    else
       bResult = true;
    fi;
    if bResult and iOwaLen > 0
    :
       i = 1;
       while i <= iOwaLen and bResult
       do
	 if length(sPrizList) > 0
	 :
	    k = 1;
	    iTmp = WordsCount(sPrizList, " ");
	    while bResult and k <= iTmp
	    do
	      if funcSignUsed(sCrd, trim(ExtractWord(k, sPrizList, " ")), GetRecordKey(iowa, i), "*") <> ""
	      :
		 bResult = false;
	      fi;
	      k = k + 1;
	    od;
	 fi;
	 if bTmp2
	 :
	    bTmp2 = false;
	    for j = 1 to Упр
	    do
	      sTmp = ExtractWord(WordsCount(refКартНаКого[j], "."), refКартНаКого[j], ".");
	      if sCrd = sTmp and bResult
	      :
		 procCheckChildren(j, GetRecordKey(iowa, i));
		 bTmp = bRecursion2;
		 bResult = bResult and bTmp;
		 bTmp2 = true;
	      fi;
	    od;
	 fi;
	 i = i + 1;
       od;
    fi;
  Finally
    CloseWorkArea(iowa);
  End;
  bRecursion2 = bResult;
End;

Proc procKillChildren(iPos: I; rRec: Record);
Var iOwa, i, j, k, iOwaLen, iTmp: I;
Var sTmp, sTmp2, sCrd, sFld, sPrizList, sDo: S;
Var bFlag, bResult, bTmp, bTmp2: Logical;
  bResult = true;
  sCrd = refКарт[iPos];
  sFld = refПоле[iPos];
  sPrizList = refПолеПризн[iPos];
  sDo = sDelRefCrd[iPos];
  iOwa = OpenWorkArea(sCrd, "", sFld + " = " + RecordToString(rRec));
  Try
    if sDo = "Удалять"
    :
       iOwaLen = Records(iOwa);
       --hint(str(iOwaLen));
       i = 1;
       BeginChanging(iOwa, True);
       Try
	 while i <= iOwaLen
	 do
	   bFlag = true;
	   if length(sPrizList) > 0
	   :
	      k = 1;
	      iTmp = WordsCount(sPrizList, " ");
	      while bFlag and k <= iTmp
	      do
		if funcSignUsed(sCrd, trim(ExtractWord(k, sPrizList, " ")), GetRecordKey(iowa, i), "*") <> ""
		:
		   bFlag = false;
		fi;
		k = k + 1;
	      od;
	   fi;
	   if bFlag
	   :
	      bTmp2 = true;
	      if bTmp2
	      :
		 for j = 1 to Упр
		 do
		   bTmp2 = false;
		   sTmp = ExtractWord(WordsCount(refКартНаКого[j], "."), refКартНаКого[j], ".");
		   if sCrd = sTmp and bResult
		   :
		      procKillChildren(j, GetRecordKey(iowa, i));
		      bTmp = bRecursion;
		      bResult = bResult and bTmp;
		      bTmp2 = true;
		   fi;
		 od;
	      fi;
	      if bResult
	      :
		 DeleteRecord(iOwa, i);
		 iNumDel2 = iNumDel2 + 1;
	      fi;
	   fi;
	   i = i + 1;
	 od;
	 EndChanging(iOwa);
       Except
	 CancelChanging(iOwa);
	 Raise;
       End;
    fi;
  Finally
    CloseWorkArea(iowa);
  End;
  iOwa = OpenWorkArea(sCrd, "", sFld + " = " + RecordToString(rRec));
  Try
    iOwaLen = Records(iOwa);
    if iOwaLen > 0
    :
       bResult = false;
    else
       bResult = true;
    fi;
  Finally
    CloseWorkArea(iowa);
  End;
  bRecursion = bResult;
End;

Func funcChildCheck(Rec: Record): Logical;
var i: I;
var sTmp: S;
var bFlag, bTmp: L;
  bFlag = true;
  for i = 1 to Упр
  do
    sTmp = ExtractWord(WordsCount(refКартНаКого[i], "."), refКартНаКого[i], ".");
    if Карт = sTmp and bFlag
    :
       procCheckChildren(i, Rec);
       bTmp = bRecursion2;
       bFlag = bFlag and bTmp;
    fi;
  od;
  Return bFlag;
end;

Func funcУдалитьЗаписиПоСцылке(Rec: Record): Logical;
var i: I;
var sTmp: S;
var bFlag, bTmp: L;
  bFlag = true;
  for i = 1 to Упр
  do
    sTmp = ExtractWord(WordsCount(refКартНаКого[i], "."), refКартНаКого[i], ".");
    if Карт = sTmp and bFlag
    :
       procKillChildren(i, Rec);
       bTmp = bRecursion;
       bFlag = bFlag and bTmp;
    fi;
  od;
  Return bFlag;
end;

Proc Инициализация;
var n, nn, f, ff, z, m, iLen: I;
  ClearVariable(Excl);
  ClearVariable(Key);
  ClearVariable(BufRefCard);
  ClearVariable(BufRefField);
  ClearVariable(BufRefOWA);
  ClearVariable(BufRefMode);
  for n = 1 to Упр
  do
    if not refКарт[n] = "" and not refПоле[n] = "" and refКартНаКого[n] = Карт and sDelRefCrd[n] = "Удалять"
    :
       AddInArray(Excl, True, False, refКарт[n] + " " + refПоле[n]);
    fi;
  od;
  nn = GetCardFileNames("*", Buf, False, False, Карт);
  for n = 1 to nn
  do
    ff = СписокСцылочныхПолей(Buf[n], Карт);
    for f = 1 to ff
    do
      if SearchInArray(Excl, Buf[n] + " " + Buf2[f], true) = -1
      :
	 m = 0;
      else
	 m = 1;
      fi;
      if SearchInArray(Key, Str(m) + " " + Buf[n] + " " + Buf2[f],True) = -1
      :
	 z = InsertInArraySort(Key, Str(m) + " " + Buf[n] + " " + Buf2[f]);
	 InsertInArray(BufRefCard, z, Buf[n]);
	 InsertInArray(BufRefField, z, Buf2[f]);
	 InsertInArray(BufRefMode, z, m);
      fi;
    od;
  od;
  nn = LengthOfArray(BufRefCard);
  n = 1;
  Try
    While n <= nn
    do
      BufRefOWA[n] = OpenWorkArea(BufRefCard[n], "", "not " + BufRefField[n] + " = nil");
      iLen = Records(BufRefOWA[n]);
      CloseWorkArea(BufRefOWA[n]);
      BufRefOWA[n] = 0;
      if iLen = 0
      :
	 DeleteFromArray(Key, n);
	 DeleteFromArray(BufRefCard, n);
	 DeleteFromArray(BufRefField, n);
	 DeleteFromArray(BufRefMode, n);
	 nn = nn - 1;
      else
	 n = n + 1;
      fi;
    od;
  Except
    nn = LengthOfArray(BufRefCard);
    for n = 1 to nn
    do
      if not BufRefOWA[n] = 0
      :
	 CloseWorkArea(BufRefOWA[f]);
      fi;
    od;
    ClearVariable(BufRefOWA);
    Raise;
  end;
end;

Proc ИнициализацияParent(sCardName: S);
var n, nn, f, ff, z, m, iLen: I;
  ClearVariable(BufParent);
  ClearVariable(ExclParent);
  ClearVariable(KeyParent);
  ClearVariable(BufRefCardParent);
  ClearVariable(BufRefFieldParent);
  ClearVariable(BufRefOWAParent);
  ClearVariable(BufRefModeParent);
  for n = 1 to Упр4
  do
    if not refКартРСсылка[n] = "" and not refКартРСсылка[n] = "" and refКартР2[n] = sCardName
    :
       AddInArray(ExclParent, True, False, refКартРСсылка[n] + " " + refКартРСсылкаПоле[n]);
    fi;
  od;
  nn = GetCardFileNames("*", BufParent, False, False, sCardName);
  for n = 1 to nn
  do
    ff = СписокСцылочныхПолейParent(BufParent[n], sCardName);
    for f = 1 to ff
    do
      if SearchInArray(ExclParent, BufParent[n] + " " + Buf2Parent[f], true) = -1
      :
	 m = 0;
      else
	 m = 1;
      fi;
      if SearchInArray(KeyParent, Str(m) + " " + BufParent[n] + " " + Buf2Parent[f], True) = -1
      :
	 z = InsertInArraySort(KeyParent, Str(m) + " " + BufParent[n] + " " + Buf2Parent[f]);
	 InsertInArray(BufRefCardParent, z, BufParent[n]);
	 InsertInArray(BufRefFieldParent, z, Buf2Parent[f]);
	 InsertInArray(BufRefModeParent, z, m);
      fi;
    od;
  od;
  nn = LengthOfArray(BufRefCardParent);
  n = 1;
  Try
    While n <= nn
    do
      BufRefOWAParent[n] = OpenWorkArea(BufRefCardParent[n], "", "not " + BufRefFieldParent[n] + " = nil");
      iLen = Records(BufRefOWAParent[n]);
      CloseWorkArea(BufRefOWAParent[n]);
      BufRefOWAParent[n] = 0;
      if iLen = 0
      :
	 DeleteFromArray(KeyParent, n);
	 DeleteFromArray(BufRefCardParent, n);
	 DeleteFromArray(BufRefFieldParent, n);
	 DeleteFromArray(BufRefModeParent, n);
	 nn = nn - 1;
      else
	 n = n + 1;
      fi;
    od;
  Except
    nn = LengthOfArray(BufRefCardParent);
    for n = 1 to nn
    do
      if not BufRefOWAParent[n] = 0
      :
	 CloseWorkArea(BufRefOWAParent[f]);
      fi;
    od;
    ClearVariable(BufRefOWAParent);
    Raise;
  end;
end;

Proc Расчет;
var OWA, n, nr, nn, z, i: I;
var Rec, rRecParent: Record;
var F: S;
var b, e, iNumDeleted: I;
var bParentNotUsed, bChildDeleted, bChildChecked: L;
  iNumDel = 0;
  iNumDel2 = 0;
  ClearTrace(True);
  Refresh(True);
  b = time;
  Инициализация;
  if Упр2 = 1 and refКартНаимР[1] <> ""
  :
     ИнициализацияParent(refКартНаимР[1]);
  fi;
  if IsHierArchical(Карт)
  :
     F = if(КартДопФ = "", "not GroupAttr = - 1", "(" + КартДопФ + ") and not GroupAttr = - 1");
  |  КартДопФ = ""
  :
     F = "";
  |  КартДопФ <> ""
  :
     F = КартДопФ;
  fi;
  OWA = OpenWorkArea(Карт, "", F);
  Try
    nr = Records(OWA);
    ShowProgress(nr, "Прогресс....");
    BeginChanging(OWA, True);
    Try
      for n = 1 to nr
      do
	ProgressPos(n);
	Rec = GetRecordKey(OWA, n);
	hint(recordToString(rec));
	if ПризнакИспользуется(Rec, "*") = ""
	:
	   if not ЕстьСцылка(Rec)
	   :
	      bParentNotUsed = True;
	      i = 1;
	      while i <= Упр2 and bParentNotUsed
	      do
		if refКартНаимР[i] <> ""
		:
		   rRecParent = GetFieldR(OWA, n, refКартР[i]);
		   if rRecParent <> nil
		   :
		      if Упр2 > 1
		      :
			 ИнициализацияParent(refКартНаимР[i]);
		      fi;
		      if ПризнакИспользуетсяParent(rRecParent, "*", refКартНаимР[i]) = ""
		      :
			 if ЕстьСцылкаParent(rRecParent)
			 :
			    bParentNotUsed = false;
			 fi;
		      else
			 bParentNotUsed = false;
		      fi;
		   fi;
		fi;
		i = i + 1;
	      od;
	      if bParentNotUsed
	      :
		 if Упр > 0 and SearchInArray(sDelRefCrd, "Проверять") > 0
		 :
		    bChildChecked = funcChildCheck(Rec);
		 else
		    bChildChecked = true;
		 fi;
		 if Упр > 0 and bChildChecked
		 :
		    bChildDeleted = funcУдалитьЗаписиПоСцылке(Rec);
		 else
		    bChildDeleted = bChildChecked;
		 fi;
		 if bChildDeleted
		 :
		    DeleteRecord(OWA, n);
		    iNumDel = iNumDel + 1;
		 fi;
		 --trace("Xaxaxa! " + recordtostring(rec));
	      fi;
	   fi;
	fi;
      od;
      --iNumDel = iNumDeleted;
      EndChanging(OWA);
    Except
      CancelChanging(OWA);
      Raise;
    end;
  Finally
    CloseWorkArea(OWA);
    nn = LengthOfArray(BufRefOWA);
    for n = 1 to nn
    do
      if not BufRefOWA[n] = 0
      :
	 CloseWorkArea(BufRefOWA[n]);
      fi;
    od;
    CloseProgress;
  end;
  e = time;
  Trace(Str(e - b));
  Message("Операция завершена успешно! Удалено " + str(iNumDel) + " записей в основной картотеке и " + str(iNumDel2) + " записей в ссылочных картотеках.", mtWarning);
end;
--Процедуры и функции -------------	      
--
--
--Обработчики событий полей шаблона-----
Func Карт_OnEnter(FieldName: String; Iter: Integer): logical;
var n, j, jj: I;
var tmp, Карт_: S;
  tmp = ВыбратьКарт("");
  if tmp = ""
  :
     Return False;
  fi;
  Карт = SubStr(tmp, 1, Pos(" --", tmp) - 1);
  КартНаим = SubStr(tmp, Pos(" --", tmp) + 4, 255);
  Очистить;
  ClearVariable(КартДопФ);
  Return False;
end;

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

Func КартДопФ_OnVerify(FieldName: String; Iter: Integer; Value: S):L;
var OWA:I;
  OWA = OpenWorkArea(Карт, "", Value);
  Try
  Finally
    CloseWorkArea(OWA);
  end;
  Return True;
end;

Func КартДопФ_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter, p: I;
var tmp: S;
  if Карт = ""
  :
     Message("Выберите картотеку", mtError);
     Template.HideEditor(False);
     Template.Field = "Карт";
     Return Cur;
  fi;
  tmp = ВыбратьКартПоле(Карт, mtlAll, "");
  if tmp = ""
  :
     Template.HideEditor(False);
     Return Cur;
  fi;
  Cur = Cur + tmp;
  Return Cur;
end;

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

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
  DeleteFrame(Упр, Iter);
  Return False;
end;

Func AA_OnEnter(FieldName: String; Iter: Integer): logical;
  InsertFrame(Упр2, Iter + 1);
  Return False;
end;

Func DD_OnEnter(FieldName: String; Iter: Integer): logical;
  DeleteFrame(Упр2, Iter);
  Return False;
end;

Func A1_OnEnter(FieldName: String; Iter: Integer): logical;
  InsertFrame(Упр3, Iter + 1);
  Return False;
end;

Func D1_OnEnter(FieldName: String; Iter: Integer): logical;
  DeleteFrame(Упр3, Iter);
  Return False;
end;

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

Func D2_OnEnter(FieldName: String; Iter: Integer): logical;
  DeleteFrame(Упр4, Iter);
  Return False;
end;

Func A3_OnEnter(FieldName: String; Iter: Integer): logical;
  InsertFrame(Упр5, Iter + 1);
  Return False;
end;

Func D3_OnEnter(FieldName: String; Iter: Integer): logical;
  DeleteFrame(Упр5, Iter);
  Return False;
end;

Func refКартНаКого_OnEnter(FieldName: String; Iter: Integer): logical;
Var tmp, sTmp1, s1, s2: S;
Var n, nn, i, j, k, iPos1, iPos2: I;
Var iRefNum: I;
Var bContinue, bFlag: L;
  if Карт = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "Карт";
     Return False;
  fi;
  if iAddType <> 1 and iAddType <> 2
  :
     Message("Выберите способ добавления!", mtError);
     Return False;
  fi;
  ClearVariable(Buf);
  ClearVariable(sTmpMas2);
  sTmpMas2[1] = Карт;
  iPos1 = 1;
  iPos2 = 1;
  bContinue = true;
  while bContinue
  do
    for i = iPos1 to iPos2
    do
      sTmp1 = ExtractWord(WordsCount(sTmpMas2[i], "."), sTmpMas2[i], ".");
      iRefNum = GetCardFileNames("*", sTmpMas, False, True, sTmp1);
      for j = 1 to iRefNum
      do
	tmp = substr(sTmpMas[j], 1, pos("--", sTmpMas[j]) - 1);
	sTmp1 = ExtractWord(WordsCount(sTmpMas2[i], "."), sTmpMas2[i], ".") + "." + trim(tmp);
	tmp = sTmpMas2[i] + "." + trim(tmp);
	if searchInArray(sTmpMas2, tmp) < 1
	:
	   n = lengthOfArray(sTmpMas2);
	   if sTmp1 = tmp
	   :
	      sTmpMas2[n + 1] = tmp;
	   else
	      k = 1;
	      bFlag = true;
	      while k <= n and bFlag
	      do
		s2 = ExtractWord(WordsCount(sTmpMas2[k], "."), sTmpMas2[k], ".");
		if WordsCount(sTmpMas2[k], ".") > 1
		:
		   s1 = ExtractWord(WordsCount(sTmpMas2[k], ".") - 1, sTmpMas2[k], ".");
		   s2 = s1 + "." + s2;
		fi;
		if pos(sTmp1, s2) > 0
		:
		   bFlag = false;
		fi;
		k = k + 1;
	      od;
	      if bFlag
	      :
		 tmp = substr(sTmpMas[j], 1, pos("--", sTmpMas[j]) - 1);
		 tmp = sTmpMas2[i] + "." + trim(tmp);
		 sTmpMas2[n + 1] = tmp;
	      fi;
	   fi;
	fi;
      od;
    od;
    iPos1 = iPos2 + 1;
    iPos2 = lengthOfArray(sTmpMas2);
    if iPos1 > iPos2
    :
       bContinue = false;
    fi;
  od;
  n = lengthOfArray(sTmpMas2);
  for i = 1 to n
  do
    if searchInArray(Buf, sTmpMas2[i]) < 1
    :
       InsertInArraySort(Buf, sTmpmas2[i]);
    fi;
  od;
  n = AlternateTree("Список картотек", Buf, -1, 1, 12, ".", "Картотека", "", -1, true);
  if n < 1
  :
     Return False;
  fi;
  if iAddType = 1
  :
     refКартНаКого[Iter] = Buf[n];
  |  iAddType = 2
  :
     nn = WordsCount(Buf[n], ".");
     s1 = "";
     for i = 1 to nn
     do
       if i > 1
       :
	  s1 = s1 + "." + ExtractWord(i, Buf[n], ".");
       else
	  s1 = ExtractWord(i, Buf[n], ".");
       fi;
       s2 = ExtractWord(i + 1, Buf[n], ".");
       k = Iter + i;
       InsertFrame(Упр, k);
       refКартНаКого[k] = s1;
       refКарт[k] = s2;
     od;
     DeleteFrame(Упр, Iter);
  fi;
  Return false;
end;

Func refКарт_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp: S;
  if refКартНаКого[Iter] = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "refКартНаКого";
     Return False;
  fi;
  tmp = refКартНаКого[Iter];
  while pos(".", tmp) > 0
  do
    tmp = substr(tmp, pos(".", tmp) + 1, 255);
  od;
  tmp = ВыбратьКарт(tmp);
  if tmp = ""
  :
     Return False;
  fi;
  refКарт[Iter] = SubStr(tmp, 1, Pos(" --", tmp) - 1);
  refКартНаим[Iter] = SubStr(tmp, Pos(" --", tmp) + 4, 255);
  Return False;
end;

Func refПоле_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp: S;
  if Карт = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "Карт";
     Return False;
  fi;
  if refКарт[Iter] = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "refКарт";
     Template.Frame = 1;
     Return False;
  fi;
  tmp = refКартНаКого[Iter];
  while pos(".", tmp) > 0
  do
    tmp = substr(tmp, pos(".", tmp) + 1, 255);
  od;
  tmp = ВыбратьКартПоле(refКарт[Iter], mtlRef, tmp);
  if tmp = ""
  :
     Return False;
  fi;
  refПоле[Iter] = tmp;
  refПолеНаим[Iter] = NameField;
  Return False;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnВыполнить_OnClick(Sender: String);
var Msg: String;
var Iter: I;
  if Проверить
  :
     Msg = "Данные в картеке(ах) " + Карт;
     if Упр > 0
     :
	for Iter = 1 to Упр
	do
	  Msg = Msg + ", " + refКарт[Iter];
	od;
     fi;
     Msg = Msg + " будут удалены, вы уверены ?";
     if EnqOkCancel(Msg, mtWarning) = cmCancel
     :
	Exit;
     fi;
     Расчет;
  fi;
end;
--Обработчики событий объектов шаблона-----
--

Func refКартР_OnEnter(FieldName: String; Iter: Integer): logical;
var i: I;
var sTmp: S;
  if Карт = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "Карт";
     Return False;
  fi;
  sTmp = ВыбратьКартПоле(Карт, mtlRef, "");
  if sTmp = ""
  :
     Return False;
  fi;
  refКартР[Iter] = sTmp;
  refКартНаимР[Iter] = sFieldType;
  Return False;
end;

Func ПолеПризн_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp: S;
  if Карт = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "Карт";
     Return False;
  fi;
  tmp = ВыбратьКартПоле(Карт,mtlString, "");
  if tmp = ""
  :
     Return False;
  fi;
  ПолеПризн[Iter] = tmp;
  ПолеПризнНаим[Iter] = NameField;
  Return False;
end;

Func refКартР2_OnEnter(FieldName: String; Iter: Integer): logical;
Var i: I;
  i = alternate("Картотека", refКартНаимР, -1, 1);
  refКартР2[Iter] = refКартНаимР[i];
  Return false;
end;

Func refКартР3_OnEnter(FieldName: String; Iter: Integer): logical;
Var i: I;
  i = alternate("Картотека", refКартНаимР, -1, 1);
  refКартР3[Iter] = refКартНаимР[i];
  Return false;
end;

Func refКартРПризн_OnEnter(FieldName: String; Iter: Integer): logical;
var sTmp: S;
  if refКартР2[Iter] = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "refКартР2";
     Return False;
  fi;
  sTmp = ВыбратьКартПоле(refКартР2[Iter], mtlString, "");
  if sTmp = ""
  :
     Return False;
  fi;
  refКартРПризн[Iter] = sTmp;
  refКартРПризнИмя[Iter] = NameField;
  Return false;
end;

Func refКартРСсылка_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp: S;
  if refКартР3[Iter] = ""
  :
     Message("Укажите картотеку", mtError);
     Return False;
  fi;
  tmp = ВыбратьКарт(refКартР3[Iter]);
  if tmp = ""
  :
     Return False;
  fi;
  refКартРСсылка[Iter] = SubStr(tmp, 1, Pos(" --", tmp) - 1);
  refКартРСсылкаИмя[Iter] = SubStr(tmp, Pos(" --", tmp) + 4, 255);
  Return False;
end;

Func refКартРСсылкаПоле_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp: S;
  if refКартР3[Iter] = ""
  :
     Message("Укажите картотеку", mtError);
     Return False;
  fi;
  if refКартРСсылка[Iter] = ""
  :
     Message("Укажите картотеку", mtError);
     Return False;
  fi;
  tmp = ВыбратьКартПоле(refКартРСсылка[Iter], mtlRef, refКартР3[Iter]);
  if tmp = ""
  :
     Return False;
  fi;
  refКартРСсылкаПоле[Iter] = tmp;
  refКартРСсылкаПолеИмя[Iter] = NameField;
  Return False;
end;

Proc Button1_OnClick(Sender: String);
var flag: l;
  iNumDel = 0;
  iNumDel2 = 0;
  flag = Проверить;
  if flag
  :
     Message("Все правильно");
  fi;
end;

Func refПолеПризн_OnEnter(FieldName: String; Iter: Integer): logical;
Var tmp: S;
  if refКарт[Iter] = ""
  :
     Message("Укажите картотеку", mtError);
     Template.Field = "Карт";
     Return False;
  fi;
  tmp = ВыбратьКартПоле(refКарт[Iter], mtlString, "");
  if tmp = ""
  :
     Return False;
  fi;
  refПолеПризн[Iter] = tmp;
  Return False;
end;

Функ sDelRefCrd_ПриВходе(Поле: Строка; Iter: Целое): Логич;
  if sDelRefCrd[Iter] = "Удалять"
  :
     sDelRefCrd[Iter] = "Проверять";
  else
     sDelRefCrd[Iter] = "Удалять";
  fi;
  Возврат False;
end;


Конец
