БЛАНКСШАБЛОНОМ "Настроечный бланк", РЕДАКТОР РПО_ПОДОТЧ_НАСТР;
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
СекцОбщая       :Object;
СекцЗначКлюч    :Object;
СекцЗначПроч    :Object;
СекцMsg         :Object;
cbЗащита        :Object;
cbКлючевые      :Object;
--
var addANAЗАРПЛ :Logical=False;
var П1 :String="п"; var П3 :String="п"; var П5 :String="п"; var П7 :String="п"; var П9 :String="п";
var П2 :String="п"; var П4 :String="п"; var П6 :String="п"; var П8 :String="п"; var П71 :String="п";
var Flag_onEnter:Logical;
var ВидАна      :Logical;
var Ключевые    :Logical=[False];
var NewREC      :Logical=(CurrentState=crdusInserted);
var SelfCRD     :String="РПО_ПОДОТЧ_НАСТР";
var кнОК        :String="ОК";
var кнЗкр       :String="Закрыть";
var Buf[]       :String;
var BufAcc[]    :String;
var BufTxt[]    :String;
var ИФД_        :String=if(ИФД="1":"Бюджет"|ИФД="2":"Доходы","");
--
var Доп_ана_    :String=Доп_ана;
var СЧ_ПОГ_АВ_  :String=СЧ_ПОГ_АВ;
var ИменаСекций[] :String;
var BufField[]    :String;
var BufColorBg[]  :Integer;
var BufColorFo[]  :Integer;

2-- Общие процедуры и функции
Proc Очистить;
 ClearVariable(Buf); ClearVariable(BufAcc); ClearVariable(BufTxt);
end;

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

Func Умолчание :Record;
var RO, num :Integer;
var REC :Record;
 REC=NIL;
 RO=OpenWorkArea(SelfCRD, "");
 Try
   if Records(RO)=0:
     BeginChanging(RO, False);
     Try
       num=InsertRecord(RO);
       num=PutFieldL(RO, num, "ЗАЩИТА"     , True);
       num=PutFieldS(RO, num, "КОММЕНТ"    , "Параметры по умолчанию");
       num=PutFieldL(RO, num, "АКТИВНЫ"    , True);
       num=PutFieldS(RO, num, "СЧ_ПО"      , "208");
       num=PutFieldS(RO, num, "СЧ_СУТ"     , "12");
       num=PutFieldS(RO, num, "СЧ_ТРН"     , "22");
       num=PutFieldS(RO, num, "СЧ_КВР"     , "26");
       num=PutFieldS(RO, num, "СЧ_ПО_Д"    , "560");
       num=PutFieldS(RO, num, "СЧ_ПО_К"    , "660");
       num=PutFieldS(RO, num, "СУТ"        , "212");
       num=PutFieldS(RO, num, "ТРН"        , "222");
       num=PutFieldS(RO, num, "КВР"        , "226");
       num=PutFieldS(RO, num, "СЧ_КАССА"   , "201.34");
       num=PutFieldS(RO, num, "СЧ_КАССА_Д" , "510");
       num=PutFieldS(RO, num, "СЧ_КАССА_К" , "610");
       num=PutFieldS(RO, num, "СЧ_ПОГ_АВ"  , "*.?.105.??.340|*.?.106.??.3?0|*.?.201.35.510|*.?.302.1?.830|*.?.302.6?.830|*.?.304.03.830|*.?.304.05.2??|*.?.304.05.3??|*.?.401.20.2??");
       num=PutFieldS(RO, num, "СЧ_ФИНрез"  , "401.20");
       num=PutFieldS(RO, num, "КИВФ"       , "01.05.02.01.01.0000");
       num=PutFieldS(RO, num, "СПРАВ"      , "ВКЛ");
       num=PutFieldS(RO, num, "ИФД"        , "1");
       num=PutFieldS(RO, num, "ФКР"        , "");
       num=PutFieldS(RO, num, "СТ_РАСХ"    , "");
       num=PutFieldL(RO, num, "USE_ПЕРИОД" , False);
       num=PutFieldI(RO, num, "ТЕК_ПЕРИОД" , 0);
       num=PutFieldL(RO, num, "ВЫБОР_СЧ"   , False);
       EndChanging(RO);
       REC=GetRecordKey(RO, num);
     Except
       CancelChanging(RO);
       Raise;
     end;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 ^REC;
end;

Func КлючЗаписиАктивныхНастроек :Record;
var RO, num, nn, i :Integer;
var RR :Record;
 RR=NIL;
 RO=OpenWorkArea(SelfCRD, "", "АКТИВНЫ=True");
 Try 
   num=Records(RO);
   if num=1:
     RR=GetRecordKey(RO, 1);
   |  num=0:
     Message("Нет записи настроек подсистемы!^MБудет создана запись с настройками по умолчанию!", mtInformation);
     RR=Умолчание;
   |  num>1:
     Message("Ошибка!^MАктивна должна быть одна запись настроек подсистемы!^MБудет активирована первая запись.", mtError);
     BeginChanging(RO, False);
     Try
       for i=2 .. num do nn=PutFieldL(RO, i, "АКТИВНЫ", False); od;
       EndChanging(RO);
     Except
       CancelChanging(RO); Raise;
     end;
     RR=GetRecordKey(RO, 1);
   fi; 
 Finally 
   CloseWorkArea(RO);
 end;
 ^RR;
end; 

Func ЕщеАктивнаяЗапись: Record;
-- В данной картотеке есть "отмеченные" поля (кроме текущей записи)? - если есть - запомним ключ записи
var RO, i, num :Integer;
var REC, SearchRec :Record;
 REC=NIL;
 RO=OpenWorkArea(SelfCRD, "", "1=0");
 Try
   SetFilter(RO, 'АКТИВНЫ=True');
   num=Records(RO);
   if num>0 :
     for i=1..num do
       SearchRec=GetRecordKey(RO, i);
       if SearchRec<>Current: REC=SearchRec; Break; fi;
     od;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 ^REC;
