БЛАНКСШАБЛОНОМ "Ведомость выдачи материалов и ОС списываемых при выдаче в эксплуатацию на нужды учреждения", РЕДАКТОР РПО_ВЕДОМОСТЬ_МАТ;

ИМЯБЛАНКА     :String="Ведомость выдачи мат.ценнностей на нужды учреждения";
BTNNAME_MENU  :String="форма ОКУД 0504210";
2-- Объекты
lblWarning  :Object;
cb_Защита   :Object;
cb_Нстрка   :Object;
btnOkey     :Object;
btnExit     :Object;
btnPrnt     :Object;
btnUpdt     :Object;
btnGoTo     :Object;
скцНстрка   :Object;
cb_БАЛ105   :Object;
cb_ЗАБ105   :Object;
cb_БАЛ101   :Object;
cb_ЗАБ101   :Object;
cb_МОЛкакФ  :Object;
S1:Object;
S2:Object;
S3:Object;
S4:Object;
S5:Object;
S6:Object; -- Бухгалтерская запись
S7:Object;
S8_1:Object; -- Выдано - колонки НФА
S8:Object; -- Выдано - колонки НФА
S9:Object; -- Выдано - строки МОЛ
var numSecTmpl:Integer=9;

2-- Переменные
var AA          :String="+";
var DD          :String="-";
var recCurrent  :Record;
var NewREC      :Logical=(CurrentState=crdusInserted);
var First       :Logical;
var SelfCRD     :String="РПО_ВЕДОМОСТЬ_МАТ";
var SelfBln     :String="НФА.ДОКУМЕНТЫ.ВЕДОМОСТИ.ОКУД_0504210";
var НастрGUID   :String;
var Дза_        :Date=Дза;

var DefINI      :String="Восстановить настройки по умолчанию";
var flgНстрка   :Logical=[False];
var ПолнНаим    :Logical=[False];
var ДолжнРук    :Logical=[False];
var defБАЛ105   :Logical=[True];
var defЗАБ105   :Logical=[True];
var defБАЛ101   :Logical=[False];
var defЗАБ101   :Logical=[False];
var defМОЛкакФ  :Logical=[False];

var Buf[]      :String;

var BufField[] :String;
var BufClrFo[] :Integer;
var BufClrBg[] :Integer;

var УслДЕБ[] :String;
var УслКРЕ[] :String;
var LSTИНВ[] :String; -- инвентарные объекты
var LSTСЧТ[] :String; -- счета учета

var ФИО_Н_     []:String  = Trim(Name_A(КОЛФИО[$].ФИО_КОД));
var КС_        []:String  = Str($);
var НомСтолб   []:Integer = $+2;
var Мат_Код_   []:String  = КОЛМАТ[$].Мат_Код;
var Мат_Н_     []:String  = КОЛМАТ[$].Мат_Н;
var ЕдИзм_Н_   []:String  = КОЛМАТ[$].ЕдИзм_Н;
var ЕдИзм_Код_ []:String  = КОЛМАТ[$].ЕдИзм_Код;
var Цена_      []:Numeric = КОЛМАТ[$].Цена;
var Выдано_    []:Numeric;

2-- Процедуры и функции

Func XY_I16(X:Integer; Y:Integer) :Integer; -- X и Y по 65535
 ^(X + BitShl(Y, 16));
end;

Func GetX_I16(I16:Integer) :Integer;
 ^BitAnd(I16, 65535);
end;

Func GetY_I16(I16:Integer) :Integer;
 ^BitShr(I16, 16);
end;

Func XYtoReal(X:Integer; Y:Integer) :Integer;
 if X<1 or Y<1: ^0; fi;
 ^Int((Y-1)*КолМАТ+X);
end;

Proc ОбновитьВыдано;
var ii, xx, yy, pp :Integer;
 ClearVariable(Выдано_);
 if КОЛФИО_ВЫДАНО>0:
   for ii=1 to КОЛФИО_ВЫДАНО do
     pp=КОЛФИО_ВЫДАНО[ii].МАТ_ФИО;
     xx=GetX_I16(pp);
     yy=GetY_I16(pp);
     Выдано_[XYtoReal(xx, yy)]=КОЛФИО_ВЫДАНО[ii].Выдано;
   od;
 fi;
end;

Func ВзятьВыдано_МАТ_ФИО(xx:Integer; yy:Integer) :Numeric;
var pp :Integer;
 if xx<1 or yy<1: ^0.00; fi;
 pp=SearchInArray(КОЛФИО_ВЫДАНО[].МАТ_ФИО, XY_I16(xx, yy));
 if pp<1: ^0.00; else ^КОЛФИО_ВЫДАНО[pp].Выдано; fi;
end;

Func СуммаСтолбца(Iter:Integer) :Numeric;
var SUM :Numeric;
var ii :Integer;
 if Iter<1: ^0.00; fi;
 SUM=0.00;
 for ii=1 to КолФИО do SUM=SUM+ВзятьВыдано_МАТ_ФИО(Iter, ii); od;
 ^SUM;
end;

var Итого[] :Numeric = СуммаСтолбца($);
var Сумма[] :Numeric = КОЛМАТ[$].Цена*Итого[$];

Proc НастройкаОтчета(toSave:Logical);

 if НастрGUID="" or toSave: НастрGUID=GetGUID; fi;
 if РАБ.НАСТР.НАЧАТЬ(SelfBln, 0, 0, "", НастрGUID):
   РАБ.НАСТР.ДОБАВИТЬ("ПОЛННАИМ"   , "L");
   РАБ.НАСТР.ДОБАВИТЬ("ДОЛЖНРУК"   , "L");
   РАБ.НАСТР.ДОБАВИТЬ("defБАЛ105"  , "L");
   РАБ.НАСТР.ДОБАВИТЬ("defЗАБ105"  , "L");
   РАБ.НАСТР.ДОБАВИТЬ("defБАЛ101"  , "L");
   РАБ.НАСТР.ДОБАВИТЬ("defЗАБ101"  , "L");
   РАБ.НАСТР.ДОБАВИТЬ("defМОЛКАКФ" , "L");
   if toSave:
     РАБ.НАСТР.СОХРАНИТЬ;
   else
     НастрGUID=РАБ.НАСТР.ЗАГРУЗИТЬ("", "");
     if НастрGUID="": if ProcExists("ВосстановитьНастройкиПоУмолчанию"): ExecuteProc("ВосстановитьНастройкиПоУмолчанию"); fi; fi;
   fi;
 fi;

end;

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(УслДЕБ);
 ClearVariable(УслКРЕ);
 ClearVariable(LSTИНВ);
 ClearVariable(LSTСЧТ);
 --
 ClearVariable(ФИО_Н_     );
 ClearVariable(КС_        );
 ClearVariable(НомСтолб   );
 ClearVariable(Мат_Код_   );
 ClearVariable(Мат_Н_     );
 ClearVariable(ЕдИзм_Н_   );
 ClearVariable(ЕдИзм_Код_ );
 ClearVariable(Цена_      );
 --
 ClearVariable(Выдано_);
 ClearVariable(Итого);
 ClearVariable(Сумма);
end;

Proc СформированИзДНФА;
var CRDwork :String;
var REC :Record;
var OK :Logical;
 OK=False; REC=NIL;
 if CRD<>"" and RECCRD<>0 : REC=IntegerToRecord(RECCRD); CRDwork = CRD               ;
 | True:                    REC=IntegerToRecord(ДНФАID); CRDwork = "РПО_ОПЕРАЦИИДНФА";
 fi;
 if REC<>NIL: OK=RecordExists(CRDwork, REC); fi;
 if Защита: btnUpdt.Enabled=False; else btnUpdt.Enabled=OK; fi;
 btnGoTo.Visible=OK;
 lblWarning.Caption = "Данный документ сформирован не из журнала операций с НФА."+Chr(13)+"Расчет производиться не будет.";
 lblWarning.Visible = not OK;
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="ДЗА" : ^ДЗА;
 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;
 fi;
end;

Proc Iter_Validation;
var nn :Integer;
 if КолБухЗап<1: Try nn=InsertFrame(КолБухЗап, 1); Except end; fi;
end;

