БЛАНКСШАБЛОНОМ[20.04.2006] "Заморозка периода";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
btnReRead:Object; btnВыполнить:Object; btnExit:Object;
cbРасшРеж:Object;
СекцШАПtab:Object; СекцТАБtab:Object; СекцПОДtab:Object;
СекцШАПcrd:Object; СекцТАБcrd:Object; СекцПОДcrd:Object;
СекцШАПtxt:Object; СекцТАБtxt:Object; СекцПОДtxt:Object;
--
упрТАБtab:Integer;
упрТАБcrd:Integer;
упрТАБtxt:Integer;
--
var fedUnknown	  :Integer=0; --нет информации
var fedNoAccess   :Integer=1; --доступ запрещен
var fedCanEdit	  :Integer=2; --доступ разрешен
var accForbidden  :Integer=1;
var accAllowed	  :Integer=0;
--
var fРасшРеж	  :Logical=[False];
var fОбыкРеж	  :Logical=not fРасшРеж;
var fРежим	  :Logical=[False];
var txtРежим	  :String=if(fРежим, "Разблокировка записей", "Блокировка записей");
var Фокус	  :String;
var Пользов	  :String;
var Схема	  :String;
var наДату	  :Date;
var ВклДату	  :String=if(наДату>31.12.1999, " по "+DateToString(наДату-1)+" включительно", "") ;
var ДатН	  :Date;
var ДатК	  :Date;
var dbMsSQL	  :Logical;
var Chek	  :String="ю"; --Wingdings
var UnChek	  :String="э"; --Wingdings
var NN[]	  :String=Str($);
var Buf[]	  :String;
var BufNam[]	  :String;
var BufTxt[]	  :String;
var Протокол[]	  :String;
--
var RazNam[]	  :String;   -- Имя разделов табличного журнала
var RazKey[]	  :Integer;  -- Ключ разделов табличного журнала
var jurTAB[]	  :String;   -- Имя табличного журнала
var keyTAB[]	  :Integer;  -- Ukey табличного раздела
var AB_TAB[]	  :Integer;  -- возможность блокировки
var AU_TAB[]	  :Integer;  -- возможность разблокировки
var jurCRD[]	  :String;   -- Имя картотечного журнала
var comCRD[]	  :String;   -- Комментарий картотечного журнала
var imyCRD[]	  :String;   -- Имя картотеки
var AB_CRD[]	  :Integer;  -- возможность блокировки
var AU_CRD[]	  :Integer;  -- возможность разблокировки
var cmfCRD[]	  :Integer;  -- ClosedModFob Mode
var datCRD[]	  :String;   -- Поле даты проводки для JDF
var jurTXT[]	  :String;   -- Имя текстового журнала
--
var enbTAB[]	  :Logical;  -- Блокировать/Разблокировать табличный журнал
var enbCRD[]	  :Logical;  -- Блокировать/Разблокировать картотечный журнал

2-- Общие процедуры и функции
Proc ОчиститьТаблицы;
 ClearVariable(RazNam); ClearVariable(jurCRD);
 ClearVariable(RazKey); ClearVariable(comCRD);
 ClearVariable(jurTAB); ClearVariable(imyCRD);
 ClearVariable(keyTAB); ClearVariable(AB_CRD);
 ClearVariable(AB_TAB); ClearVariable(AU_CRD);
 ClearVariable(AU_TAB); ClearVariable(cmfCRD);
 ClearVariable(jurTXT); ClearVariable(datCRD);
end;

Proc ОчиститьТаблицыВвода;
 ClearVariable(enbTAB); ClearVariable(enbCRD);
end;

Proc Очистить;
 ClearVariable(NN); ClearVariable(Buf); ClearVariable(BufNam); ClearVariable(BufTxt); ClearVariable(Протокол);
end;

Func БазаMsSQL :Logical;
 if Pos("MS SQL", GetCardDBType("РПО_БЮДЖ_КЛАСС"))>0: ^True; fi;
 ^False;
end;