end;

Proc ОтменитьТекущиеНастройки;
var RO, num :Integer;
var REC :Record;
 REC=ЕщеАктивнаяЗапись;
 if REC<>NIL:
   RO=OpenWorkArea(SelfCRD, "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       BeginChanging(RO, False);
       Try
         num=PutFieldL(RO, 1, "АКТИВНЫ", False);
         EndChanging(RO);
       Except
         CancelChanging(RO); Raise;
       end;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Proc СменитьАктивныеНастройки;
var Flag :Logical;
var REC :Record;
var msg :String;
 Flag=not(Активны);
 REC=ЕщеАктивнаяЗапись;
 if Flag and REC<>NIL:
   msg="В картотеке уже есть активные настройки.^MАктивировать текущие настройки?";
   if (EnqOkCancel(msg, mtConfirmation)=cmOk): ОтменитьТекущиеНастройки; else Flag=False; fi;
 fi;
 Активны=Flag;
end;

Func TemplateSaveOK :Logical; -- проверка правильности ввода данных
var REC :Record;
var q :Integer;
 if КОММЕНТ=""    : Message("Опишите (прокомментируйте) Ваш набор настроек!", mtWarning);                 Template.Field="КОММЕНТ";    ^False; fi;
 if СЧ_ПО=""      : Message("Не выбран счет расчетов с подотчетными лицами!", mtWarning);                 Template.Field="СЧ_ПО";      ^False; fi;
 if СЧ_СУТ=""     : Message("Не выбран субсчет учета суточных!", mtWarning);                              Template.Field="СЧ_СУТ";     ^False; fi;
 if СЧ_ТРН=""     : Message("Не выбран субсчет учета сумм на проезд!", mtWarning);                        Template.Field="СЧ_ТРН";     ^False; fi;
 if СЧ_КВР=""     : Message("Не выбран субсчет учета сумм на проживание!", mtWarning);                    Template.Field="СЧ_КВР";     ^False; fi;
 if СУТ=""        : Message("Не выбран КОСГУ суточных!", mtWarning);                                      Template.Field="СУТ";        ^False; fi;
 if ТРН=""        : Message("Не выбран КОСГУ на проезд!", mtWarning);                                     Template.Field="ТРН";        ^False; fi;
 if КВР=""        : Message("Не выбран КОСГУ на проживание!", mtWarning);                                 Template.Field="КВР";        ^False; fi;
 if СЧ_КАССА=""   : Message("Не выбран счет кассы!", mtWarning);                                          Template.Field="СЧ_КАССА";   ^False; fi;
 if СЧ_ПОГ_АВ_="" : Message("Не выбраны счета для учета погашений авансов подотчетных лиц!", mtWarning);  Template.Field="СЧ_ПОГ_АВ_"; ^False; fi;
 if СЧ_ФИНрез=""  : Message("Не выбран счет для учета финансового результата текущей деятельности!", mtWarning); Template.Field="СЧ_ФИНрез"; ^False; fi;
 if КИВФ=""       : Message("Не выбран КИФД для бюджетного финансирования!", mtWarning);                  Template.Field="КИВФ";       ^False; fi;
 if СПРАВ=""      : Message("Не выбран справочник статей расходов!", mtWarning);                          Template.Field="СПРАВ";      ^False; fi;
 REC=ЕщеАктивнаяЗапись;
 if REC<>NIL:
   if АКТИВНЫ: Message("Уже есть активные настройки!", mtWarning); ^False; fi;
 else
   if АКТИВНЫ:
     ^True;
   else
     q=Enquiry("Выберите действие...", "Нет активных настроек!", "Активировать и записать текущие;Вернуться к редактированию", mtConfirmation);
     if q=1 : АКТИВНЫ=True; else АКТИВНЫ=False; ^False; fi;
   fi;
 fi;
 ^True;
end;

Proc Инициализация;
 АКТИВНЫ    = False;
 КОММЕНТ    = "Параметры по умолчанию";
 СЧ_ПО      = "208";
 СЧ_СУТ     = "12";
 СЧ_ТРН     = "22";
 СЧ_КВР     = "26";
 СЧ_ПО_Д    = "560";
 СЧ_ПО_К    = "660";
 СУТ        = "212";
 ТРН        = "222";
 КВР        = "226";
 СЧ_КАССА   = "201.34";
 СЧ_КАССА_Д = "510";
 СЧ_КАССА_К = "610";
 СЧ_ПОГ_АВ  = "*.?.105.??.340|*.?.106.??.3?0|*.?.201.35.510|*.?.302.1?.830|*.?.302.6?.830|*.?.304.03.830|*.?.304.05.2??|*.?.304.05.3??|*.?.401.20.2??";
 СЧ_ФИНрез  = "401.20";
 КИВФ       = "01.05.02.01.01.0000";
 СПРАВ      = "ВКЛ";
 ИФД        = "1";
 ФКР        = "";
 СТ_РАСХ    = "";
 USE_ПЕРИОД = False;
 ТЕК_ПЕРИОД = 0;
 ВЫБОР_СЧ   = False;
end;

Proc ЦветаПолей(ЦветКнопок:Integer);
var n,l :Integer;
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo);
 n=InsertInArraySort(BufField,"КНОК");       InsertInArray(BufColorBg,n,ЦветКнопок);
 n=InsertInArraySort(BufField,"КОММЕНТ");    InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"П1");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П2");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П3");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П4");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П5");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П6");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П7");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П71");        InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П8");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"П9");         InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"АКТИВНЫ");    InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СЧ_ПО");      InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СЧ_СУТ");     InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СЧ_ТРН");     InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СЧ_КВР");     InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СУТ");        InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ТРН");        InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"КВР");        InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СЧ_КАССА");   InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СЧ_ПОГ_АВ_"); InsertInArray(BufColorBg,n,coAqua);
 n=InsertInArraySort(BufField,"СЧ_ФИНРЕЗ");  InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"КИВФ");       InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СПРАВ");      InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"USE_ПЕРИОД"); InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ИФД_");       InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ФКР");        InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"СТ_РАСХ");    InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ТЕК_ПЕРИОД"); InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ДОП_АНА_");   InsertInArray(BufColorBg,n,coTeal);
 n=InsertInArraySort(BufField,"ВИДАНА");     InsertInArray(BufColorBg,n,coYellow);
 n=InsertInArraySort(BufField,"ВЫБОР_СЧ");   InsertInArray(BufColorBg,n,coTeal);
 l=LengthOfArray(BufField);
 for n=1..l do
   if BufColorBg[n]=coTeal: BufColorFo[n]=coWhite;
   |  True: BufColorFo[n]=coBlack;
   fi;
 od;