Proc УдалитьПустые;
var nn :Integer;
 nn=1;
 while nn<=КолБухЗап do if КолБухЗап[nn].БухДеб="" or КолБухЗап[nn].БухКре="": Try DeleteFrame(КолБухЗап, nn); Except end; else nn=nn+1; fi; od;
 Iter_Validation;
end;

Func TemplateSaveOK :Logical;
 УдалитьПустые;
 ^True;
end;

Proc ЦветаПолей;
var nn, len, sysTxt, sysObj :Integer;
 sysTxt=РАБ.ЦВЕТА.GetColor("coBtnText");
 sysObj=РАБ.ЦВЕТА.GetColor("coBtnFace");
 ClearVariable(BufField); ClearVariable(BufClrBg); ClearVariable(BufClrFo);
 nn=InsertInArraySort(BufField,"РУК_ДОЛЖН");        InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"РУК");              InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ДУТВ");             InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ДЗА");              InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"УЧР_Н");            InsertInArray(BufClrBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ПОДР_Н");           InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"МОЛ_Н");            InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"БУХДЕБ");           InsertInArray(BufClrBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"БУХКРЕ");           InsertInArray(BufClrBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"AA");               InsertInArray(BufClrBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"DD");               InsertInArray(BufClrBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"ГЛБУХ");            InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"МАТВЫДАЛ_ДОЛЖН");   InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"МАТВЫДАЛ");         InsertInArray(BufClrBg,nn,coAqua);
 --
 nn=InsertInArraySort(BufField,"ФИО_Н_");           InsertInArray(BufClrBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ВЫДАНО_");          InsertInArray(BufClrBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ЦЕНА_");            InsertInArray(BufClrBg,nn,coAqua);
 len=LengthOfArray(BufField);
 for nn=1 to len do
   if BufClrBg[nn]=coTeal: BufClrFo[nn]=coWhite;
   |  BufClrBg[nn]=sysObj: BufClrFo[nn]=sysTxt;
   |  True:                BufClrFo[nn]=coBlack;
   fi;
 od;
end;

Proc ТолькоЧтение(Flag:Logical);
var kk, ii, jj, rk, ck, цвFont, цвBack, pp :Integer;
var Value :String;
var Obj :Object;
var ТЧ :Logical;
 if numSecTmpl>0:
   ShowProgress(numSecTmpl, "Обработка данных...");
   Try
     for kk=1 to numSecTmpl do
       ProgressPos(kk);
       if FindObject("S"+Str(kk), Obj):
         rk=asInteger(Obj.RowsCount);
         ck=asInteger(Obj.ColsCount);
         for ii=1 to rk do
           for jj=1 to ck do
             Value=Up(asString(Obj.Cell(ii, jj, CellContents, "")));
             if Match(Value, "ФИО_Н_[*"  ): Value="ФИО_Н_";
             |  Match(Value, "ВЫДАНО_[*" ): Value="ВЫДАНО_";
             |  Match(Value, "ЦЕНА_[*"   ): Value="ЦЕНА_";
             fi;
             pp=SearchInArray(BufField, Value, True);
             if pp>0:
               if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=BufClrFo[pp]; цвBack=BufClrBg[pp]; ТЧ=False; fi;
               Obj.Cell(ii, jj, CellFontColor, цвFont);
               Obj.Cell(ii, jj, CellBgColor,   цвBack);
               Obj.Cell(ii, jj, CellReadOnly,  ТЧ);
             fi;
           od;
         od;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 fi;
    btnOkey.Enabled = not Flag;
    btnUpdt.Enabled = not Flag;
  cb_БАЛ105.Enabled = not Flag;
  cb_ЗАБ105.Enabled = not Flag;
  cb_БАЛ101.Enabled = not Flag;
  cb_ЗАБ101.Enabled = not Flag;
 cb_МОЛкакФ.Enabled = not Flag;
end;

Proc AddLastCol;
var numCol, numRow, ii,cw :Integer;
 cw=220;
 numCol=AsInteger(S8.ColsCount)+1;
 S8.ColsCount=numCol;
 S9.ColsCount=numCol;
 S8.Column(numCol, ColWidth, cw);
 S9.Column(numCol, ColWidth, cw);

-- S8.CellLinks(1, 1, numCol, 1);
-- S8.Cell(1, numCol, CellBorder,    "0,0,0,1");
-- S8.Cell(1, numCol, CellContents,  "Форма 0504210 с. 2");
-- S8.Cell(1, numCol, CellAlignment, 1);

-- S8.Cell(2, numCol, CellBorder,    "1,1,0,1");
-- S8.CellLinks(numCol, 2, numCol, 5);

 S8.Cell(4, numCol, CellBorder,    "1,1,0,1");
 S8.Cell(4, numCol, CellContents,  "Расписка в получении");
 S8.Cell(4, numCol, CellAlignment, 2);
 S8.Cell(4, numCol, CellFontSize,  8);

 S8.Cell(5, numCol, CellBorder,    "1,1,0,1");
 S8.Cell(5, numCol, CellContents,  Str(numCol-1));
 S8.Cell(5, numCol, CellAlignment, 2);
 S8.Cell(5, numCol, CellFontSize,  8);

-- S9.Cell(1, numCol, CellBorder,    "1,1,0,1");
-- S9.Cell(3, numCol, CellBorder,    "1,1,0,1");
-- S9.Cell(4, numCol, CellBorder,    "1,1,0,1");

 numRow=AsInteger(S8.RowsCount);
 for ii=6 to numRow do
   S8.Cell(ii, numCol, CellBorder, "1,1,0,1");
 od;
 numCol=AsInteger(S8_1.ColsCount);
 S8_1.Column(numCol, ColVisible, true);
 S8_1.Column(numCol, ColWidth, cw);
-- S8_1.Cell(1, numCol, CellBorder,    "0,0,0,1");
-- S8_1.Cell(1, numCol, CellContents,  "Форма 0504210 с.2");
-- S8_1.Cell(1, numCol, CellAlignment, 1);


end;

Proc AddNeedRows;
var CW,CW_1, FontSel, BackSel, AlgnSel, FontEnt, BackEnt, AlgnEnt, offCol, defRow, defCol, ii, jj,ii_1 :Integer;
var фрмтКол, фрмтЦен,tmps :String;
 tmps=AsString(Шаблон.Name);
 if tmps='S8' or tmps='S8_1' or tmps='S9':
    шаблон.Column=1;
    шаблон.Row=1;
 fi;
 offCol=3;
 defRow=6;        -- first S8.RowsCount
 defCol=offCol+1; -- first S8.ColsCount

 CW=AsInteger(S8.Column(defCol, ColWidth, ""));
 CW_1=AsInteger(S8_1.Column(defCol, ColWidth, ""));
 FontSel=AsInteger(S8.Cell(defRow, offCol-2, CellFontColor, ""));
 BackSel=AsInteger(S8.Cell(defRow, offCol-2, CellBgColor,   ""));
 AlgnSel=AsInteger(S8.Cell(defRow, offCol-2, CellAlignment, ""));
 FontEnt=AsInteger(S8.Cell(defRow, offCol+1, CellFontColor, ""));
 BackEnt=AsInteger(S8.Cell(defRow, offCol+1, CellBgColor,   ""));
 AlgnEnt=AsInteger(S8.Cell(defRow, offCol+1, CellAlignment, ""));
 фрмтКол= AsString(S8.Cell(defRow, offCol+1, CellFormat,    ""));
 фрмтЦен= AsString(S9.Cell(     3, offCol+1, CellFormat,    ""));

 ii_1=AsInteger(S8_1.ColsCount);
 for ii=defCol to ii_1 do
   S8_1.Column(ii, ColVisible, false);
 od;

 ii=AsInteger(S8.ColsCount);
-- S8.CellLinks(ii, 2, -1, -1);

 if КолФИО<1: InsertFrame(КолФИО, 1); fi;
 if КолМАТ<1: InsertFrame(КолМАТ, 1); fi;

 S8.RowsCount=defRow+КолФИО-1;
 S8.ColsCount=defCol+КолМАТ-1;
 S9.ColsCount=defCol+КолМАТ-1;

 for ii=defCol to (КолМАТ+offCol) do

   S8.Column(ii, ColWidth, CW);
   S9.Column(ii, ColWidth, CW);

   -- основная ведомость
   S8.Cell(defRow, ii, CellBorder,    "1,1,1,1");
   S8.Cell(defRow, ii, CellFieldType, cftNumericField);
   S8.Cell(defRow, ii, CellContents,  "Выдано_["+Str(ii-offCol)+"]");
   S8.Cell(defRow, ii, CellAlignment, AlgnEnt);
   S8.Cell(defRow, ii, CellFontColor, FontEnt);
   S8.Cell(defRow, ii, CellBgColor,   BackEnt);
   S8.Cell(defRow, ii, CellFormat,    фрмтКол);

   -- итоги ведомости
   S9.Cell(1, ii, CellBorder,    "1,1,1,1");
   S9.Cell(1, ii, CellFieldType, cftNumericField);
   S9.Cell(1, ii, CellContents,  "Итого["+Str(ii-offCol)+"]");
   S9.Cell(1, ii, CellAlignment, AlgnEnt);
   S9.Cell(1, ii, CellFormat,    фрмтКол);
   S9.Cell(1, ii, CellReadOnly,  True);
   S9.Cell(1, ii, CellFontSize,  8);

   S9.Cell(3, ii, CellBorder,    "1,1,1,1");
   S9.Cell(3, ii, CellFieldType, cftNumericField);
   S9.Cell(3, ii, CellContents,  "Цена_["+Str(ii-offCol)+"]");
   S9.Cell(3, ii, CellAlignment, AlgnEnt);
   S9.Cell(3, ii, CellFontColor, FontEnt);
   S9.Cell(3, ii, CellBgColor,   BackEnt);
   S9.Cell(3, ii, CellFormat,    фрмтЦен);
   S9.Cell(3, ii, CellFontSize,  7);

   S9.Cell(4, ii, CellBorder,    "1,1,1,1");
   S9.Cell(4, ii, CellFieldType, cftNumericField);
   S9.Cell(4, ii, CellContents,  "Сумма["+Str(ii-offCol)+"]");
   S9.Cell(4, ii, CellAlignment, AlgnEnt);
   S9.Cell(4, ii, CellFormat,    фрмтЦен);
   S9.Cell(4, ii, CellReadOnly,  True);
   S9.Cell(4, ii, CellFontSize,  7);

   -- материалы
   ii_1=(ii-defCol)*3+defCol;
   S8_1.Column(ii_1  , ColVisible, true);
   S8_1.Column(ii_1+1, ColVisible, true);
   S8_1.Column(ii_1+2, ColVisible, true);
   S8_1.Column(ii_1  , ColWidth, CW_1);
   S8_1.Column(ii_1+1, ColWidth, CW_1);
   S8_1.Column(ii_1+2, ColWidth, CW_1);

   S8_1.Cell(2, ii_1, CellBorder,    "1,1,0,1");
   S8_1.Cell(2, ii_1, CellFieldType, cftStaticText);
   tmps=SubStr(Мат_Н_[ii-offCol],1,37);
   if tmps='':tmps=' ';fi;
   S8_1.Cell(2, ii_1, CellContents,  tmps);
   S8_1.Cell(2, ii_1, CellAlignment, 0);
   S8_1.Cell(2, ii_1, CellFontColor, coNavy);
   S8_1.Cell(2, ii_1, CellFontSize,  8);

   S8_1.Cell(2, ii_1+1, CellBorder,    "0,1,1,1");
   S8_1.Cell(2, ii_1+1, CellFieldType, cftStaticText);
   tmps=SubStr(Мат_Н_[ii-offCol],38,255);
   if tmps='':tmps=' ';fi;
   S8_1.Cell(2, ii_1+1, CellContents, tmps );
   S8_1.Cell(2, ii_1+1, CellAlignment, 0);
   S8_1.Cell(2, ii_1+1, CellFontColor, coNavy);
   S8_1.Cell(2, ii_1+1, CellFontSize,  8);

   S8_1.Cell(2, ii_1+2, CellBorder,    "1,1,1,1");
   S8_1.Cell(2, ii_1+2, CellFieldType, cftStringField);
   S8_1.Cell(2, ii_1+2, CellContents,  "Мат_Код_["+Str(ii-offCol)+"]");
   S8_1.Cell(2, ii_1+2, CellAlignment, 1);
   S8_1.Cell(2, ii_1+2, CellReadOnly,  True);
   S8_1.Cell(2, ii_1+2, CellFontSize,  8);
   S8_1.Cell(2, ii_1+2, CellFontColor, coBlack);

   S8.Cell(1, ii, CellBorder,    "1,1,1,1");
   S8.Cell(1, ii, CellFieldType, cftStringField);
   S8.Cell(1, ii, CellContents,  "ЕдИзм_Н_["+Str(ii-offCol)+"]");
   S8.Cell(1, ii, CellAlignment, 2);
   S8.Cell(1, ii, CellReadOnly,  True);
   S8.Cell(1, ii, CellFontSize,  8);

   S8.Cell(2, ii, CellBorder,    "1,1,1,1");
   S8.Cell(2, ii, CellFieldType, cftStringField);
   S8.Cell(2, ii, CellContents,  "ЕдИзм_Код_["+Str(ii-offCol)+"]");
   S8.Cell(2, ii, CellAlignment, 2);
   S8.Cell(2, ii, CellReadOnly,  True);
   S8.Cell(2, ii, CellFontSize,  8);

   S8.Cell(4, ii, CellBorder,    "1,1,1,1");
   S8.Cell(4, ii, CellContents,  "выдано");
   S8.Cell(4, ii, CellAlignment, 2);

   S8.Cell(5, ii, CellBorder,    "1,1,1,1");
   S8.Cell(5, ii, CellFieldType, cftStringField);
   S8.Cell(5, ii, CellContents,  "НомСтолб["+Str(ii-offCol)+"]");
   S8.Cell(5, ii, CellAlignment, 2);
   S8.Cell(5, ii, CellReadOnly,  True);
   S8.Cell(5, ii, CellFontSize,  8);

 od;

 for ii=defRow to (defRow+КолФИО-1) do
   S8.Cell(ii, offCol-2, CellBorder,       "1,1,1,1");
   S8.Cell(ii, offCol-2, CellFieldType,    cftStringField);
   S8.Cell(ii, offCol-2, CellContents,     "ФИО_Н_["+Str(ii-defRow+1)+"]");
   S8.Cell(ii, offCol-2, CellAlignment,    AlgnSel);
   S8.Cell(ii, offCol-2, CellFontColor,    FontSel);
   S8.Cell(ii, offCol-2, CellBgColor,      BackSel);
   S8.Cell(ii, offCol-2, CellEventOnEnter, "FIELD_ONENTER");
   S8.Cell(ii, offCol-2, CellFontSize,  8);
--   S8.CellLinks(offCol-2, ii, offCol-1, ii);

   S8.Cell(ii, offCol-1, CellBorder,       "1,1,1,1");
   S8.Cell(ii, offCol-1, CellFieldType,    cftStringField);
   S8.Cell(ii, offCol-1, CellContents,     "КС_["+Str(ii-defRow+1)+"]");
   S8.Cell(ii, offCol-1, CellAlignment,    2);
   S8.Cell(ii, offCol-1, CellReadOnly,     True);
   S8.CellLinks(offCol-1, ii, offCol, ii);

   for jj=defCol to (КолМАТ+offCol) do
     S8.Cell(ii, jj, CellBorder,    "1,1,1,1");
     S8.Cell(ii, jj, CellFieldType, cftNumericField);
     S8.Cell(ii, jj, CellContents,  "Выдано_["+Str(XYtoReal(jj-offCol, ii-defRow+1))+"]");
     S8.Cell(ii, jj, CellAlignment, AlgnEnt);
     S8.Cell(ii, jj, CellFontColor, FontEnt);
     S8.Cell(ii, jj, CellBgColor,   BackEnt);
     S8.Cell(ii, jj, CellFormat,    фрмтКол);
   od;

 od;
 S8.CellLinks(offCol+1, 4, КолМАТ+offCol, 4);

end;

Proc ВнешнийВидБланка_Обновить;
 AddNeedRows;
 AddLastCol;
 ОбновитьВыдано;
end;

Proc ВнешнийВидДолжностьРуководителя_Обновить(Нужно:Logical; ФЗ:Logical);
 if Нужно:
   S2.Cell(2, 2, CellFieldType, cftStringField);
   S2.Cell(2, 2, CellFontColor, coBlack);
   S2.Cell(2, 2, CellBgColor,   if(ФЗ, coTransparent, coAqua));
   S2.Cell(2, 2, CellBorder,    "0,0,0,1");
   S2.Cell(2, 2, CellContents,  "РУК_ДОЛЖН");
   S2.Cell(2, 2, CellAlignment, 2);
   S2.Cell(2, 2, CellLookup,    True);
   S2.Cell(3, 2, CellContents,  "(должность)", True);
   S2.Cell(2, 2, CellReadOnly,  if(ФЗ, True, False));
 else
   S2.Cell(2, 2, CellFieldType, cftStaticText);
   S2.Cell(2, 2, CellFontColor, coBlack);
   S2.Cell(2, 2, CellBgColor,   coTransparent);
   S2.Cell(2, 2, CellBorder,    "0,0,0,0");
   S2.Cell(2, 2, CellContents,  "Руководитель:", True);
   S2.Cell(2, 2, CellAlignment, 1);
   S2.Cell(2, 2, CellLookup,    False);
   S2.Cell(3, 2, CellContents,  "", True);
 fi;
end;

Proc ОчисткаОтчета;
 Очистить;
 ClearVariable(КолФИО_ВЫДАНО);
 ClearVariable(КолФИО);
 ClearVariable(КолМАТ);
 ClearVariable(КолБухЗап);
 ПОДР_Н=""; ПОДР="";
  МОЛ_Н="";  МОЛ="";
 Iter_Validation;
 ВнешнийВидБланка_Обновить;
end;

Proc ВзятьРеквизиты(ПолноеНАИМ:Logical; Auto:Logical);
var REC, SaveREC :Record;
var RO, num :Integer;
var Work :Logical;
 Work=False;
 RefreshAna;
 if УЧР<>"": Try SaveREC=SignToRecord(УЧР, False); Except SaveREC=NIL; end; fi;
 RO=OpenWorkArea("КОНТРАГЕНТ", "", "1=0");
 Try
   if Auto:
     if Trim(Учр_Н)="":
       SetFilter(RO, "НАШЕ");
       num=Records(RO);
       if num<1: REC=NIL;
       |  num=1: REC=GetRecordKey(RO, 1);
       |  num>1: REC=GetRecordKey(RO, 1);
                 SetFilter(RO, "НАШЕ and РПО_УМОЛЧАНИЕ");
                 if Records(RO)>0: REC=GetRecordKey(RO, 1); fi;
       fi;
       if REC=NIL and saveREC<>NIL: REC=saveREC; fi;
       if REC<>NIL:
         SetFilter(RO, "UKey="+RecordToString(REC));
         if Records(RO)=1: Work=True; fi;
       fi;
     fi;
   else
     REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", saveREC, crdRecordOnly);
     if REC=NIL: Exit; fi;
     SetFilter(RO, "UKey="+RecordToString(REC));
     if Records(RO)=1: Work=True; fi;
   fi;
   if Work:
     УЧР_Н       = if(ПолноеНАИМ, GetFieldS(RO, 1, "ПОЛНИМЯ"), GetFieldS(RO, 1, "КОРИМЯ"));
     УЧР_О       = GetFieldS(RO, 1, "ОКПО");
     УЧР         = "К."+GetFieldS(RO, 1, "ПРИЗНАК");
     РУК         = GetFieldS(RO, 1, "ФИОРУК");
     РУК_ДОЛЖН   = GetFieldS(RO, 1, "ДОЛЖНРУК");
     РУК_REC     = RecordToString(GetFieldR(RO, 1, "РУКОВОДИТЕЛЬ"));
     ГЛБУХ_ДОЛЖН = GetFieldS(RO, 1, "ДОЛЖНБУХ");
     ГЛБУХ       = GetFieldS(RO, 1, "ФИОБУХ");
     ГЛБУХ_REC   = RecordToString(GetFieldR(RO, 1, "БУХГАЛТЕР"));
   fi;
 Finally
   CloseWorkArea(RO);
 end;
end;

Proc ВзятьРеквизиты_ТолькоНаименование(ПолноеНАИМ:Logical);
var REC, SaveREC :Record;
var RO, num :Integer;
 RefreshAna;
 RO=OpenWorkArea("КОНТРАГЕНТ", "", "1=0");
 Try
   REC=NIL;
   if УЧР<>"": Try SaveREC=SignToRecord(УЧР, False); Except SaveREC=NIL; end; fi;
   if SaveREC=NIL:
     SetFilter(RO, "НАШЕ");
     num=Records(RO);
     if num<1: REC=NIL;
     |  num=1: REC=GetRecordKey(RO, 1);
     |  num>1: REC=GetRecordKey(RO, 1); SetFilter(RO, "НАШЕ and РПО_УМОЛЧАНИЕ"); if Records(RO)>0: REC=GetRecordKey(RO, 1); fi;
     fi;
   else REC=SaveREC;
   fi;
   if REC<>NIL:
     SetFilter(RO, "UKey="+RecordToString(REC));
     if Records(RO)=1:
       УЧР_Н = if(ПолноеНАИМ, GetFieldS(RO, 1, "ПОЛНИМЯ"), GetFieldS(RO, 1, "КОРИМЯ"));
       УЧР_О = GetFieldS(RO, 1, "ОКПО");
       УЧР   = "К."+GetFieldS(RO, 1, "ПРИЗНАК");
     fi;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
end;

Func ВзятьИмяJDFпоCRD(CRDfile:String) :String;
var num, ii :Integer;
var NameJDF :String;
 if ExistsCardFile(CRDfile):
   num=JournalsCount;
   if num>0:
     for ii=1 to num do
       NameJDF=JournalName(ii);
       if JournalType(NameJDF)="КАРТ": if Up(JournalCardfile(NameJDF))=Up(CRDfile): ^NameJDF; fi; fi;
     od;
   fi;
 fi;
 ^"";
end;

Func ПолеДатыПроводкиКартотеки(CRDname:String) :String;
var aFile, xx, aa, bb, jj :Integer;
var RES, JDFфайл, Value :String;
 RES="";
 JDFфайл=ВзятьИмяJDFпоCRD(CRDname);
 if JDFфайл<>"": -- нашли имя JDF файла
   ClearVariable(Buf);
   xx=GetCardFileFields(CRDname, Buf, mtlDATE);
   if xx>0: -- массив не пустой
     aFile=TextFileOpenRead(JDFфайл);
     Try
       Try
         while not TextFileEndOfFile(aFile) do
           Value=Up(TextFileReadLn(aFile));
           if (Pos("КАРТОТЕКА", Value)>0 or Pos("CARDFILE", Value)>0) and Pos(Up(CRDname), Value)>0:
             aa=Pos("(", Value);
             Value=SubStr(Value, aa+1, Length(Value)-aa);
             bb=WordsCount(Value, ",");
             if bb>0 and xx>0:
               Value=ExtractWord(1, Value, ",");
               jj=SearchInArray(Buf, Value, False, 1);
               if jj>0: RES=Value; Break; fi;
             fi;
           fi;
         od;
       Except
         TextFileClose(aFile);
         ^"";
       end;
     Finally
       TextFileClose(aFile);
     end;
   fi;
 fi;
 ^RES;
end;

Proc ДобавитьДанные(aANAКол:String; aANAФИО:String; aKOL:Numeric; aДЕБ:String; aКРЕ:String; aANAИнв:String; aЦЕНА:Numeric; aЕД_КОД:String; aЕД_ИМЯ:String);
var pp, xx, k1, k2, i16 :Integer;
var Work :Logical;
 Work=True;
 if aANAИнв<>"": pp=SearchInArray(LSTИНВ, aANAИнв, True, 1); if pp<1: AddInArray(LSTИНВ, True, False, aANAИнв); else Work=False; fi; fi;
 if Work:
    xx=1;
    pp=SearchInArray(КолМАТ[].МАТ_КОД, aANAКол, False, xx);
    while not (КолМАТ[pp].МАТ_КОД=aANAКол and КолМАТ[pp].ЦЕНА=aЦЕНА) do
      pp=SearchInArray(КолМАТ[].МАТ_КОД, aANAКол, False, xx);
      if pp>0: xx=pp+1; else Break; fi;
    od;
    if pp<1: -- добавляем ТМЦ
      k1=InsertFrame(КолМАТ, КолМАТ+1);
      КолМАТ[k1].МАТ_КОД   = aANAКол;
      КолМАТ[k1].МАТ_Н     = Trim(Name_A(aANAКол));
      КолМАТ[k1].ЕДИЗМ_Н   = aЕД_ИМЯ;
      КолМАТ[k1].ЕДИЗМ_КОД = aЕД_КОД;
      КолМАТ[k1].ЦЕНА      = aЦЕНА;
    else
      k1=pp;
    fi;
    pp=SearchInArray(КолФИО[].ФИО_КОД, aANAФИО, False, 1);
    if pp<1: -- добавляем человека
      k2=InsertFrame(КолФИО, КолФИО+1);
      КолФИО[k2].ФИО_КОД = aANAФИО;
      КолФИО[k2].ФИО_Н   = Trim(Name_A(aANAФИО));
      КолФИО[k2].КС      = Str(k2);
    else
      k2=pp;
    fi;
    i16=XY_I16(k1, k2);
    pp=SearchInArray(КолФИО_ВЫДАНО[].МАТ_ФИО, i16, False, 1);
    if pp<1:-- добавляем
      pp=InsertFrame(КолФИО_ВЫДАНО, КолФИО_ВЫДАНО+1);
      КолФИО_ВЫДАНО[pp].МАТ_ФИО=i16;
    fi;
    КолФИО_ВЫДАНО[pp].ВЫДАНО=КолФИО_ВЫДАНО[pp].ВЫДАНО+aKOL;
    AddInArray(LSTСЧТ, True, False, aДЕБ+"/"+aКРЕ);
 fi; --Work
end;

Func Выбор_ЕдИзм_ВзятьКод(NameUnit:String) :String;
 if NameUnit="ШТ":    ^"796";
 |  NameUnit="КГ":    ^"166";
 |  NameUnit="Л":     ^"112";
 |  NameUnit="Г":     ^"163";
 |  NameUnit="М":     ^"6";
 |  NameUnit="КОМПЛ": ^"839";
 |  NameUnit="НАБОР": ^"704";
 |  NameUnit="УПАК":  ^"778";
 |  NameUnit="ПОГ М": ^"18";
 |  NameUnit="РУЛ":   ^"736";
 else ^"";
 fi;
end;

Proc ИнициализироватьУсловияОбновления;
var jj :Integer;
 jj=0; 
 ClearVariable(УслДЕБ);
 ClearVariable(УслКРЕ);
 jj=jj+1;
 УслДЕБ[jj]="((*.?.401.20.???|*.?.106.??.???|*.2.109.??.???)&???.????.???????.???.?.???.??.???)|???.?.??.?????.??.????.?.401.10.1??|00";
 УслКРЕ[jj]="???.????.???????.???.?.105.??.440";
 jj=jj+1;
 УслДЕБ[jj]="((*.?.401.20.???|*.?.106.??.???|*.2.109.??.???)&???.????.???????.???.?.???.??.???)|???.?.??.?????.??.????.?.401.10.1??|00";
 УслКРЕ[jj]="???.????.???????.???.?.101.??.410";
 jj=jj+1;
 УслДЕБ[jj]="ЗАБАЛАНС|00Z";
 УслКРЕ[jj]="ЗАБ.??.10?.??";
-- jj=jj+1;
-- УслДЕБ[jj]="ЗАБ.??.105.?5|ЗАБ.??.105.?6|???.????.???????.???.?.105.?5.340|???.????.???????.???.?.105.?6.340";
-- УслКРЕ[jj]="ЗАБ.??.105.?5|ЗАБ.??.105.?6|???.????.???????.???.?.105.?5.340|???.????.???????.???.?.105.?6.340";
 jj=jj+1;
 УслДЕБ[jj]="???.????.???????.???.?.105.??.340";
 УслКРЕ[jj]="???.????.???????.???.?.105.??.340";
 jj=jj+1;
 УслДЕБ[jj]="ЗАБ.??.105.?5|ЗАБ.??.105.?6";
 УслКРЕ[jj]="ЗАБ.??.105.?5|ЗАБ.??.105.?6";
end;

Func ОбновитьДанныеВедомости :Logical;
var CRDwork, Value, FieldДО, ID16, FtrTrans, tmp1, tmp2, ANAФИО, КОДНФА, КОДУЧН, ЕИ_КОД, ЕИ_ИМЯ, КОДПДР, ВНПМОЛ, КОДМОЛ, ДНФА_КОД:String;
var SUM, KOL, ЦенаЕд :Numeric;
var RO, R1, kk, pp, num, ii ,Work_ii:Integer;
var Режим, OK, Work, МОЛдебета :Logical;
var dBT, dET :Date;
var REC :Record;

 Refresh(False);
 if CRD<>"" and RECCRD<>0 : REC=IntegerToRecord(RECCRD); ID16=Str16(RECCRD); CRDwork = CRD               ;
 | True:                    REC=IntegerToRecord(ДНФАID); ID16=Str16(ДНФАID); CRDwork = "РПО_ОПЕРАЦИИДНФА";
 fi;
 if CRDwork<>"РПО_ОПЕРАЦИИДНФА": FieldДО=ПолеДатыПроводкиКартотеки(CRDwork); else FieldДО='ДАТОПЕР'; fi;

 if FieldДО="": Message("Не найдено поле даты операции в картотеке '"+CRDwork+"'.^MРасчет невозможен!", mtError); ^False; fi;
 OK=False;
 if REC<>NIL: OK=RecordExists(CRDwork, REC); fi;
 if not OK: Message("Не найдена ссылка на операцию движения НФА.^MРасчет невозможен!", mtError); ^False; fi;
 if not БАЛ105 and not БАЛ101 and not ЗАБ105 and not ЗАБ101: 
   Message("Не выбран фильтр по счетам.^MМатериалы (ОС) / баланс (забаланс)", mtWarning);
   Template.Object="cb_БАЛ105";
   ^False;
 fi;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Подготовка...");
 RO=OpenWorkArea(CRDwork, "", "Ukey="+RecordToString(REC));
 if CRDwork = "РПО_ОПЕРАЦИИДНФА" and records(RO)=1:
    ДНФА_КОД=GetFieldS(RO,1,'АН_ДНФА');
  | true:ДНФА_КОД='';
 fi;
 R1=OpenWorkArea("РПО_НФА", "", "");
 Try
   dBT=GetFieldD(RO, 1, FieldДО);
   dET=dBT+1;
   FtrTrans=""; tmp1=""; tmp2="";
   -- все что меньше или равно 3000 по балансу для ОС + любые материалы по балансу + любые материалы и ОС по забалансу
   tmp1=РАБ.НФА.FUNC_LIB.Объединить(if(БАЛ101 or ЗАБ101, "*.101.*", ""), if(БАЛ105 or ЗАБ105, "*.105.*", ""), "|");
   tmp2=РАБ.НФА.FUNC_LIB.Объединить(if(БАЛ101 or БАЛ105, "???.????.???????.???.?.???.??.???", ""), if(ЗАБ101 or ЗАБ105, "ЗАБ.??.???.??", ""), "|");
   FtrTrans = "("+tmp1+")&("+tmp2+")";
   FtrTrans = FtrTrans+"{ДНФАID."+ID16+"}";
   ClearVariable(LSTСЧТ);
   ClearVariable(LSTИНВ);
   ClearVariable(КолФИО_ВЫДАНО);
   ClearVariable(КолФИО);
   ClearVariable(КолМАТ);
   ClearVariable(КолБухЗап);
   ИнициализироватьУсловияОбновления;
   num=0;
   for Transaction kk=FtrTrans, dBT, dET do num=num+1; od;
   ShowProgress(num, "Работаем...");
   num=LengthOfArray(УслДЕБ);
   КОДПДР=""; ВНПМОЛ=""; КОДМОЛ="";
   МОЛдебета=False;
   for Transaction kk=FtrTrans, dBT, dET do
     ProgressPos(kk);
     if TransCardFile(kk)=CRDwork:
       tmp1=TransDeb(kk);
       tmp2=TransCre(kk);
       if КОДПДР="": КОДПДР=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "П", False); fi;
       if КОДПДР="": КОДПДР=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "П",  True); fi;
       Work=False;
       for ii=1 to num do -- num=LengthOfArray(УслДЕБ)
         OK=True;
         if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(tmp1, УслДЕБ[ii]); fi; -- условия по счетам
         if OK: OK=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(tmp2, УслКРЕ[ii]); fi; -- условия по счетам
         if OK: Work=True; Work_ii=ii;Break; fi;
       od;
       if Work and Work_ii>3:
         Work=Match(ДНФА_КОД, "ВНПР.ХЭ*");
         if Work: МОЛдебета=True; fi;
       fi;