Func ВыборДаты(srcDate:Date) :Date;
var dd :Date;
 if srcDate>1.1.100: dd=Calendar(srcDate); else dd=Calendar(ToDay); fi;
 if not(dd<=1.1.100): ^dd; else ^srcDate; fi;
end;

Func GetDate :Date;  -- считываем в заданном поле дату
var name :String;
var Iter :Integer;
 name=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if name="НАДАТУ": ^НаДату;
 |  name="ДАТН"  : ^ДатН;
 |  name="ДАТК"  : ^ДатК;
 fi;
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var name :String;
var Iter :Integer;
 name=AsString(Template.Field);
 Iter=AsInteger(Template.Frame);
 if name="НАДАТУ": НАДАТУ = Value;
 |  name="ДАТН"  : ДАТН   = Value;
 |  name="ДАТК"  : ДАТК   = Value;
 fi;
end;

Func Объединить(Value1:String; Value2:String; Separator:String) :String;
var Ret :String;
 if Value1<>"" and Value2<>"": Ret=Value1+Separator+Value2;
 |  Value1= "" and Value2<>"": Ret=Value2;
 |  Value1<>"" and Value2="" : Ret=Value1;
 |  True: Ret="";
 fi;
 ^Ret;
end;

Proc ВидТаблиц;
var tab, crd, txt :Logical;
 tab=if(LengthOfArray(jurTAB)>0, True, False);
 crd=if(LengthOfArray(jurCRD)>0, True, False);
 txt=if(LengthOfArray(jurTXT)>0, True, False);
 СекцШАПtab.Visible=tab; СекцТАБtab.Visible=tab; СекцПОДtab.Visible=tab;
 СекцШАПcrd.Visible=crd; СекцТАБcrd.Visible=crd; СекцПОДcrd.Visible=crd;
 СекцШАПtxt.Visible=txt; СекцТАБtxt.Visible=txt; СекцПОДtxt.Visible=txt;
end;

Proc СчитатьРазделы;
var RO, len, i :Integer;
 ClearVariable(RazNam); ClearVariable(RazKey);
 try
   RO=OpenWorkArea("TABLE_RAZD", "", "");
   Try
     len=Records(RO);
     if len>0:
       for i=1 to len do
	 RazNam[i]=Up(GetFieldS(RO, i, "РАЗДЕЛ"));
	 RazKey[i]=RecordToInteger(GetRecordKey(RO, i));
       od;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 except
 end;
end;

Func ДоступКразделуПриБлокировке(key:Integer) :Integer;
var RO, num, res, y :Integer;
var tmp :String;
 res=0;
 RO=OpenWorkArea("TABLE_OPER", "", "РАЗДЕЛ="+RecordToString(IntegerToRecord(key))+" AND NOT CLOSEDMODFOB");
 Try
   num=Records(RO);
   if num=0: SetFilter(RO, "РАЗДЕЛ="+RecordToString(IntegerToRecord(key))); fi;
   num=Records(RO);
   if num>0:
     BeginChanging(RO, False);
     Try
       tmp=GetFieldS(RO, 1, "Содержание");
       y=PutFieldS(RO, 1, "Содержание", tmp);
       EndChanging(RO);
       res=1;
     Except
       res=-1;
       CancelChanging(RO);
       if not ErrorCode=21898: Raise; fi; -- нет достаточных прав
     end;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 ^res;
end;

Func ДоступКразделуПриРазблокировке(key:Integer) :Integer;
var RO, num, res, y :Integer;
var tmp :String;
 res=0;
 RO=OpenWorkArea("TABLE_OPER", "", "РАЗДЕЛ="+RecordToString(IntegerToRecord(key))+" AND CLOSEDMODFOB");
 Try
   num=Records(RO);
   if num>0:
     BeginChanging(RO, False);
     Try
       tmp=GetFieldS(RO, 1, "Содержание");
       y=PutFieldS(RO, 1, "Содержание", tmp);
       EndChanging(RO);
       res=1;
     Except
       res=-1;
       CancelChanging(RO);
       if not ErrorCode=21898: Raise; fi; -- нет достаточных прав
     end;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 ^res;
end;