end;

Func ПодсистемаРаботает :Logical; -- если подсистема уже работает то изменять ключевые настройки нельзя
var RO, i, len :Integer;
var OK :Logical;
 OK=False;
 ClearVariable(Buf);
 Buf[1]="РПО_ПОДОТЧ_ЛИМИТ"; Buf[2]="РПО_ПОДОТЧ_ВЫДАН_АВАНС"; Buf[3]="РПО_ПОДОТЧ_ПОГАШЕН_АВАНС"; Buf[4]="РПО_ПОДОТЧ_ПРЯМОЙ_РАСХОД";
 len=LengthOfArray(Buf);
 for i=1 to len do
   RO=OpenWorkArea(Buf[i], "", "ПРОВОДИТЬ=True");
   Try if Records(RO)>0: OK=True; Break; fi; Finally CloseWorkArea(RO); end;
 od;
 ^OK;
end;

Proc ВидимостьОбъектов(УжеРаботаем:Logical);
 if УжеРаботаем: СекцMsg.Visible=True; else СекцMsg.Visible=False; fi;
end;

Proc ПодсистемаУжеРаботает(УжеРаботаем:Logical; БланкЗащищен:Logical); -- если подсистема уже работает то изменять ключевые настройки нельзя
var len, k, i, j, ik, jk, n, цвFont, цвBack :Integer;
var ТЧ :Logical;
var tmp :String;
var СекцИмя :Object;
 ClearVariable(ИменаСекций);
 ИменаСекций[1]="СекцЗначКлюч";
 len=LengthOfArray(ИменаСекций);
 ShowProgress(len, "Обработка данных...");
 Try
   for k=1..len do
     ProgressPos(k);
     if FindObject(ИменаСекций[k], СекцИмя):
       ik=asInteger(СекцИмя.RowsCount); jk=asInteger(СекцИмя.ColsCount);
       for i=1 .. ik do
         for j=1 .. jk do
           tmp=Up(asString(СекцИмя.Cell(i, j, CellContents, ""))); n=SearchInArray(BufField, tmp, True);
           if n<>-1:
             if not(УжеРаботаем=False and БланкЗащищен=False):
               цвFont=coBlack; цвBack=coTransparent; ТЧ=True; 
             else 
               цвFont=BufColorFo[n]; цвBack=BufColorBg[n]; ТЧ=False; 
             fi;
             СекцИмя.Cell(i, j, CellFontColor, цвFont); СекцИмя.Cell(i, j, CellBgColor, цвBack); СекцИмя.Cell(i, j, CellReadOnly, ТЧ);
           fi;
         od;
       od;
     fi;
   od;
 Finally
   CloseProgress;
 end;
 ClearVariable(ИменаСекций);
end;

Proc ТолькоЧтение(БланкЗащищен:Logical);
var len, k, i, j, ik, jk, n, цвFont, цвBack :Integer;
var ТЧ :Logical;
var tmp :String;
var СекцИмя :Object;
 ClearVariable(ИменаСекций);
 ИменаСекций[1]="СекцОбщая"; ИменаСекций[2]="СекцЗначПроч";
 len=LengthOfArray(ИменаСекций);
 ShowProgress(len, "Обработка данных...");
 Try
   for k=1..len do
     ProgressPos(k);
     if FindObject(ИменаСекций[k], СекцИмя):
       ik=asInteger(СекцИмя.RowsCount); jk=asInteger(СекцИмя.ColsCount);
       for i=1 .. ik do
         for j=1 .. jk do
           tmp=Up(asString(СекцИмя.Cell(i, j, CellContents, ""))); n=SearchInArray(BufField, tmp, True);
           if n<>-1:
             if БланкЗащищен: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=BufColorFo[n]; цвBack=BufColorBg[n]; ТЧ=False; fi;
             СекцИмя.Cell(i, j, CellFontColor, цвFont); СекцИмя.Cell(i, j, CellBgColor, цвBack); СекцИмя.Cell(i, j, CellReadOnly, ТЧ);
           fi;
         od;
       od;
     fi;
   od;
 Finally
   CloseProgress;
 end;
 ClearVariable(ИменаСекций);
end; 

Func ВыборСчетаПодотчета(StoreValue:String) :String;
var RO, nn, i, k, j :Integer;
var tmp :String;
 ClearVariable(Buf); ClearVariable(BufAcc);
 nn=GetGroupAccounts("???.????.???????.???.?.???.??.???", Buf, 6);
 if nn=0: Message("Нет счетов соотвествующих структуре учета!^M(КБК основанное на ФКР)^MПроверьте план счетов!", mtError); ^StoreValue; fi;
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???')");
 Try
   nn=Records(RO);
   if nn=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^StoreValue; fi;
   ShowProgress(nn, "Построение списка счетов...");
   Try
     k=0;
     for i=1 to nn do
       ProgressPos(i);
       tmp=GetFieldS(RO, i, "CODE");
       if SearchInArray(Buf, tmp, True)<>-1: 
         k=k+1; 
         BufAcc[k]=tmp+"--"+GetFieldS(RO, i, "TXT");
         if StoreValue=tmp: j=k; fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 Finally
   CloseWorkArea(RO);
 end;
 nn=AlternateTree("Выберите счет учета...", BufAcc, -1, j, 12, ".", "Счет", "Наименование");
 if nn=0: ^StoreValue; fi;
 tmp=SubStr(BufAcc[nn], 1, 3);
 ClearVariable(Buf); ClearVariable(BufAcc);
 if tmp<>StoreValue: СЧ_СУТ=""; СЧ_ТРН=""; СЧ_КВР=""; fi;
 nn=GetGroupAccounts("???.????.???????.???.?."+tmp+".??.???", Buf, 8);
 СЧ_ПО_д=""; СЧ_ПО_к="";
 if nn=2: СЧ_ПО_д=Str(Min(Int(Buf[1]), Int(Buf[2]))); СЧ_ПО_к=Str(Max(Int(Buf[1]), Int(Buf[2]))); fi;
 ClearVariable(Buf);
 ^tmp;