--       if Work and Work_ii=4: -- внутреннее перемещение только для ДНФА.ВНПР.ХЭ_ВЕЩ
--         Work=ДНФА_КОД='ВНПР.ХЭ_ВЕЩ';
--       fi;
       if Work:
         КОДНФА=TransQuantSign(kk);
         if not Match(КОДНФА, "НФА.???.??.*"): КОДНФА=""; fi;
         if КОДНФА<>"":
           КОДУЧН=""; ЕИ_КОД=""; ЕИ_ИМЯ=""; ANAФИО="";
           SUM=TransSum(kk);
           KOL=TransSum(kk, "КОЛ");
           ЦенаЕд=Abs(Round(SUM/KOL, 2));
           if Match(tmp2, "*.?.101.??.???"): -- если счет 101 то возможен инвентарный номер
             if КОДУЧН="": КОДУЧН=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "УЧН", False); fi;
             if КОДУЧН="": КОДУЧН=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "УЧН",  True); fi;
             if КОДУЧН<>"":
               Value=SubStr(tmp2, 1, 30)+"???";
               SUM=Saldo(Value+"{"+КОДНФА+"&"+КОДУЧН+"}", dBT);
               KOL=Saldo(Value+"{"+КОДНФА+"&"+КОДУЧН+"}", dBT,"КОЛ");
               ЦенаЕд=Abs(Round(SUM/KOL, 2));
             fi;
           fi;
           if (Match(tmp2, "*.?.101.??.???") and ЦенаЕд<=Com_Var("ОС_РАСХ", dBT)) or Match(tmp2, "*.?.105.??.???") or Match(tmp2, "ЗАБ.??.10?.??"):
             --if ANAФИО="": ANAФИО=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, if(МОЛкакФ, "МОЛ", "Ф"), if(МОЛкакФ, False, True)); fi;
             if ANAФИО="": ANAФИО=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, if(МОЛкакФ, "МОЛ", "Ф"), if(МОЛкакФ, МОЛдебета, True)); fi;
             if ANAФИО<>"":
               if КОДМОЛ="": КОДМОЛ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "МОЛ", False); fi;
               pp=GetRecordNumber(R1, SignToRecord(КОДНФА, False));
               if pp>0:
                 ЕИ_КОД=Lo(Trim(GetFieldS(R1, pp, "ЕДИЗМОКЕИ")));
                 ЕИ_ИМЯ=Lo(Trim(GetFieldS(R1, pp, "ЕДИЗМ")));
                 if ЕИ_ИМЯ<>"" and ЕИ_КОД="": ЕИ_КОД=Выбор_ЕдИзм_ВзятьКод(ЕИ_ИМЯ); fi;
                 if ЕИ_ИМЯ="": ЕИ_ИМЯ="ШТ"; ЕИ_КОД="796"; fi;
               fi;
               2ДобавитьДанные0(КОДНФА, ANAФИО, KOL, tmp1, tmp2, if(КОДУЧН<>"", КОДНФА+"&"+КОДУЧН, ""), ЦенаЕд, ЕИ_КОД, ЕИ_ИМЯ);
             fi;
           fi;
         fi; --КОДНФА<>""
       else
         if tmp1=tmp2: if ВНПМОЛ="": ВНПМОЛ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "МОЛ", False); fi; fi;
       fi; --Work
     fi; --TransCardFile(kk)=CRDwork
   end; --Transaction
   if КОДПДР<>"": ПОДР=КОДПДР; ПОДР_Н=Trim(Name_A(ПОДР)); if ПОДР_Н="": ПОДР_Н=ПОДР; fi; fi;
   if ВНПМОЛ<>"": КОДМОЛ=ВНПМОЛ; if КОДМОЛ<>"": МОЛ=КОДМОЛ; МОЛ_Н=Trim(Name_A(МОЛ)); if МОЛ_Н="": МОЛ_Н=МОЛ; fi; fi; fi;
 Finally
   CloseWorkArea(R1);
   CloseWorkArea(RO);
   CloseProgress;
   ToggleAutorefresh(Режим);
 end;
 kk=LengthOfArray(LSTСЧТ);
 if kk>0:
   for pp=1 to kk do
     InsertFrame(КолБухЗап, КолБухЗап+1);
     КолБухЗап[КолБухЗап].БухДеб=ExtractWord(1, LSTСЧТ[pp], "/");
     КолБухЗап[КолБухЗап].БухКре=ExtractWord(2, LSTСЧТ[pp], "/");
   od;
 fi;
 ВнешнийВидБланка_Обновить;
 ВзятьРеквизиты(ПолнНаим, True);
 ^True;