Func ДоступКcrdПриРазблокировке(Card:String; Field:String) :Integer;
var RO, num, res, y :Integer;
var dd_test :Date;
 res=0;
 RO=OpenWorkArea(Card, "", "CLOSEDMODFOB");
 Try
   num=Records(RO);
   if num>0:
     BeginChanging(RO, False);
     Try
       if Field<>"" and Field<>" ":
	 dd_test=GetFieldD(RO, 1, Field);
	 y=PutFieldD(RO, 1, Field, dd_test);
	 EndChanging(RO);
	 res=1;
       fi;
     Except
       res=-1;
       CancelChanging(RO);
       if not ErrorCode=21907: Raise; fi; -- нет достаточных прав
     end;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 ^res;
end;

Func ПолеДатыПроводкиJDF(JDFфайл:String; CRDname:String) :String;
var File, k, x, j :Integer;
var tmp, res :String;
 res="";
 File=TextFileOpenRead(JDFфайл);
 Try
   while not TextFileEndOfFile(File) do
     tmp=Up(TextFileReadLn(File));
     if (Pos("КАРТОТЕКА", tmp)>0 or Pos("CARDFILE", tmp)>0) and Pos(Up(CRDname), tmp)>0:
       x=Pos("(", tmp);
       tmp=SubStr(tmp, x+1, Length(tmp)-x-1);
       k=WordsCount(tmp, ",");
       ClearVariable(Buf);
       x=GetCardFileFields(CRDname, Buf, mtlDATE);
       if k>0 and x>0:
	 tmp=ExtractWord(1, tmp, ",");
	 j=SearchInArray(Buf, tmp, False, 1);
	 if j>0: res=tmp; Break; fi;
       fi;
     fi;
   od;
 Except
   TextFileClose(File);
   ^"";
 end;
 TextFileClose(File);
 ^res;
end;

Proc ReadWorkJur(RefreshEnable:Logical; msgView:Logical);
var len, i, nn, tab, crd, txt, j, Flag :Integer;
var msg, name, type, tmp :String;
var Режим, Work :Logical;
 ОчиститьТаблицы;
 ClearVariable(NN);
 msg=""; tab=0; crd=0; txt=0;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Связывание журналов...");
 Try
   if RefreshEnable: Refresh(False); fi;
   len=JournalsCount;
   if len>0:
     ClearVariable(Buf); ClearVariable(BufNam); ClearVariable(BufTxt);
     nn=GetCardFileNames("*", Buf, False, True, "");
     if nn>0:
       ShowProgress(nn, "Подготовка журналов...");
       for i=1 to nn do
	 ProgressPos(i);
	 tmp=Buf[i];
	 j=InsertInArraySort(BufNam, SubStr(tmp, 1, Pos(" --", tmp)-1));
	 InsertInArray(BufTxt, j, SubStr(tmp, Pos(" -- ", tmp)+4, 255));
       od;
     fi;
     СчитатьРазделы;
     ShowProgress(nn, "Обработка журналов...");
     for i=0 to len do --нумерация журналов в списке журналов начинается с нуля
       ProgressPos(i);
       name=JournalName(i);
       type=Up(JournalType(name));
       if type="РАЗД" :
	  tab=tab+1;
	  jurTAB[tab]=name;
	  j=SearchInArray(RazNam, Up(jurTAB[tab]), False, 1);
	  if j>0: keyTAB[tab]=RazKey[j]; fi;
	  Flag=ДоступКразделуПриБлокировке(keyTAB[tab]);
	  if Flag=-1: AB_TAB[tab]=fedNoAccess;
	  |  Flag= 0: AB_TAB[tab]=fedUnknown;
	  |  Flag= 1: AB_TAB[tab]=fedCanEdit;
	  fi;
	  Flag=ДоступКразделуПриРазблокировке(keyTAB[tab]);
	  if Flag=-1: AU_TAB[tab]=fedNoAccess;
	  |  Flag= 0: AU_TAB[tab]=fedUnknown;
	  |  Flag= 1: AU_TAB[tab]=fedCanEdit;
	  fi;
       |  type="КАРТ" :
	  crd=crd+1;
	  jurCRD[crd]=name;
	  imyCRD[crd]=JournalCardFile(name);
	  j=SearchInArray(BufNam, imyCRD[crd], True, 1);
	  if j>0: comCRD[crd]=BufTxt[j]; fi;
	  --
	  ClearVariable(Buf);
	  nn=GetCardFileFields(imyCRD[crd], Buf, mtlBOOLEAN);
	  j=SearchInArray(Buf, "CLOSEDMODFOB", False, 1);
	  if j>1: cmfCRD[crd]=2; else cmfCRD[crd]=1; fi;
	  datCRD[crd]=ПолеДатыПроводкиJDF(jurCRD[crd], imyCRD[crd]);
	  --
	  Work=False;
	  if not IsReadOnly(imyCRD[crd]) and CanUpdate(imyCRD[crd]) and IsVisible(imyCRD[crd]) and datCRD[crd]<>"" and cmfCRD[crd]=fedCanEdit:
	    Work=True;
	  else
	    Work=False;
	  fi;
	  if Work: AB_CRD[crd]=fedCanEdit; else AB_CRD[crd]=fedNoAccess; fi;
	  if Work:
	    Flag=ДоступКcrdПриРазблокировке(imyCRD[crd], datCRD[crd]);
	    if Flag=-1: AU_CRD[crd]=fedNoAccess;
	    |  Flag= 0: AU_CRD[crd]=fedUnknown;
	    |  Flag= 1: AU_CRD[crd]=fedCanEdit;
	    fi;
	  fi;
       |  type="ТЕКСТ":
	  txt=txt+1;
	  jurTXT[txt]=name;
       fi;
     od;
   fi;
 Finally
   CloseProgress;
   упрТАБtab=tab; упрТАБcrd=crd; упрТАБtxt=txt;
   ВидТаблиц;
   ToggleAutorefresh(Режим);
 end;
 if msgView:
   if not tab>0: msg=Объединить(msg, "Табличные журналы не найдены!", Chr(13)); fi;
   if not crd>0: msg=Объединить(msg, "Картотечные журналы не найдены!", Chr(13)); fi;
   if not txt>0: msg=Объединить(msg, "Текстовые журналы не найдены!", Chr(13)); fi;
   if msg<>"" then Message(msg, mtInformation); fi;
 fi;