end;

Func ВыборСубСчетаПодотчета(StoreValue:String) :String;
var RO, nn, i, k, j :Integer;
var tmp :String;
 if СЧ_ПО="": 
   Message("Необходимо выбрать 'Счет расчетов с подотчетными лицами'!", mtWarning); 
   Template.Field="СЧ_ПО";
   ^StoreValue;
 fi;
 ClearVariable(Buf); ClearVariable(BufAcc);
 nn=GetGroupAccounts("???.????.???????.???.?."+СЧ_ПО+".??.???", Buf, 7);
 if nn=0: Message("Нет счетов соотвествующих структуре учета!^M(КБК основанное на ФКР)^MПроверьте план счетов!", mtError); ^StoreValue; fi;
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'"+СЧ_ПО+".??')");
 Try
   nn=Records(RO);
   if nn=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^StoreValue; fi;
   ShowProgress(nn, "Построение списка счетов...");
   Try
     k=0;
     for i=1 to nn do
       ProgressPos(i);
       tmp=SubStr(GetFieldS(RO, i, "CODE"), 5, 2);
       if SearchInArray(Buf, tmp, True)<>-1: 
         k=k+1; 
         BufAcc[k]=tmp+"--"+GetFieldS(RO, i, "TXT"); 
         if StoreValue=tmp: j=k; fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 Finally
   CloseWorkArea(RO);
 end;
 nn=AlternateTree("Выберите субсчет "+СЧ_ПО+" счета...", BufAcc, -1, j, 12, ".", "Субсчет", "Наименование");
 if nn=0: ^StoreValue; fi;
 ^SubStr(BufAcc[nn], 1, 2);
end;

Func ВыборСчетаКассы(StoreValue:String) :String;
var RO, nn, i, k, z, j :Integer;
var tmp :String;
 ClearVariable(Buf);
 nn=GetGroupAccounts("???.??.??.??.??.??.????.?.???.??.???", Buf, 9, 10);
 if nn=0: Message("Нет счетов соотвествующих структуре учета!^M(КБК основанное на КИФД)^MПроверьте план счетов!", mtError); ^StoreValue; fi;
 i=1;
 while not Buf[i]="" do
   tmp=SubStr(Buf[i], 1, 4);
   if SearchInArray(Buf, tmp, True)=-1: InsertInArraySort(Buf, tmp); i=i+1; fi; --Добавление группы идет перед выбранным элементом (сортировка)
   i=i+1;
 od;
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???.??')");
 Try
   nn=Records(RO);
   if nn=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^StoreValue; fi;
   ClearVariable(BufAcc); ClearVariable(BufTxt);
   ShowProgress(nn, "Построение списка счетов...");
   Try
     for i=1 to nn do ProgressPos(i); BufAcc[i]=GetFieldS(RO, i, "CODE"); BufTxt[i]=GetFieldS(RO, i, "TXT"); od;
   Finally
     CloseProgress;
   end;
   SetFilter(RO, "NAME_VOC='СЧ' and Match(CODE,'???')");
   ShowProgress(nn, "Обработка счетов...");
   Try
     nn=LengthOfArray(Buf);
     for i=1 to nn do
       z=Length(Buf[i]);
       if SubStr(Buf[i], z, 1)=".":
         tmp=SubStr(Buf[i], 1, z-1);
         k=Search(RO, 1, tmp);
         if k>0: Buf[i]=Buf[i]+"--"+GetFieldS(RO, k, "TXT"); fi;
       else
         k=SearchInArray(BufAcc, Buf[i], True);
         if k>0: Buf[i]=BufAcc[k]+"--"+BufTxt[k]; if StoreValue=BufAcc[k]: j=i; fi; fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 Finally
   CloseWorkArea(RO);
 end;
 nn=AlternateTree("Выберите счет кассы...", Buf, -1, j, 12, ".", "Счета", "Наименование", -1, False);
 if nn=0: ^StoreValue; fi;
 tmp=SubStr(Buf[nn], 1, 6);
 ClearVariable(Buf); ClearVariable(BufAcc); ClearVariable(BufTxt);
 nn=GetGroupAccounts("???.??.??.??.??.??.????.?."+tmp+".???", Buf, 11);
 СЧ_Касса_д=""; СЧ_Касса_к="";
 if nn=2: СЧ_Касса_д=Str(Min(Int(Buf[1]), Int(Buf[2]))); СЧ_Касса_к=Str(Max(Int(Buf[1]), Int(Buf[2]))); fi;
 ClearVariable(Buf);
 ^tmp;
end;