end;

Proc Инициализация_Бланка;
 flgНстрка=False;
 if ProcExists("cb_Нстрка_OnChange"): ExecuteProc("cb_Нстрка_OnChange", ""); fi;
 --ПрименитьТочность(",##0.00"+RepStr("#", ТОЧН-2)+";;-");
 СформированИзДНФА;
 ВнешнийВидБланка_Обновить;
 ВнешнийВидДолжностьРуководителя_Обновить(ДолжнРук, Защита);
 if not Защита:
   Iter_Validation;
   if УЧР_Н="": ВзятьРеквизиты(ПолнНаим, True); fi;
 fi;
 ТолькоЧтение(Защита);
end;

Proc СинронизацияЗаписи;
end;

Proc ВосстановитьНастройкиПоУмолчанию;
 if EnqOkCancel("Будет восстановлена настройка по умолчанию."+Chr(13)+"Продолжить?", mtWarning)=cmCancel: Exit; fi;
 ПолнНаим   = False;
 ДолжнРук   = False;
 defБАЛ105  = True;
 defЗАБ105  = True;
 defБАЛ101  = False;
 defЗАБ101  = False;
 defМОЛкакФ = False;
 НастройкаОтчета(True);
 Message("Стандарная настройка восстановлена", mtInformation);
end;