end;

Proc ВыделитьВсе;
var num, Iter :Integer;
var name :String;
 name=asString(Template.Name);
 if name="СекцШАПtab": num=упрТАБtab; if num>0: for Iter=1 to num do enbTAB[Iter]=True; od; fi;
 |  name="СекцШАПcrd": num=упрТАБcrd; if num>0: for Iter=1 to num do enbCRD[Iter]=True; od; fi;
 fi;
end;

Proc СнятьВсеВыделение;
var num, Iter :Integer;
var name :String;
 name=asString(Template.Name);
 if name="СекцШАПtab": num=упрТАБtab; if num>0: for Iter=1 to num do enbTAB[Iter]=False; od; fi;
 |  name="СекцШАПcrd": num=упрТАБcrd; if num>0: for Iter=1 to num do enbCRD[Iter]=False; od; fi;
 fi;
end;

Func DateToSQLStr(DateTB:Date) :String; -- преобразование даты в формат MS-SQL
var YY, MM, DD :Integer;
 if not DateTB>1.1.100: ^""; fi;
 YY=Year(DateTB);
 MM=Mon(DateTB);
 DD=Day(DateTB);
 ^(Str(YY)+Str(MM)+Str(DD));
end;

Func ЕстьРабота :Logical;
var OK :Logical;
var num, Iter :Integer;
 OK=False;
 if not OK:
   num=упрТАБtab;
   if num>0:
     for Iter=1 to num do
       if enbTAB[Iter] and ((not fРежим and AB_TAB[Iter]=fedCanEdit) or (fРежим and AU_TAB[Iter]=fedCanEdit)):
	 OK=True;
	 Break;
       fi;
     od;
   fi;
 fi;
 if not OK:
   num=упрТАБcrd;
   if num>0:
     for Iter=1 to num do
       if enbCRD[Iter] and cmfCRD[Iter]=fedCanEdit and ((not fРежим and AB_CRD[Iter]=fedCanEdit) or (fРежим and AU_CRD[Iter]=fedCanEdit)):
	 OK=True;
	 Break;
       fi;
     od;
   fi;
 fi;
 ^OK;