Func ВыборСчетаФинРез(StoreValue:String) :String;
var RO, nn, i, k, z, j :Integer;
var tmp :String;
 ClearVariable(Buf);
 nn=GetGroupAccounts("???.????.???????.???.?.???.??.???", Buf, 6, 7);
 if nn=0: Message("Нет счетов соотвествующих структуре учета!^M(КБК основанное на ФКР)^MПроверьте план счетов!", mtError); ^StoreValue; fi;
 i=1;
 while not Buf[i]="" do
   tmp=SubStr(Buf[i], 1, 4);
   if SearchInArray(Buf, tmp, True)=-1: InsertInArraySort(Buf, tmp); i=i+1; fi; --Добавление группы идет перед выбранным элементом (сортировка)
   i=i+1;
 od;
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???.??')");
 Try
   nn=Records(RO);
   if nn=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^StoreValue; fi;
   ClearVariable(BufAcc); ClearVariable(BufTxt);
   ShowProgress(nn, "Построение списка счетов...");
   Try
     for i=1 to nn do ProgressPos(i); BufAcc[i]=GetFieldS(RO, i, "CODE"); BufTxt[i]=GetFieldS(RO, i, "TXT"); od;
   Finally
     CloseProgress;
   end;
   SetFilter(RO, "NAME_VOC='СЧ' and Match(CODE,'???')");
   ShowProgress(nn, "Обработка счетов...");
   Try
     nn=LengthOfArray(Buf);
     for i=1 to nn do
       z=Length(Buf[i]);
       if SubStr(Buf[i], z, 1)=".":
         tmp=SubStr(Buf[i], 1, z-1);
         k=Search(RO, 1, tmp);
         if k>0: Buf[i]=Buf[i]+"--"+GetFieldS(RO, k, "TXT"); fi;
       else
         k=SearchInArray(BufAcc, Buf[i], True);
         if k>0: Buf[i]=BufAcc[k]+"--"+BufTxt[k]; if StoreValue=BufAcc[k]: j=i; fi; fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 Finally
   CloseWorkArea(RO);
 end;
 nn=AlternateTree("Выберите счет финансового результата...", Buf, -1, j, 12, ".", "Счета", "Наименование", -1, False);
 if nn=0: ^StoreValue; fi;
 tmp=SubStr(Buf[nn], 1, 6);
 ClearVariable(Buf); ClearVariable(BufAcc); ClearVariable(BufTxt);
 ^tmp;
end;

Func ВыборСчетовПогашенияАванса(StoreValue:String) :String;
var RO1, RO2, nn, i, k, z :Integer;
var tmp1, tmp2 :String;
 ClearVariable(Buf);
 nn=GetGroupAccounts("???.????.???????.???.?.???.??.???", Buf, 6, 7, 8);
 if nn=0: Message("Нет счетов соотвествующих структуре учета!^M(КБК основанное на ФКР)^MПроверьте план счетов!", mtError); ^StoreValue; fi;
 i=1;
 while not Buf[i]="" do
   tmp1=SubStr(Buf[i], 1, 4);
   tmp2=SubStr(Buf[i], 1, 7);
   if SearchInArray(Buf, tmp1, True)=-1: InsertInArraySort(Buf, tmp1); i=i+1; fi; --Добавление группы идет перед выбранным элементом (сортировка)
   if SearchInArray(Buf, tmp2, True)=-1: InsertInArraySort(Buf, tmp2); i=i+1; fi; --Добавление группы идет перед выбранным элементом (сортировка)
   i=i+1;
 od;
 RO1=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???.??.???')");
 RO2=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","1=0");
 Try
   nn=Records(RO1);
   if nn=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^StoreValue; fi;
   ClearVariable(BufAcc); ClearVariable(BufTxt);
   ShowProgress(nn, "Построение списка счетов...");
   Try
     for i=1 to nn do ProgressPos(i); BufAcc[i]=GetFieldS(RO1, i, "CODE"); BufTxt[i]=GetFieldS(RO1, i, "TXT"); od;
   Finally
     CloseProgress;
   end;
   SetFilter(RO1, "NAME_VOC='СЧ' and Match(CODE,'???.??')");
   SetFilter(RO2, "NAME_VOC='СЧ' and Match(CODE,'???')");
   ShowProgress(nn, "Обработка счетов...");
   Try
     nn=LengthOfArray(Buf);
     for i=1 to nn do
       z=Length(Buf[i]);
       if SubStr(Buf[i], z, 1)=".":
         tmp1=SubStr(Buf[i], 1, z-1);
         if z=4: k=Search(RO2, 1, tmp1); if k>0: Buf[i]=Buf[i]+"--"+GetFieldS(RO2, k, "TXT"); fi;
         |  z=7: k=Search(RO1, 1, tmp1); if k>0: Buf[i]=Buf[i]+"--"+GetFieldS(RO1, k, "TXT"); fi;
         fi;
       else
         k=SearchInArray(BufAcc, Buf[i], True);
         if k>0: Buf[i]=BufAcc[k]+"--"+BufTxt[k]; fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 Finally
   CloseWorkArea(RO1);
   CloseWorkArea(RO2);
 end;
 nn=AlternateTree("Выберите счет финансового результата...", Buf, -1, -1, 12, ".", "Счета", "Наименование", -1, True);
 if nn=0: ^StoreValue; fi;
 tmp1=SubStr(Buf[nn], 1, Pos("--", Buf[nn])-1);
 if Match(tmp1, "???.")   : tmp1="*.?."+tmp1+"??.???";
 |  Match(tmp1, "???.??."): tmp1="*.?."+tmp1+"???";
 else tmp1="*.?."+tmp1;
 fi;
 ClearVariable(Buf); ClearVariable(BufAcc); ClearVariable(BufTxt);
 nn=WordsCount(StoreValue, "|");
 for i=1 to nn do InsertInArraySort(BufTxt, ExtractWord(i, StoreValue, "|")); od;
 nn=LengthOfArray(BufTxt);
 if nn>0:
   for i=1 to nn do
     if not(Match(tmp1, BufTxt[i])) and not(Match(BufTxt[i], tmp1)): InsertInArraySort(Buf, BufTxt[i]); fi;
   od;
 fi;
 if SearchInArray(Buf, tmp1, True, 1)=-1: InsertInArraySort(Buf, tmp1); fi;
 nn=LengthOfArray(Buf);
 tmp2="";
 for i=1 to nn do tmp2=Объединить(tmp2, Buf[i], "|"); od;
 if nn>9 or Length(tmp2)>255:
   Message("Строка 'счета погашения авансов' превышает допустимый максимум!", mtError);
   ^StoreValue;
 fi;
 ^tmp2;
end;