Proc ВыбратьСчетДебетаНФА(Iter:Integer);
var Acc :String;
 if КолБухЗап[Iter].БухКре="": Message("Необходимо выбрать счет кредита.", mtWarning); Template.Field="БухКре"; Template.Frame=Iter; Exit; fi;
 Acc=PickCorrAccount(КолБухЗап[Iter].БухКре, True, КолБухЗап[Iter].БухДеб);
 if Acc="": Exit; fi;
 КолБухЗап[Iter].БухДеб = Acc;
end;

Proc ВыбратьСчетКредитаНФА(Iter:Integer);
var Acc, MaskAcc :String;
 MaskAcc="";
 if БАЛ105: MaskAcc=РАБ.НФА.B01.ab(MaskAcc, "|", "*.?.105.??.4??"); fi;
 if ЗАБ105: MaskAcc=РАБ.НФА.B01.ab(MaskAcc, "|",  "ЗАБ.??.105.??"); fi;
 if БАЛ101: MaskAcc=РАБ.НФА.B01.ab(MaskAcc, "|", "*.?.101.??.4??"); fi;
 if ЗАБ101: MaskAcc=РАБ.НФА.B01.ab(MaskAcc, "|",  "ЗАБ.??.101.??"); fi;
 Acc=AccountElection(MaskAcc, False, КолБухЗап[Iter].БухКре);
 if Acc="": Exit; fi;
 КолБухЗап[Iter].БухКре = Acc;
 if КолБухЗап[Iter].БухДеб<>"" and not Correspond(КолБухЗап[Iter].БухДеб, КолБухЗап[Iter].БухКре): КолБухЗап[Iter].БухДеб=""; fi;