end;

Func НазваниеJDF(JDFфайл:String) :String;
var num :Integer;
var res :String;
 res="";
 num=WordsCount(JDFфайл, "\");
 if num>0: res=ExtractWord(num, JDFфайл, "\"); else res=JDFфайл; fi;
 ^res;
end;

Func ВыполнитьПростойРежим(fLAG:Logical) :Logical;
var RO, num, Iter, ROnum, j, k, y, x, шаг, bb, worktime :Integer;
var crdName, tmp :String;
var Режим, fБлок, Final :Logical;
 fБлок=not fLAG;
 if not (наДату>31.12.1999):
   Message("Не указана дата отбора проводок!", mtWarning);
   Template.Field="наДату";
   ^False;
 fi;
 if not ЕстьРабота:
   Message("Нет выбранных для обработки и^Mдоступных для операции '"+txtРежим+"' журналов!", mtWarning);
   Template.Field="Фокус";
   ^False;
 fi;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 worktime=Time;
 bb=0;
 ClearVariable(Протокол);
 ShowProgress(0, "Считывание данных...");
 Try
   num=упрТАБtab;
   if num>0:
     ShowProgress(num, "Обработка табличного журнала...");
     Hint("");
     for Iter=1 to num do
       ProgressPos(Iter);
       Hint("Обработка раздела '"+jurTAB[Iter]+"'");
       bb=bb+1;
       Протокол[bb]="Раздел табличного журнала '"+jurTAB[Iter]+"': ";
       if enbTAB[Iter] and if(fБлок, AB_TAB[Iter]=fedCanEdit, AU_TAB[Iter]=fedCanEdit):
--	 var SQLquery :LongString;
--	 SQL отменен для Table_OPER из-за невозможности обновить данные для СЕРВЕРА ТБ
--	 --SQLquery="SELECT * FROM dbo.Table_OPER WHERE ДАТА < '"+DateToSQLStr(наДату)+"' AND РАЗДЕЛ = "+Str(keyTAB[Iter])+" AND CLOSEDMODFOB = "+if(fБлок, '0', '1');
--	 if dbMsSQL and SQLQueryEnabled: -- если SQL-запросы разрешены
--	   SQLquery="UPDATE dbo.Table_OPER SET CLOSEDMODFOB = "+if(fБлок, Str(accForbidden), Str(accAllowed))+" WHERE ДАТА < '"+DateToSQLStr(наДату)+"' AND РАЗДЕЛ = "+Str(keyTAB[Iter])+" AND CLOSEDMODFOB = "+if(fБлок, Str(accAllowed), Str(accForbidden));
--	   ExecuteSQL("", SQLquery, "Table_OPER");
--	   RefreshCard("Table_OPER");
--	 fi;
	 tmp="ДАТА<"+DateToString(наДату)+" AND ДАТА<>1.1.100 AND РАЗДЕЛ="+RecordToString(IntegerToRecord(keyTAB[Iter]))+" AND "+if(fБлок, "NOT CLOSEDMODFOB", "CLOSEDMODFOB");
	 RO=OpenWorkArea("TABLE_OPER", "", tmp);
	 Try
	   ROnum=Records(RO);
	   if ROnum>0:
	     k=0; y=0; шаг=Int(ROnum/(if(ROnum>100: 100, 10))); x=0;
	     Try
	       j=ROnum;
	       while j<>0 do
		 if (шаг+x)=j: x=x+шаг; fi;
		 Hint("Обработка раздела '"+jurTAB[Iter]+"': "+RepStr(Chr(152)+Chr(20), x));
		 if k=0: -- если новая порция, то открываем RO на изменения
		   BeginChanging(RO, False);
		 fi;
		 k=k+1;
		 j=PutFieldL(RO, j, "CLOSEDMODFOB", if(fБлок, True, False));
		 if k=200: --записываем очередную порцию записей
		   EndChanging(RO);
		   y=y+k;
		   k=0;
		 fi;
		 j=j-1;
	       od;
	       if k>0: EndChanging(RO); y=y+k; fi; --если последняя порция неполная
	       if j=0: Протокол[bb]=Протокол[bb]+"установка флага CLOSEDMODFOB успешно завершена. Обработано "+Str(ROnum)+" записей."; fi;
	     Except
	       CancelChanging(RO);
	       Message("Ошибка "+Str(ErrorCode)+"!", mtError);
	       Raise;
	     end;
	   else
	     Протокол[bb]=Протокол[bb]+"нет записей для обработки.";
	   fi;
	 Finally
	   CloseWorkArea(RO);
	 end;
       else
	 if not enbTAB[Iter]:
	   Протокол[bb]=Протокол[bb]+"не выбран для обработки.";
	 else
	   tmp="";
	   if not fРежим and AB_TAB[Iter]<>fedCanEdit: tmp=Объединить(tmp, "недоступен для операции 'блокировка записи'", "; "); fi;
	   if fРежим and AU_TAB[Iter]<>fedCanEdit: tmp=Объединить(tmp, "недоступен для операции 'разблокировка записи'", "; "); fi;
	   Протокол[bb]=Протокол[bb]+"ВНИМАНИЕ: "+tmp+" - операция пропущена.";
	 fi;
       fi;
     od;
   fi;
   num=упрТАБcrd;
   if num>0:
     ShowProgress(num, "Обработка журналов-картотек...");
     Hint("");
     for Iter=1 to num do
       ProgressPos(Iter);
       Hint("Обработка журнала-картотеки '"+jurCRD[Iter]+"'");
       bb=bb+1;
       Протокол[bb]="Журнал-картотека '"+НазваниеJDF(jurCRD[Iter])+"': ";
       if enbCRD[Iter] and cmfCRD[Iter]=fedCanEdit and datCRD[Iter]<>"" and if(fБлок, AB_CRD[Iter]=fedCanEdit, AU_CRD[Iter]=fedCanEdit):
	 tmp=datCRD[Iter]+"<"+DateToString(наДату)+" AND "+datCRD[Iter]+"<>1.1.100"+" AND "+if(fБлок, "NOT CLOSEDMODFOB", "CLOSEDMODFOB");
	 RO=OpenWorkArea(imyCRD[Iter], "", tmp);
	 Try
	   ROnum=Records(RO);
	   if ROnum>0:
	     k=0; y=0; шаг=Int(ROnum/(if(ROnum>100: 100, 10))); x=0;
	     Try
	       j=ROnum;
	       while j<>0 do
		 if (шаг+x)=j: x=x+шаг; fi;
		 Hint("Обработка журнала-картотеки '"+jurCRD[Iter]+"': "+RepStr(Chr(152)+Chr(20), x));
		 if k=0: -- если новая порция, то открываем RO на изменения
		   BeginChanging(RO, False);
		 fi;
		 k=k+1;
		 j=PutFieldL(RO, j, "CLOSEDMODFOB", if(fБлок, True, False));
		 if k=200: --записываем очередную порцию записей
		   EndChanging(RO);
		   y=y+k;
		   k=0;
		 fi;
		 j=j-1;
	       od;
	       if k>0: EndChanging(RO); y=y+k; fi; --если последняя порция неполная
	       if j=0: Протокол[bb]=Протокол[bb]+"установка флага CLOSEDMODFOB успешно завершена. Обработано "+Str(ROnum)+" записей."; fi;
	     Except
	       CancelChanging(RO);
	       Message("Ошибка "+Str(ErrorCode)+"!", mtError);
	       Raise;
	     end;
	   else
	     Протокол[bb]=Протокол[bb]+"нет записей для обработки.";
	   fi;
	 Finally
	   CloseWorkArea(RO);
	 end;
       else
	 if not enbCRD[Iter]:
	   Протокол[bb]=Протокол[bb]+"не выбран для обработки.";
	 else
	   tmp="";
	   if cmfCRD[Iter]<>fedCanEdit: tmp=Объединить(tmp, "в картеке нет поля 'CLOSEDMODFOB'.", "; "); fi;
	   if datCRD[Iter]="": tmp=Объединить(tmp, "недотупна информация о поле даты проводки", "; "); fi;
	   if not fРежим and AB_CRD[Iter]<>fedCanEdit: tmp=Объединить(tmp, "недоступна для операции 'блокировка записи'", "; "); fi;
	   if fРежим and AU_CRD[Iter]<>fedCanEdit: tmp=Объединить(tmp, "недоступна для операции 'разблокировка записи'", "; "); fi;
	   Протокол[bb]=Протокол[bb]+"ВНИМАНИЕ: "+tmp+" - операция пропущена.";
	 fi;
       fi;
     od;
   fi;
   worktime=Time-worktime;
   num=LengthOfArray(Протокол);
   if num>0:
     crdName=PlanVar('CACHE')+"\"+GetGUID;
     k=TextFileCreate(crdName);
     TextFileWriteLn(k, "ПРОТОКОЛ УСТАНОВКИ ФЛАГА CLOSEDMODFOB", True);
     TextFileWriteLn(k, Chr(13), True);
     tmp="РЕЖИМ РАБОТЫ: "+if(fБлок, "блокировка записей (запрет редактирования).", "разблокировка записей (разрешение редактирования).");
     TextFileWriteLn(k, tmp, True);
     tmp="ВРЕМЯ РАБОТЫ: "+Str(worktime)+"с.";
     TextFileWriteLn(k, tmp, True);
     TextFileWriteLn(k, Chr(13), True);
     TextFileWriteLn(k, Chr(13), True);
     for Iter=1 to num do TextFileWriteLn(k, Протокол[Iter]+Chr(13), True); od;
     TextFileClose(k);
     OpenEditor(crdName);
   fi;
 Finally
   Hint("");
   CloseProgress;
   ToggleAutorefresh(Режим);
 end;
 ^True;
end;

Proc ВыполнитьРасширенныйРежим;
end;

Proc Выполнить;
var qq :Integer;
 if fРасшРеж:
    Message("Расширенный режим пока не реализован!");
    Exit;
    ВыполнитьРасширенныйРежим;
 else
    qq=EnqOkCancel("Вы хотите выполнить операцию^M'"+txtРежим+"' в базе даных?", mtConfirmation);
    if qq=cmOk: if ВыполнитьПростойРежим(fРежим): ReadWorkJur(True, False); fi; fi;
 fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
 if Field="fРежим": fРежим = not fРежим; ^False;
 |  Field="Chek"  : ВыделитьВсе; ^False;
 |  Field="UnChek": СнятьВсеВыделение; ^False;
 |  Field="enbTAB": enbTAB[Iter] = not enbTAB[Iter]; ^False;
 |  Field="enbCRD": enbCRD[Iter] = not enbCRD[Iter]; ^False;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
end;

Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var dd :Date;
 Template.HideEditor(False);
 dd=ВыборДаты(GetDate);
 SetDate(dd);
 ^"";
end;

2-- События объектов
Proc cbРасшРеж_onChange(Sender:String);
end;  

Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnReRead"	  : ReadWorkJur(True, True);
 |  Sender="btnВыполнить" : Выполнить;
 |  Sender="btnExit"	  : Close;
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var tmp :String;
 Схема=GetScheme;
 if Схема="": Message("Данный бланк работает только в сетевой версии!", mtInformation); Close; fi;
 Схема="Схема доступа - '"+Up(Схема)+"'";
 tmp=UserName(AliasName("РПО_БЮДЖ_КЛАСС"));
 Пользов=if(tmp<>"", "Пользователь - '"+Up(tmp)+"'", "Пользователь локальной версии");
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar('ОБЩИЕ')+'\Настройки\',"RPO_STDA_000"); -- стандартная настройка
end;

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
 Очистить;
 if НаДату=1.1.100 then НаДату=ToDay; fi;
 dbMsSQL=БазаMsSQL;
 ReadWorkJur(True, False);
 Template.Field="Фокус";
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 Очистить;
end;

КОНЕЦ -- конец бланка