Func ВыборЭКР(StoreЭКР:String) :String;
var i, k :Integer;
var tmp :String;
 ClearVariable(Buf);
 i=0; k=0;
 for Sign tmp="("+Раб.Бюджет2005.МаскаРасхКОСГУ+"|"+"КОСГУ.000)&КОСГУ.???", Sort do
   i=i+1;
   Buf[i]=SubStr(tmp,7,255)+" --"+Name_A(tmp);
   if StoreЭКР=SubStr(Buf[i],1,3): k=i; fi;
 od;
 i=0;
 i=Alternate("ЭКР", Buf, -1, k, 12);
 if i=0: ^StoreЭКР; fi;
 tmp=SubStr(Buf[i], 1, Pos(" --", Buf[i])-1);
 ^tmp;
end;

Func ВыборСправочникаРасходов(StoreValue:String) :String;
var tmp :String;
var nn :Integer;
 if СЧ_ПО="": Message("Не выбран счет расчетов с подотчетными лицами!", mtError); Template.Field="СЧ_ПО"; ^StoreValue; fi;
 tmp=РАБ.БЮДЖЕТ2005.СписокСправ("*.?."+СЧ_ПО+".??.???", 0, "МОЛ.*|П.*|П_ЛИМ.*|ФКР.*|КОСГУ.*");
 ClearVariable(Buf);
 CopyArray(РАБ.БЮДЖЕТ2005.BufСправ, Buf);
 nn=Alternate("Выберите справочник расходов ...", Buf, -1, -1, 12);
 if nn=0: ^StoreValue; fi;
 tmp=SubStr(Buf[nn], 1, Pos(" --", Buf[nn])-3);
 ^tmp;
end;

Func ВыборИФД(StoreИФД:String) :String;
var nn:Integer;
 ClearVariable(Buf);
 Buf[1]="Бюджетная деятельность";
 Buf[2]="Приносящая доход деятельность";
 Buf[3]="Очистить значение";
 nn=Alternate("Выберите источник финансирования деятельности", Buf, -1, Int(StoreИФД), 12);
 if nn=0: ^StoreИФД; fi;
 if nn=3: ^""; else ^Str(nn); fi;
end;

Func ВыборФКР(StoreФКР:String) :String;
var tmp :String;
 if ИФД="" : Message("Сначала выберите источник финансирования!", mtWarning); Template.Field="ИФД_"; ^StoreФКР; fi;
 if ИФД="1":            tmp=AnaElection("ФКР!&~ФКР.???.????.0000000.000!", False, False, "ФКР."+StoreФКР);
 |  ИФД="2" or ИФД="3": tmp=AnaElection("ФКР.???.0000.0000000.000!",       False, False, "ФКР."+StoreФКР);
 fi;
 if tmp="": ^StoreФКР; fi;
 tmp=SubStr(tmp, 5, 255);
 ^tmp;
end;

Func ВыборСтатьиРасхода(StoreValue:String) :String;
var tmp :String;
 if СПРАВ="": Message("Сначала выберите справочник статей расходов!", mtWarning); Template.Field="СПРАВ"; ^StoreValue; fi;
 tmp=AnaElection(СПРАВ+".*", False, False, СПРАВ+"."+StoreValue);
 if tmp="": ^StoreValue; fi;
 tmp=SubStr(tmp, Length(GetAnaGlossary(tmp))+2, 255);
 ^tmp;
end;

Proc ВыборДополнительнойАналитики;
var mask, tmp, Призн :String;
 if СЧ_ПО="": Message("Не выбран счет расчетов с подотчетными лицами!", mtError); Template.Field="СЧ_ПО"; Exit; fi;
 if СПРАВ="": Message("Не выбран справочник статей расходов!",          mtError); Template.Field="СПРАВ"; Exit; fi;
 if ВИДАНА:
   tmp=AnaElection("~(МОЛ.*|П.*|П_ЛИМ.*|ФКР.*|КОСГУ.*|"+СПРАВ+".*)");
 else
   РАБ.БЮДЖЕТ2005.PROGRESSENABLE=True;
   mask=РАБ.БЮДЖЕТ2005.СписокСправ("*.?."+СЧ_ПО+".??.???", 0, "МОЛ.*|П.*|П_ЛИМ.*|ФКР.*|КОСГУ.*|"+СПРАВ+".*");
   if mask="" : Message("Нет дополнительных аналитических признаков"+Chr(13)+"привязанных к счету "+СЧ_ПО+"!", mtInformation); Exit; fi;
   tmp=AnaElection(mask);
 fi;
 if tmp="": Exit; fi;
 Призн=РАБ.БЮДЖЕТ.ДобавитьПризнак(ДОП_АНА, tmp);
 ДОП_АНА=Раб.Бюджет2005.СортироватьНаборСлов(Призн," ",True);
end;

Proc ВнешнийВид(Field:String; nRow:Integer; nCol:Integer; USE:Logical);
var nn, цвFont, цвBack :Integer;
var ТЧ :Logical;
 nn=SearchInArray(BufField, Field, True);
 if nn<>-1:
   if USE and not(Защита):
     цвFont=BufColorFo[nn]; цвBack=BufColorBg[nn]; ТЧ=False;
   else
     цвFont=coBlack; цвBack=coTransparent; ТЧ=True;
   fi;
   СекцЗначПроч.Cell(nRow, nCol, CellFontColor, цвFont);
   СекцЗначПроч.Cell(nRow, nCol, CellBgColor  , цвBack);
   СекцЗначПроч.Cell(nRow, nCol, CellReadOnly , ТЧ);
 fi;
end;