end;

Proc ФИО_Выбор(Field:String; Iter:Integer; OnExit:Logical);
var OldVal, NewVal, tmp :String;
 tmp=Delete(Field, 1, 7);
 tmp=Trim(Delete(tmp, Pos("]", tmp), 1));
 Try Iter=Int(tmp); Except Iter=0; end;
 if Iter>0:
   OldVal=КОЛФИО[Iter].ФИО_КОД;
   if Iter>0:
     if OnExit: NewVal=""; else tmp=AnaElection("Ф.*", False, False, OldVal); if tmp<>"": NewVal=tmp; else Exit; fi; fi;
     if NewVal<>OldVal: КОЛФИО[Iter].ФИО_КОД=NewVal; fi;
   fi;
 else
   Message("Непредвиденная ошибка при выборе ФИО", mtError);
   Exit;
 fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
var nn :Integer;
 if Pos("ФИО_Н_[", Field)=1:
   ФИО_Выбор(Field, Iter, False);
   ^False;
 else
   if Field="УЧР_Н"      : ВзятьРеквизиты(ПолнНаим, False); ^False;
  -- |  Field="ТОЧН"       : Точн=УстановитьТочность(Точн); ТочностьКакНаЭкране; ^False;
   |  Field="AA"         : Try nn=InsertFrame(КолБухЗап, Iter+1); Except end; ^False;
   |  Field="DD"         : if EnqOkCancel("Вы уверены что хотите удалить данную строчку?", mtConfirmation)=cmOk: Try DeleteFrame(КолБухЗап, Iter); Iter_Validation; Except end; fi; ^False;
   |  Field="ПолнНаим"  :    ПолнНаим = not   ПолнНаим; ВзятьРеквизиты_ТолькоНаименование(ПолнНаим); ^False;
   |  Field="ДолжнРук"  :    ДолжнРук = not   ДолжнРук; ВнешнийВидДолжностьРуководителя_Обновить(ДолжнРук, Защита); ^False;
   |  Field="defБАЛ105"  :  defБАЛ105 = not  defБАЛ105; ^False;
   |  Field="defЗАБ105"  :  defЗАБ105 = not  defЗАБ105; ^False;
   |  Field="defБАЛ101"  :  defБАЛ101 = not  defБАЛ101; ^False;
   |  Field="defЗАБ101"  :  defЗАБ101 = not  defЗАБ101; ^False;
   |  Field="defМОЛкакФ" : defМОЛкакФ = not defМОЛкакФ; ^False;
   |  Field="DefINI"     : ВосстановитьНастройкиПоУмолчанию; ^False;
   |  Field="БухДеб"     : ВыбратьСчетДебетаНФА(Iter);  ^False;
   |  Field="БухКре"     : ВыбратьСчетКредитаНФА(Iter); ^False;
   fi;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Pos("ФИО_Н_[", Field)=1:
   ФИО_Выбор(Field, Iter, True);
 else
   if Field="УЧР_Н"          : УЧР=""; УЧР_О="";
  -- |  Field="ТОЧН"           : if ТОЧН=0: ТОЧН=4; fi;
   |  Field="ПОДР_Н"         : if   Подр_Н="":           ПОДР=""; fi;
   |  Field="МОЛ_Н"          : if    Мол_Н="":            МОЛ=""; fi;
   |  Field="РУК"            : if      Рук="":      Рук_Должн=""; fi;
   |  Field="РУК_ДОЛЖН"      : if      Рук="":      Рук_Должн=""; fi;
   |  Field="ГЛБУХ"          : if    ГлБух="":    ГлБух_Должн=""; fi;
   |  Field="ГЛБУХ_ДОЛЖН"    : if    ГлБух="":    ГлБух_Должн=""; fi;
   |  Field="МАТВЫДАЛ"       : if МатВыдал="": МатВыдал_Должн=""; fi;
   |  Field="МАТВЫДАЛ_ДОЛЖН" : if МатВыдал="": МатВыдал_Должн=""; fi;
   |  Field="ПолнНаим"       : ВзятьРеквизиты_ТолькоНаименование(ПолнНаим);
   fi;
 fi;