2-- События полей
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
var tmp, mask :String;
var nn :Integer;
 Flag_onEnter=False;
 if Field="КНОК"      : if not(TemplateSaveOK): ^False; fi; Защита=True; EditorApply; Close; ^False;
 |  Field="КНЗКР"     : EditorCancel; Close; ^False;
 |  Field="АКТИВНЫ"   : СменитьАктивныеНастройки; ^False;
 |  Field="СЧ_ПО"     : СЧ_ПО  = ВыборСчетаПодотчета(СЧ_ПО);     ^False;
 |  Field="СЧ_СУТ"    : СЧ_СУТ = ВыборСубСчетаПодотчета(СЧ_СУТ); ^False;
 |  Field="СЧ_ТРН"    : СЧ_ТРН = ВыборСубСчетаПодотчета(СЧ_ТРН); ^False;
 |  Field="СЧ_КВР"    : СЧ_КВР = ВыборСубСчетаПодотчета(СЧ_КВР); ^False;
 |  Field="СУТ"       : СУТ=ВыборЭКР(СУТ); ^False;
 |  Field="ТРН"       : ТРН=ВыборЭКР(ТРН); ^False;
 |  Field="КВР"       : КВР=ВыборЭКР(КВР); ^False;
 |  Field="СЧ_КАССА"  : СЧ_Касса  = ВыборСчетаКассы(СЧ_Касса);      ^False;
 |  Field="СЧ_ПОГ_АВ_": Flag_onEnter=True; ^True;
 |  Field="СЧ_ФИНрез" : СЧ_ФИНрез=ВыборСчетаФинРез(СЧ_ФИНрез); ^False;
 |  Field="КИВФ"      : tmp=AnaElection("КИФД.*&~(КИФД.???.00.00.00.00.00.0000)");
                        if tmp="": ^False; fi;
                        КИВФ=SubStr(tmp, 10, 255);
                        ^False;
 |  Field="СПРАВ"     : СПРАВ=ВыборСправочникаРасходов(СПРАВ); ^False;
 |  Field="ИФД_"      : ИФД=ВыборИФД(ИФД); ^False;
 |  Field="ФКР"       : ФКР=ВыборФКР(ФКР); ^False;
 |  Field="СТ_РАСХ"   : СТ_РАСХ=ВыборСтатьиРасхода(СТ_РАСХ); ^False;
 |  Field="USE_ПЕРИОД": USE_ПЕРИОД=not(USE_ПЕРИОД); 
                        if USE_ПЕРИОД=False: ТЕК_ПЕРИОД=0; fi;
                        ВнешнийВид("ТЕК_ПЕРИОД", 6, 3, USE_ПЕРИОД); 
                        ^False;
 |  Field="ТЕК_ПЕРИОД": ClearVariable(Buf);
                        Buf[1]="не подставлять период операции";
                        Buf[2]="подставлять год+квартал операции";
                        Buf[3]="подставлять год операции";
                        nn=Alternate("", Buf, -1, 1, 12);
                        if nn<>0: ТЕК_ПЕРИОД=nn-1; fi;
                        ^False;
 |  Field="ВЫБОР_СЧ"  : ВЫБОР_СЧ=not(ВЫБОР_СЧ); ^False;
 |  Field="ВИДАНА"    : ВИДАНА=not(ВИДАНА);
                        if ВИДАНА=False:
                          РАБ.БЮДЖЕТ2005.PROGRESSENABLE=True;
                          mask=РАБ.БЮДЖЕТ2005.СписокСправ("*.?."+СЧ_ПО+".??.???", 0, "МОЛ.*|П.*|П_ЛИМ.*|ФКР.*|КОСГУ.*|"+СПРАВ+".*");
                          if mask="": ДОП_АНА=""; ^False; fi;
                          ShowProgress(1, "Анализ аналитических признаков...");
                          Try 
                            ProgressPos(1);
                            ДОП_АНА=Раб.Бюджет2005.ПривестиВСоотвНаборСлов(ДОП_АНА," ",mask,"|");
                          Finally
                            CloseProgress;
                          end;
                        fi;
                        ^False;
 |  Field="ДОП_АНА_"  : ВыборДополнительнойАналитики; ^False;
 |  Field="П1"        : СЧ_ПО="208"; СЧ_СУТ="12"; СЧ_ТРН="22"; СЧ_КВР="26"; СЧ_ПО_д="560"; СЧ_ПО_к="660"; ^False;
 |  Field="П2"        : СУТ="212"; ^False;
 |  Field="П3"        : ТРН="222"; ^False;
 |  Field="П4"        : КВР="226"; ^False;
 |  Field="П5"        : СЧ_Касса="201.34"; СЧ_Касса_д="510";  СЧ_Касса_к="610"; ^False;
 |  Field="П6"        : СЧ_ПОГ_АВ="*.?.105.??.340|*.?.106.??.3?0|*.?.201.35.510|*.?.302.1?.830|*.?.302.6?.830|*.?.304.03.830|*.?.304.05.2??|*.?.304.05.3??|*.?.401.20.2??"; ^False;
 |  Field="П7"        : СЧ_ФИНрез="401.20"; ^False;
 |  Field="П8"        : КИВФ="01.05.02.01.01.0000"; ^False;
 |  Field="П9"        : СПРАВ="ВКЛ"; ^False;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="СЧ_ПО"      : if СЧ_ПО="": СЧ_СУТ=""; СЧ_ТРН=""; СЧ_КВР=""; СЧ_ПО_д=""; СЧ_ПО_к=""; fi;
 |  Field="СЧ_Касса"   : if СЧ_Касса="": СЧ_Касса_д=""; СЧ_Касса_к=""; fi;
 |  Field="СПРАВ"      : if СПРАВ="": СТ_РАСХ=""; fi;
 |  Field="ИФД_"       : if ИФД="": ФКР=""; fi;
 |  Field="СЧ_ПОГ_АВ_" : if Flag_onEnter=False: СЧ_ПОГ_АВ=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(СЧ_ПОГ_АВ, "|"); fi;
 |  Field="ДОП_АНА_"   : ДОП_АНА=РАБ.БЮДЖЕТ2005.УдалитьСловоИзНабора_Диалог(ДОП_АНА, " ");
 fi;
 Flag_onEnter=False;
end;

Func Field_OnValidateS(Field:String; Iter:Integer; Value:String) :Logical;
var nn, i, num : Integer;
var Res :Numeric;
var tmp :String;
 if Field="СЧ_ПОГ_АВ_":
   if Pos("&", Value)>0: Message("Символ '&' недопустим!", mtError); ^False; fi;
   if Pos("!", Value)>0: Message("Символ '!' недопустим!", mtError); ^False; fi;
   if Pos("~", Value)>0: Message("Символ '~' недопустим!", mtError); ^False; fi;
   if Pos("(", Value)>0: Message("Символ '(' недопустим!", mtError); ^False; fi;
   if Pos(")", Value)>0: Message("Символ ')' недопустим!", mtError); ^False; fi;
   Try Res=Saldo(Value, 1.1.100); Except Raise; ^False; end;
   ClearVariable(Buf);
   nn=WordsCount(Value, "|");
   for i=1 to nn do InsertInArraySort(Buf, ExtractWord(i, Value, "|")); od;
   nn=LengthOfArray(Buf);
   for i=1 to nn do
     tmp=Buf[i];
     while Pos("*", tmp)>0 do
       num=Pos("*", tmp);
       tmp=Delete(tmp, num, 1);
       tmp=Insert("???.????.???????.???", tmp, num);
     end;
     if not(Match(tmp, "???.????.???????.???.?.???.??.???")):
       Message(Buf[i]+" не соответствует требуемой структуре счета [ФКР]!"+Chr(13)+
               "Требуется ввести маску счета вида:"+Chr(13)+
               "???.????.???????.???.?.???.??.???"+Chr(13)+
               "или"+Chr(13)+
               "*.?.???.??.???", mtError);
       ^False;
     fi;
   od;
   if Length(Value)>255: Message("Строка 'счета погашения авансов' превышает 255 символов!", mtError); ^False; fi;
   СЧ_ПОГ_АВ=Value;
 fi;
 ClearVariable(Buf);
 ^True;
end;

Func Погашение_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
 Template.HideEditor(False);
 СЧ_ПОГ_АВ=ВыборСчетовПогашенияАванса(СЧ_ПОГ_АВ);
 ^"";
end;

2-- События объектов
Proc cbЗащита_onChange(Sender:String);
var УжеРаботаем, Flag, SaveOK :Logical;
var n :Integer;
 if Защита=False:
    SaveOK=True; -- если защита 'снимается' значит проверка данных уже производилась
    n=EnqOkCancel("Сделать документ доступным для изменений?", mtConfirmation);
    if n=cmCancel: Flag=True; else Flag=False; fi;
   else
    SaveOK=TemplateSaveOK; Flag=SaveOK;
 fi;
 Защита=Flag; cbЗащита.State=Защита;
 УжеРаботаем=ПодсистемаРаботает;
 ПодсистемаУжеРаботает(УжеРаботаем, Flag);
 ТолькоЧтение(Flag);
 ВидимостьОбъектов(УжеРаботаем);
 ВнешнийВид("ТЕК_ПЕРИОД", 6, 3, USE_ПЕРИОД);
 if УжеРаботаем: СекцMsg.Visible=True; else СекцMsg.Visible=False; fi;
 if not(SaveOK): Exit; fi; -- Избегаем двойных сообщений
 EditorApply;
end;

Proc cbКлючевые_onChange(Sender:String);
var F :Logical;
 F=ПодсистемаРаботает;
 ПодсистемаУжеРаботает(F, Защита);
 ТолькоЧтение(Защита);
 ВнешнийВид("ТЕК_ПЕРИОД", 6, 3, USE_ПЕРИОД);
 if F: СекцMsg.Visible=True; else СекцMsg.Visible=False; fi;
 СекцЗначКлюч.Visible = Ключевые;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var Co :Integer;
 Co=РАБ.УПП.LIB.Цвет(236, 233, 216);
 ЦветаПолей(Co);
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("ПОДОТЧ")+"\Настройки\","RPO_STD_000.cfg"); -- стандартная настройка
 СекцОбщая.Cell(2, 2, CellBgColor, Co);
 СекцОбщая.Cell(2, 5, CellBgColor, Co);
 EnableCommands(False, cmInsertRec, cmDublRec, cmDelRec);
end;

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

Proc Template_onRead; -- при считывании шаблона
var F :Logical;
 Очистить;
 if NewREC: Защита=False; Инициализация; fi;
 if ModalMode: Защита=False; fi;
 if ModalMode: Message("Настройка констант подсистемы!", mtInformation); fi;
 F=ПодсистемаРаботает;
 if F: Ключевые=False; else Ключевые=True; fi;
 cbКлючевые.State=Ключевые;
 ПодсистемаУжеРаботает(F, Защита);
 ТолькоЧтение(Защита);
 ВнешнийВид("ТЕК_ПЕРИОД", 6, 3, USE_ПЕРИОД);
 if F: СекцMsg.Visible=True; else СекцMsg.Visible=False; fi;
 СекцЗначКлюч.Visible = Ключевые;
 Template.Field="кнЗкр";
end;

Proc Template_onCancel; -- при отмене редактирования шаблона
 Очистить;
 if CurrentState=CrdusUndefined:
   Message("Была произведена отмена редактирования!^MВ картотеке нет записей, бланк будет закрыт.", mtInformation);
   Close;
 fi;
end;

Func Template_OnValidate: Logical; -- при проверке шаблона
var n :Integer;
var F :Logical;
 if NewREC and not(Защита): if not(TemplateSaveOK): ^False; fi; fi;
 if not(NewREC): if not(TemplateSaveOK): ^False; fi; fi;
 if NewREC and not(Защита):
   n=EnqOkCancel("Защитить данный документ от изменений?", mtConfirmation);
   if n=cmOk: 
     Защита=True;
     cbЗащита.State=Защита;
     F=ПодсистемаРаботает;
     ПодсистемаУжеРаботает(F, Защита);
     ТолькоЧтение(Защита);
     ВнешнийВид("ТЕК_ПЕРИОД", 6, 3, USE_ПЕРИОД);
   fi;
 fi;
 ^True;
end;

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