end;

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

Func Номер_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
-- НОМ_ДОК=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМ_ДОК", "ДЗА", "Ukey<>"+RecordToString(Current), if(ДЗА>1.1.2000, ДЗА, ToDay));
-- НОМ_БУМ=Str(НОМ_ДОК);
 ^"";
end;

Func Сотрудники_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var REC, SaveREC :Record;
var FieldName, СТРФИО, СТРДОЛ, tmp1, tmp2 :String;
 Template.HideEditor(False);
 if not AutoRefresh: RefreshAna; fi;
 FieldName=asString(Template.Field);
 if FieldName="РУК_ДОЛЖН"      or FieldName="РУК"      : if РУК_REC<>""      : Try SaveREC=StringToRecord(РУК_REC);      Except SaveREC=NIL; end; fi;
 |  FieldName="ГЛБУХ_ДОЛЖН"    or FieldName="ГЛБУХ"    : if ГЛБУХ_REC<>""    : Try SaveREC=StringToRecord(ГЛБУХ_REC);    Except SaveREC=NIL; end; fi;
 |  FieldName="МАТВЫДАЛ_ДОЛЖН" or FieldName="МАТВЫДАЛ" : if МАТВЫДАЛ_REC<>"" : Try SaveREC=StringToRecord(МАТВЫДАЛ_REC); Except SaveREC=NIL; end; fi;
 fi;
 REC=OpenCardFile("СОТРУДНИКИ", "", SaveREC, crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 tmp1=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
 СТРФИО=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp1<>"..", tmp1, ""));
 Try СТРДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ"); Except СТРДОЛ=""; end;
 if FieldName="РУК_ДОЛЖН"      :      РУК_ДОЛЖН=СТРДОЛ;      РУК=СТРФИО;      РУК_REC=RecordToString(REC);
 |  FieldName="РУК"            :      РУК_ДОЛЖН=СТРДОЛ;      РУК=СТРФИО;      РУК_REC=RecordToString(REC);
 |  FieldName="ГЛБУХ_ДОЛЖН"    :    ГЛБУХ_ДОЛЖН=СТРДОЛ;    ГЛБУХ=СТРФИО;    ГЛБУХ_REC=RecordToString(REC);
 |  FieldName="ГЛБУХ"          :    ГЛБУХ_ДОЛЖН=СТРДОЛ;    ГЛБУХ=СТРФИО;    ГЛБУХ_REC=RecordToString(REC);
 |  FieldName="МАТВЫДАЛ_ДОЛЖН" : МАТВЫДАЛ_ДОЛЖН=СТРДОЛ; МАТВЫДАЛ=СТРФИО; МАТВЫДАЛ_REC=RecordToString(REC);
 |  FieldName="МАТВЫДАЛ"       : МАТВЫДАЛ_ДОЛЖН=СТРДОЛ; МАТВЫДАЛ=СТРФИО; МАТВЫДАЛ_REC=RecordToString(REC);
 fi;
 ^"";
end;

Func П_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ANA :String;
 Template.HideEditor(False);
 RefreshAna;
 ANA=AnaElection("П.*", False, False, ПОДР);
 if ANA="": ^""; fi;
 ПОДР=ANA;
 ПОДР_Н=Trim(Name_A(ПОДР));
 if ПОДР_Н="": ПОДР_Н=ПОДР; fi;
 ^"";
end;

Func МОЛ_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ANA :String;
 Template.HideEditor(False);
 RefreshAna;
 ANA=AnaElection("МОЛ.*", False, False, МОЛ);
 if ANA="": ^""; fi;
 МОЛ=ANA;
 МОЛ_Н=Trim(Name_A(МОЛ));
 if МОЛ_Н="": МОЛ_Н=МОЛ; fi;
 ^"";
end;

--Func НФА_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
--var StoreCOD, ANA :String;
--var Iter :Integer;
-- Template.HideEditor(False);
-- Iter=asInteger(Template.Frame);
-- StoreCOD=Позиции[Iter].TBLКНФА;
-- ANA=Up(AnaElection("НФА.101.*|НФА.102.*|НФА.105.*", False, False, StoreCOD));
-- if ANA="": ^Cur; fi;
-- if ANA<>StoreCOD: Позиции[Iter].TBLКНФА=ANA; fi;
--end;

2-- События объектов
Proc cb_Защита_onChange(Sender:String);
var Flag, SaveOK :Logical;
var qq :Integer;
 if Защита=False:
    SaveOK=True; -- если защита 'снимается' значит проверка данных уже производилась
    qq=EnqOkCancel("Вы действительно хотите снять защиту^M от изменений у данного документа?", mtConfirmation);
    if qq=cmCancel: Flag=True; else Flag=False; fi;
   else
    SaveOK=TemplateSaveOK;
    Flag=SaveOK;
 fi;
 Защита=Flag; cb_Защита.State=Защита;
 ТолькоЧтение(Flag);
 if not(SaveOK): Exit; fi; -- Избегаем двойных сообщений
 EditorApply;
end;

Proc ПереходНаОперациюДвиженияНФА;
var REC, LastCurrent :Record;
var OK :Logical;
var CRD_, blnCRD_ :String;
 if ДНФАID>0: REC=IntegerToRecord(ДНФАID); CRD_="РПО_ОПЕРАЦИИДНФА"; blnCRD_="НФА.ЖУР.ОПЕРАЦИИДНФА"; fi;
 if RECCRD>0 and REC=NIL: REC=IntegerToRecord(RECCRD); CRD_=Trim(CRD); blnCRD_=BLNCRD; fi;
 OK=if(REC<>NIL, RecordExists(CRD_, REC), False);
 if OK:
   if BlankExist(blnCRD_):
     if IsBlankOpen(blnCRD_):
       if ПеременнаяСуществует(blnCRD_+".LastCurrent"): LastCurrent=GetVariableR(blnCRD_+".LastCurrent"); else LastCurrent=REC; Close(blnCRD_); fi;
       if REC<>LastCurrent: Close(blnCRD_); fi;
       if IsBlankOpen(blnCRD_):
          Message("Нельзя открыть документ-родитель,^Mтак как данный документ редактируется.^MЗавершите его редактирование и попробуйте еще раз.", mtError);
          OpenBlank(blnCRD_, False, LastCurrent);
          Exit;
       fi;
     fi;
     OpenBlank(blnCRD_, False, REC);
   else
     Message("Не найден бланк редактор для операции движения НФА, из которого сформирован текущий документ.", mtError);
   fi;
 else
   Message('Некорректная ссылка на документ-родитель!', mtError);
 fi;
end;

Func БланкЗаполнен :Logical;
 ^True;
end;

Func ОтменитьИзмененияУсловийОтчета :Logical;
var FF :Logical;
var qq :Integer;
 FF=False;
 if БланкЗаполнен:
   qq=EnqOkCancel("Условия отбора данных для ведомости изменились!^MОчистить ведомость?", mtConfirmation);
   if qq=cmOk: ОчисткаОтчета;
   |  qq=cmCancel: FF=True;
   fi;
 fi;
 ^FF;
end;

Proc Флаги_onChange(Sender:String);
var NewFlag, OldFlag :Logical;
var nameVar :String;
var ОбъектИмя :Object;
 if FindObject(Sender, ОбъектИмя):
   nameVar=SubStr(Sender, 4, Length(Sender)-3); -- вычисляем имя переменной - 3=cb_
   NewFlag=GetVariableL(nameVar); -- текущий статус;
   OldFlag=not(NewFlag); -- предыдущий статус
   if ОтменитьИзмененияУсловийОтчета: NewFlag=OldFlag; fi;
   PutVariableL(nameVar, NewFlag);
   ОбъектИмя.State=NewFlag;
   if NewFlag<>OldFlag:
     -- какие то особые действия
   fi;
 fi;
end;

Proc ПодготовкаСекцийКПечати(Режим:Integer);
var flg1, flg2 :Logical;

 flg1=if(Режим=1 or Режим=0, True, False);
 flg2=if(Режим=2 or Режим=0, True, False);

 S1.CanPrint = False;

 S2.CanPrint = flg1;
 S3.CanPrint = flg1;
 S4.CanPrint = flg1;
 S5.CanPrint = flg1;
 S6.CanPrint = flg1;
 S7.CanPrint = flg1;

 S8.CanPrint = flg2;
 S9.CanPrint = flg2;

end;

Proc НапечататьВедомость;
 ПодготовкаСекцийКПечати(1);
 Print("", "ТББ_STD_Portret10_000.cfg", "", True  , 1, 999, False);
 ПодготовкаСекцийКПечати(2);
 Print("", "ТББ_STD_Album15_000.cfg",   "", False , 1, 999, False);
 ПодготовкаСекцийКПечати(0);
end;

Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnOkey": if not Защита: EditorApply;  fi; Close;
 |  Sender="btnExit": if not Защита: EditorCancel; fi; Close;
 |  Sender="btnPrnt": НапечататьВедомость;
 |  Sender="btnUpdt": if ОбновитьДанныеВедомости: Message("Обновление ведомости успешно завершено!", mtInformation); fi;
 |  Sender="btnGoTo": ПереходНаОперациюДвиженияНФА;
 fi;
end;

Func cb_Нстрка_ВнешнийВид :Logical;
var Obj :Object;
var ii :Integer;
var Flag :Logical;
 Flag = not flgНстрка;
 if numSecTmpl>0: for ii=1 to numSecTmpl do if FindObject("S"+Str(ii), Obj): Obj.Visible = Flag; fi; od; fi;
    btnOkey.Visible = Flag;
    btnExit.Visible = Flag;
    btnPrnt.Visible = Flag;
    btnUpdt.Visible = Flag;
  cb_Защита.Visible = Flag;
  cb_БАЛ105.Visible = Flag;
  cb_ЗАБ105.Visible = Flag;
  cb_БАЛ101.Visible = Flag;
  cb_ЗАБ101.Visible = Flag;
 cb_МОЛкакФ.Visible = Flag;
 if Flag: СформированИзДНФА; else btnGoTo.Visible = False; lblWarning.Visible = False; fi;
 ^Flag;
end;

Proc cb_Нстрка_OnChange(Sender: String);
 if cb_Нстрка_ВнешнийВид: НастройкаОтчета(False); else НастройкаОтчета(True); fi;
end;

2-- События шаблона
Proc CopyCfgPrn(Cfg:String);
var OK :Logical;
 OK=ExistFile(РАБ.БЮДЖЕТ2005.Контроль2Слэш(PlanVar("INI")+"\"+Cfg));
 if OK: 
   Try 
     DeleteFile(РАБ.БЮДЖЕТ2005.Контроль2Слэш(PlanVar("INI")+"\"+Cfg));
     РАБ.НАСТР_ПЕЧАТЬ.CreateCfg(PlanVar('НФА')+'\Настройки\', Cfg);
   Except
   end;
 else
   РАБ.НАСТР_ПЕЧАТЬ.CreateCfg(PlanVar('НФА')+'\Настройки\', Cfg);
 fi;
end;


Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 EnableCommands(False, cmDublRec);
 CopyCfgPrn("ТББ_STD_Portret10_000.cfg");
 CopyCfgPrn("ТББ_STD_Album15_000.cfg");
 ЦветаПолей;
 flgНстрка=False;
 First=True;
end;

Proc Template_AfterOpen(Create:Logical); -- при открытии шаблона
 Инициализация_Бланка;
 First=False;
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 ClearVariable(BufField); ClearVariable(BufClrBg); ClearVariable(BufClrFo);
 Очистить;
 if CurrentState=CrdusUndefined: Destroy=True; fi;
end;

Proc Template_onRead; -- при считывании шаблона
 --if recCurrent<>NIL: if recCurrent<>Current: recCurrent=Current(recCurrent); fi; recCurrent=NIL; fi;
 Очистить;
 if NewREC:
   ДЗА=ToDay;
   --НОМ_ДОК=РАБ.НФА.FUNC_LIB.NextNumToDate(SelfCRD, "НОМ_ДОК", "ДЗА", ДЗА);
   --НОМ_БУМ=Str(НОМ_ДОК);
   ЗАЩИТА=False;
 fi;
 if not First: Инициализация_Бланка; fi;
 Template.Object="btnUpdt";
end;

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

Func Template_OnValidate: Logical; -- при проверке шаблона
var num :Integer;
var SaveOK :Logical;
 if not NewREC: if not(TemplateSaveOK): ^False; fi; fi;
 if NewREC and not Защита:
   if not(TemplateSaveOK): ^False; fi;
   num=EnqOkCancel("Защитить данный документ от изменений?", mtConfirmation);
   if num=cmOk:
     SaveOK=TemplateSaveOK;
     Защита=SaveOK;
     cb_Защита.State=Защита;
     ТолькоЧтение(SaveOK);
   fi;
 fi;
 СинронизацияЗаписи;
 ^True;
end;

КОНЕЦ -- бланка