БЛАНКСШАБЛОНОМ[07.11.2005] "Накладная на внутреннее перемещение объектов ОС", РЕДАКТОР РПО_ВНУТР_ПЕРЕМЕЩ_ОС;
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные и массивы шаблона
btnOK :Object;   btnClose :Object;   btnОбновить :Object;   btnПереход :Object;   cbЗащита :Object;   cbФиксЦена :Object;
СекцШАПКА1 :Object; СекцПОДВАЛ1 :Object; СекцТАБ :Object;
СекцШАПКА2 :Object; СекцПОДВАЛ2 :Object; СекцПОД :Object;
СекцШАПКА3 :Object;
lblWarning :Object;
инвномер:i;
var recCurrent:record;
var ВЕД_ИНВ_[]:s=if(инвномер=0:Позиции[$].ВЕД_ИНВ|инвномер=1:Позиции[$].КОД_ИНВ|инвномер=2:Позиции[$].ВЕД_ИНВ+chr(13)+Позиции[$].КОД_ИНВ);
var NewREC         :Logical=(CurrentState=crdusInserted);
var First          :Logical;
var ФиксЦена       :Logical;
var ВИД_АНА        :Integer=[2];
var SelfCRD        :String="РПО_ВНУТР_ПЕРЕМЕЩ_ОС";
var A :String="+";   var D :String="-";
var МаскаСЧ        :String="???.????.???????.???.?.101.??.310|ЗАБ.??.101.??|???.????.???????.???.?.102.??.320|???.??.??.??.??.??.????.?.103.1?.330";
var Пользов        :String;
var NN[]           :String=Str($);
var Buf[]          :String;
var BufI[]         :Integer;
var ИМЯ_НФА[]      :String=РАБ.НФА.FUNC_LIB.FormatAna(Позиции[$].КОД_НФА, ВИД_АНА, "наименования нет", "-");
var ИМЯ_М_ОТК      :String=if(Name_A(КОД_М_ОТК)<>"" and Name_A(КОД_М_ОТК)<>" ", Name_A(КОД_М_ОТК), КОД_М_ОТК);
var ИМЯ_М_КУД      :String=if(Name_A(КОД_М_КУД)<>"" and Name_A(КОД_М_КУД)<>" ", Name_A(КОД_М_КУД), КОД_М_КУД);
var ИТОГО_ДОК      :Numeric=SumOfArray(Позиции[].СУММА_НФА);
--
var НФА_ИНВ_COD[]  :String;
var НФА_ИНВ_СУМ[]  :Numeric;
var НФА_ИНВ_КОЛ[]  :Numeric;
var ИНВ_MSK[]      :String;
var ИНВ_INI[]      :String;
var ИНВ_NUM[]      :Integer;
--
var ИменаСекций[]  :String;
var BufField[]     :String;
var BufColorBg[]   :Integer;
var BufColorFo[]   :Integer;

2-- Общие процедуры и функции
Proc Очистить;
 ClearVariable(НФА_ИНВ_COD); ClearVariable(ИНВ_MSK); ClearVariable(NN);
 ClearVariable(НФА_ИНВ_СУМ); ClearVariable(ИНВ_INI); ClearVariable(Buf);
 ClearVariable(НФА_ИНВ_КОЛ); ClearVariable(ИНВ_NUM); ClearVariable(ИМЯ_НФА);
end;

Func ВыборВидаТаблицы(State:Integer) :Integer;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="код + наименование";
 Buf[2]="только код";
 Buf[3]="только наименование";
 Buf[4]="наименование + код";
 nn=Alternate("Выберите способ отображения аналитики", Buf, -1, State+1, 12);
 if nn=0: ^State; fi;
 ^(nn-1);
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].КОД_НФА="": Try DeleteFrame(Позиции, nn); Except end; else nn=nn+1; fi; od;
 Iter_Validation;
end;

Func TemplateSaveOK :Logical; -- проверка правильности ввода данных
 if НОМЕРБУМ="": Message("Не задан номер^Mнакладной на внутреннее перемещение объектов основных средств!", mtWarning); Template.Field="НОМЕРБУМ"; ^False; fi;
 if ДАТА_НАК=1.1.100: Message("Не задана дата^Mнакладной на внутреннее перемещение объектов основных средств!", mtWarning); Template.Field="ДАТА_НАК"; ^False; fi;
 УдалитьПустые;
 ^True;
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="ДАТА_ПРИОБ" : ^Позиции[Iter].ДАТА_ПРИОБ;
 |  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="ДАТА_ПРИОБ" : Позиции[Iter].ДАТА_ПРИОБ = Value;
 |  name="СДАЛ_ДАТА"  : СДАЛ_ДАТА = Value;
 |  name="ПРИН_ДАТА"  : ПРИН_ДАТА = Value;
 fi;
end;

Func ВзятьДанныеКонтрагента(ANA:String; mode:String; Наше:Logical) :String;
var res, t1, t2, tmp :String;
var REC, REB :Record;
var ROK, ROB, num :Integer;
 res="";
 if Up(SubStr(ANA, 1, 2))<>"К." and Наше=False: ^""; fi;
 ROK=OpenWorkArea("КОНТРАГЕНТ", "", "1=0");
 Try
   if Наше:
     SetFilter(ROK, "НАШЕ");
     num=Records(ROK);
     if num<1: REC=NIL;
     |  num=1: REC=GetRecordKey(ROK, 1);
     |  num>1: REC=GetRecordKey(ROK, 1);
               SetFilter(ROK, "НАШЕ and РПО_УМОЛЧАНИЕ");
               if Records(ROK)>0: REC=GetRecordKey(ROK, 1); fi;
     fi;
   else
     REC=SignToRecord(ANA, False);
   fi;
   if REC=NIL: ^""; fi;
   SetFilter(ROK, "Ukey="+RecordToString(REC));
   if mode="КИМЯ": res=GetFieldS(ROK, 1, "КОРИМЯ");
   |  mode="ОКПО": res=GetFieldS(ROK, 1, "ОКПО");
   |  mode="АДРС": tmp=GetFieldS(ROK, 1, "ЮРАДРЕС");
                   t1=GetFieldS(ROK, 1, "ТЕЛЕФОН"); t1=if(t1="", "", "тел. "+t1);
                   t2=GetFieldS(ROK, 1, "ФАКС");    t2=if(t2="", "", t2+" (факс)");
                   if tmp<>"": tmp=tmp+"; "+t1; else tmp=t1; fi;
                   if tmp<>"": tmp=tmp+"; "+t2; else tmp=t2; fi;
                   res=tmp;
   |  mode="БАНК": ROB=OpenWorkArea("БАНК_СЧЕТА", "", "КОНТРАГЕНТ="+RecordToString(REC));
                   Try
                     num=Records(ROB);
                     if num<1: REB=NIL;
                     |  num=1: REB=GetRecordKey(ROB, 1);
                     |  num>1: REB=GetRecordKey(ROB, 1);
                               SetFilter(ROB, "УМОЛЧАНИЕ and КОНТРАГЕНТ="+RecordToString(REC));
                               if Records(ROB)>0: REB=GetRecordKey(ROB, 1); fi;
                     fi;
                     if REB=NIL: ^""; fi;
                     SetFilter(ROB, "Ukey="+RecordToString(REB));
                     res="р/с: "+GetFieldS(ROB, 1, "РСЧЕТ")+" в "+GetFieldS(ROB, 1, "БАНК")+", "+GetFieldS(ROB, 1, "ГОРОД")+", "+
                         "к/с: "+GetFieldS(ROB, 1, "КСЧЕТ")+", БИК "+GetFieldS(ROB, 1, "БИК");
                   Finally
                     CloseWorkArea(ROB);
                   end;
   |  mode="ФРУК": res=GetFieldS(ROK, 1, "ФИОРУК");
   |  mode="ДРУК": res=GetFieldS(ROK, 1, "ДОЛЖНРУК");
   |  mode="ФКАС": res=GetFieldS(ROK, 1, "ФИОКАСС");
   |  mode="ДКАС": res=GetFieldS(ROK, 1, "ДОЛЖНКАСС");
   |  mode="ФБУХ": res=GetFieldS(ROK, 1, "ФИОБУХ");
   |  mode="ДБУХ": res=GetFieldS(ROK, 1, "ДОЛЖНБУХ");
   fi;
 Finally
   CloseWorkArea(ROK);
 end;
 ^res;
end;

Proc Реквизиты;
var REC :Record;
var RO :Integer;
 REC=NIL;
 RO=OpenworkArea("КОНТРАГЕНТ", "", "НАШЕ and КОРИМЯ='"+УЧРЕЖД+"'");
 Try
   if Records(RO)>0: REC=GetRecordKey(RO, 1); fi;
   REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", REC, crdRecordOnly);
   if REC=NIL: Exit; fi;
   SetFilter(RO, "Ukey="+RecordToString(REC));
   if Records(RO)=1:
     УЧРЕЖД=GetFieldS(RO, 1, "КОРИМЯ");
     ОКПО=GetFieldS(RO, 1, "ОКПО");
     ГЛ_БУХ=GetFieldS(RO, 1, "ФИОБУХ");
   fi;
 Finally
   CloseWorkArea(RO);
 end;
end;

Proc ПрименитьТочность(Mask:String);
 СекцТАБ.Cell(1, 9, CellFormat, Mask);
 СекцТАБ.Cell(1,10, CellFormat, Mask);
 СекцТАБ.Cell(1,11, CellFormat, Mask);
 СекцПОД.Cell(1, 3, CellFormat, Mask);
end;

Func УстановитьТочность(OldVal:Integer) :Integer;
var nn, i :Integer;
var Mask :String;
 ClearVariable(Buf); nn=0;
 for i=1 to 8 do Buf[i]="знаков после запятой - "+Str(i+1); od;
 nn=Alternate("Настройте точность вычислений...", Buf, -1, Точн-1, 12);
 if nn=0: ^OldVal; fi;
 Mask=",##0.00"+RepStr("#", nn-1)+";;-";
 ПрименитьТочность(Mask);
 ^(nn+1);
end;

Func ОбновитьНакладную :Logical;
var REC :Record;
var OK, Режим, Work :Logical;
var CRDинвк, УслДЕБ, УслКРЕ, УслПР, tmp, tmp2, v1 :String;
var КОДНФА, КОДИНВ, СЧД, ВЕД, МХЭС, МХЭП, МОЛС, МОЛП:String;
var ROднфа, ROинвк, k, len, j, i, y, LastNum, pN, lN, num:Integer;
var dBT, dET :Date;
var RecWrk: Record;
var CrdWrk,fielddate: String;

  OK=False;
  CRDинвк="РПО_ИНВКАРТ_ОС";

 if CRD<>'' and RECCRD<>0:
    CrdWrk=CRD;
    RECWrk=IntegerToRecord(Abs(RECCRD));
    fielddate  = РАБ.БЮДЖЕТ2005.ПолеДатыПроводкиКартотеки(CrdWrk);
    if fielddate="": fielddate = 'ДАТАОПЕР'; fi;
  | true:
    CrdWrk="РПО_ОПЕРАЦИИДНФА";
    RECWrk=IntegerToRecord(Abs(ДНФАID));
    fielddate='ДАТОПЕР';
 fi;

 if RECWrk<>NIL: OK=RecordExists(CrdWrk, RECWrk); fi;
 if OK=False: Message("Не найдена ссылка на операцию движения НФА.^MРасчет невозможен!", mtError); ^False; fi;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ROднфа=OpenWorkArea(CrdWrk, "", "Ukey="+RecordToString(RECWrk));
 ROинвк=OpenWorkArea(CRDинвк, "", "1=0");
 ShowProgress(0, "Считывание информации операции движения НФА ...");
 Try
   Refresh(False);
   УслДЕБ="((*.?.101.??.310|*.?.102.??.320)&???.????.???????.???.?.???.??.???)|((*.?.103.1?.330)&???.??.??.??.??.??.????.?.???.??.???)|ЗАБ.??.101.??";
   УслКРЕ="((*.?.101.??.310|*.?.102.??.320)&???.????.???????.???.?.???.??.???)|((*.?.103.1?.330)&???.??.??.??.??.??.????.?.???.??.???)|ЗАБ.??.101.??";

   dBT=GetFieldD(ROднфа, 1, fielddate);
   dET=dBT+1;
   УслПР=УслДЕБ+"{НФА.*&ДНФАID."+Str16(RecordToInteger(RECWrk))+"}";
   МХЭП=""; МХЭС=""; МОЛП=""; МОЛС="";
   Очистить;
   for Transaction k=УслПР, dBT, dET do
     if CrdWrk=TransCardFile(k):
       Work=False;
       СЧД=TransDeb(k);
       tmp=TransCre(k);
       OK=True;
       OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧД, УслДЕБ));
       OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(tmp, УслКРЕ));
       OK=(OK and СЧД=tmp); -- Внутренние перемещения
       if OK: Work=True; fi;
       if Work:
         КОДНФА=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "НФА", True);
         КОДИНВ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "УЧН", True);
         if КОДНФА<>"" and КОДИНВ<>"":
           if Match(СЧД, "???.????.???????.???.?.10?.??.???")   : СЧД=SubStr(СЧД, 1, 30)+"???";
           |  Match(СЧД, "???.??.??.??.??.??.????.?.10?.??.???"): СЧД=SubStr(СЧД, 1, 33)+"???";
           |  Match(СЧД, "ЗАБ.??.10?.??")                       : СЧД=СЧД;
           else СЧД="";
           fi;
           if СЧД<>"":
             tmp=КОДНФА+"|"+КОДИНВ+"|"+СЧД;
             if SearchInArray(НФА_ИНВ_COD, tmp, True, 1)=-1:
               j=InsertInArraySort(НФА_ИНВ_COD, tmp);
               InsertInArray(НФА_ИНВ_СУМ, j, TransSum(k));
               InsertInArray(НФА_ИНВ_КОЛ, j, TransSum(k, "КОЛ"));
             fi;
             if МХЭП="": МХЭП=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "М",   True ); fi;
             if МХЭС="": МХЭС=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "М",   False); fi;
             if МОЛП="": МОЛП=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", True ); fi;
             if МОЛС="": МОЛС=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", False); fi;
           fi;
         fi;
       fi;
     fi;
   end; -- Transaction
   len=LengthOfArray(НФА_ИНВ_COD);
   if len=0: Message("НФА для создания накладной^Mна внутреннее перемещение объектов основных средств^Mне найдено!", mtWarning); ^False; fi;
   -- Ищем последние инвентарные номера
   ClearVariable(ИНВ_MSK); ClearVariable(ИНВ_INI); ClearVariable(ИНВ_NUM);
   ShowProgress(len, "Поиск последнего инвентарного номера...");
   k=0;
   for i=1 to len do
     ProgressPos(i);
     КОДНФА=ExtractWord(1, НФА_ИНВ_COD[i], "|");
        СЧД=ExtractWord(3, НФА_ИНВ_COD[i], "|");
     tmp=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.МаскаВедИнвНомер(СЧД, КОДНФА);
     if SearchInArray(ИНВ_MSK, tmp, True, 1)<0:
       k=InsertInArraySort(ИНВ_MSK, tmp);
       pN=Pos("?", tmp);
       lN=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.ДлинаНумерации;
       InsertInArray(ИНВ_INI, k, Str(pN)+"|"+Str(lN));
       SetFilter(ROинвк, "Match(ИНВ_ВЕД,'"+tmp+"')");
       num=Records(ROинвк);
       if num>0:
         ClearVariable(BufI);
         for j=1 to num do tmp=GetFieldS(ROинвк, j, "ИНВ_ВЕД"); BufI[j]=Int(SubStr(tmp, pN, lN)); od;
         SortArray(BufI, True);
         InsertInArray(ИНВ_NUM, k, BufI[num]+1);
         ClearVariable(BufI);
       else
         InsertInArray(ИНВ_NUM, k, 1);
       fi;
     fi;
   od;
   --
   LastNum=РАБ.НФА.FUNC_LIB.NextNum(CRDинвк, "НОМЕР");
   ClearVariable(Позиции);
   if ТОЧН=0: ТОЧН=4; fi;
   --
   КОД_М_ОТК=МХЭС;
   КОД_М_КУД=МХЭП;
   REC=SignToRecord(МОЛС, False);
   if REC<>NIL:
     СДАЛ_ДОЛЖ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
     tmp=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
     tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
     СДАЛ_МОЛ=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp<>"..", tmp, ""));
     СДАЛ_ТАБНОМ=GetCardFieldS("СОТРУДНИКИ", REC, "ПРИЗНАК");
   fi;
   REC=SignToRecord(МОЛП, False);
   if REC<>NIL:
     ПРИН_ДОЛЖ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
     tmp=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
     tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
     ПРИН_МОЛ=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp<>"..", tmp, ""));
     ПРИН_ТАБНОМ=GetCardFieldS("СОТРУДНИКИ", REC, "ПРИЗНАК");
   fi;
   УЧРЕЖД=ВзятьДанныеКонтрагента("", "КИМЯ", True);
     ОКПО=ВзятьДанныеКонтрагента("", "ОКПО", True);
   ГЛ_БУХ=ВзятьДанныеКонтрагента("", "ФБУХ", True);
   for i=1 to len do
     y=InsertFrame(Позиции, i);
     КОДНФА=ExtractWord(1, НФА_ИНВ_COD[i], "|");
     КОДИНВ=ExtractWord(2, НФА_ИНВ_COD[i], "|");
        СЧД=ExtractWord(3, НФА_ИНВ_COD[i], "|");
     Позиции[i].КОД_НФА   = КОДНФА;
     Позиции[i].КОД_ИНВ   = КОДИНВ;
     Позиции[i].СЧДЕБ     = СЧД;
     Позиции[i].СУММА_НФА = НФА_ИНВ_СУМ[i];
     Позиции[i].КОЛ_НФА   = НФА_ИНВ_КОЛ[i];
     Позиции[i].ЦЕНА_НФА  = if(НФА_ИНВ_КОЛ[i]>0, Round(НФА_ИНВ_СУМ[i]/НФА_ИНВ_КОЛ[i], Точн), 0);
     tmp="ИНВВЕД."+КОДНФА+"."+КОДИНВ;
     ВЕД=Name_A(tmp); v1="";
     if ВЕД=" " or ВЕД="":
       BeginChanging(ROинвк);
       Try
         REC=SignToRecord(tmp, False);
         OK=False; Work=False;
         if REC<>NIL:
           k=GetRecordNumber(ROинвк, REC);
           Позиции[i].ДАТА_ПРИОБ=GetFieldD(ROинвк, k, "ДАТА_ИЗГ");
           if Позиции[i].ДАТА_ПРИОБ=1.1.100: 
              Позиции[i].ДАТА_ПРИОБ=РАБ.НФА.B01.ВзятьМИН_ДУЧЕТ_ДЭКСПЛ(КОДНФА,КОДИНВ);
              if Позиции[i].ДАТА_ПРИОБ=1.1.100:
                 Позиции[i].ДАТА_ПРИОБ=GetFieldD(ROинвк, k, "ДАТ_ВЭКСП");
              fi;
           fi;
           Work=LockRecord(ROинвк, k, 0);
         else
           k=InsertRecord(ROинвк);
           Позиции[i].ДАТА_ПРИОБ=РАБ.НФА.B01.ВзятьМИН_ДУЧЕТ_ДЭКСПЛ(КОДНФА,КОДИНВ);
           Work=True;
         fi;
         if Work:
           if Match(КОДИНВ, "УЧН.?????"):
             tmp=НФА.СЕРВИС.КОНСТРУКТОР.ИНВ_НОМЕРА.МаскаВедИнвНомер(СЧД, КОДНФА);
             j=SearchInArray(ИНВ_MSK, tmp);
             if j>0:
               pN=Int(ExtractWord(1, ИНВ_INI[j], "|"));
               lN=Int(ExtractWord(2, ИНВ_INI[j], "|"));
               num=lN-Length(Str(ИНВ_NUM[j]));
               tmp2=RepStr("0", num)+Str(ИНВ_NUM[j]);
               tmp=Delete(tmp, pN, lN);
               tmp=Insert(tmp2, tmp, pN);
               v1=tmp; --Ведомственный номер по умолчанию
               OK=True;
             fi;
           else
             v1=SubStr(КОДИНВ, Length(GetAnaGlossary(КОДИНВ))+2, 255); --Старый присвоенный инвентарный номер
           fi;
           y=PutFieldS(ROинвк, k, "ИНВ",     SubStr(КОДИНВ, Length(GetAnaGlossary(КОДИНВ))+2, 255));
           y=PutFieldS(ROинвк, k, "НФА",     КОДНФА);
           y=PutFieldS(ROинвк, k, "СЧЕТНФА", СЧД);
           y=PutFieldS(ROинвк, k, "ИНВ_ВЕД", v1);
           LastNum=LastNum+1;
           y=PutFieldI(ROинвк, k, "НОМЕР",    LastNum);
           y=PutFieldS(ROинвк, k, "НОМЕРБУМ", Str(LastNum));
           y=PutFieldD(ROинвк, k, "DD",       dBT);
           if OK: ИНВ_NUM[j]=ИНВ_NUM[j]+1; fi;
         fi;
         EndChanging(ROинвк);
       Except
         CancelChanging(ROинвк);
       end;
       Позиции[i].ВЕД_ИНВ=v1;
     else
       Позиции[i].ВЕД_ИНВ=ВЕД; --Ведомственный номер уже присвоен
       Позиции[i].ДАТА_ПРИОБ=РАБ.НФА.B01.ВзятьМИН_ДУЧЕТ_ДЭКСПЛ(Позиции[i].КОД_НФА,Позиции[i].КОД_ИНВ);
     fi;
   od;
   if НОМЕР=0: НОМЕР=РАБ.НФА.FUNC_LIB.NextNumToDate(SelfCRD, "НОМЕР", "ДАТА_НАК", 1.1.100); fi;
   if НОМЕРБУМ="": НОМЕРБУМ=Str(Номер); fi;
   ДАТА_НАК=dBT;
 Finally
   CloseProgress;
   CloseWorkArea(ROинвк);
   CloseWorkArea(ROднфа);
   ToggleAutorefresh(Режим);
 end;
 ClearVariable(NN);
 ПрименитьТочность(",##0.00"+RepStr("#", ТОЧН-2)+";;-");
 ^True;
end;

Proc ЦветаПолей;
var nn, len :Integer;
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo);
 nn=InsertInArraySort(BufField,"УЧРЕЖД");      InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ТОЧН");        InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ОКПО");        InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ИМЯ_М_ОТК");   InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ИМЯ_М_КУД");   InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"КОД_М_ОТК");   InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"КОД_М_КУД");   InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"НОМЕРБУМ");    InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ДАТА_НАК");    InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ИМЯ_НФА");     InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ДАТА_ПРИОБ");  InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ВЕД_ИНВ");     InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"КОЛ_НФА");     InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ЦЕНА_НФА");    InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СУММА_НФА");   InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПРИМЕЧ1");     InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПРИМЕЧ2");     InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СДАЛ_ДОЛЖ");   InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СДАЛ_МОЛ");    InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СДАЛ_ТАБНОМ"); InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СДАЛ_ДАТА");   InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПРИН_ДОЛЖ");   InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПРИН_МОЛ");    InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПРИН_ТАБНОМ"); InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ПРИН_ДАТА");   InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ГЛ_БУХ");      InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"A");           InsertInArray(BufColorBg,nn,coYellow);
 nn=InsertInArraySort(BufField,"D");           InsertInArray(BufColorBg,nn,coYellow);
 len=LengthOfArray(BufField);
 for nn=1 to len do
   if BufColorBg[nn]=coTeal: BufColorFo[nn]=coWhite;
   |  True: BufColorFo[nn]=coBlack;
   fi;
 od;
end;

Proc ТолькоЧтение(Flag:Logical);
var len, k, i, j, ik, jk, n, цвFont, цвBack :Integer;
var ТЧ :Logical;
var tmp :String;
var СекцИмя : Object;
 ClearVariable(ИменаСекций);
 ИменаСекций[1] ="СЕКЦШАПКА1";
 ИменаСекций[2] ="СЕКЦШАПКА2";
 ИменаСекций[3] ="СЕКЦШАПКА3";
 ИменаСекций[4] ="СЕКЦТАБ";
 ИменаСекций[5] ="СЕКЦПОДВАЛ1";
 ИменаСекций[6] ="СЕКЦПОДВАЛ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 Flag: цв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;
 btnOK.Enabled=not(Flag);
 btnОбновить.Enabled=not(Flag);
 cbФиксЦена.Enabled=not(Flag);
 ClearVariable(ИменаСекций);
end;

Proc СформированИзДНФА;
var OK :Logical;
 OK=РАБ.НФА.FUNC_LIB.Документ_Сформирован_из_ОперацийДНФА(CRD, ДНФАID, RECCRD);
 btnОбновить.Enabled=OK;
 lblWarning.Visible=not(OK);
 btnПереход.Visible=OK;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
var tmp :String;
var nn :Integer;
 if Field="ТОЧН":
      Точн=УстановитьТочность(Точн); ^False;
 |  Field="УЧРЕЖД" or Field="ОКПО":
      Реквизиты; ^False;
 |  Field="ИМЯ_М_ОТК" or Field="КОД_М_ОТК":
      tmp=AnaElection("П.*|М.*", False, False, КОД_М_ОТК);
      if tmp="": ^False; fi;
      КОД_М_ОТК=tmp;
      КОД_М_КУД="";
      ^False;
 |  Field="ИМЯ_М_КУД" or Field="КОД_М_КУД":
      if КОД_М_ОТК="": Message("Выберите сначала сдатчика!", mtWarning); Template.Field="ИМЯ_М_ОТК"; ^False; fi;
      tmp=AnaElection(SubStr(КОД_М_ОТК, 1, 1)+".*", False, False, КОД_М_КУД);
      if tmp="": ^False; fi;
      КОД_М_КУД=tmp;
  ^False;
 |  Field="ВИД_АНА":
      ВИД_АНА=ВыборВидаТаблицы(ВИД_АНА); if Защита: EditorApply; fi; ^False;
 |  Field="A": 
      Try nn=InsertFrame(Позиции, Iter+1); Except end;
      ^False;
 |  Field="D":
      if EnqOkCancel("Вы уверены что хотите удалить данную строчку?", mtConfirmation)=cmOk:
        Try DeleteFrame(Позиции, Iter); Iter_Validation; Except end;
      fi;
      ^False;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="УЧРЕЖД" or Field="ОКПО": if УЧРЕЖД="": ОКПО=""; ГЛ_БУХ=""; fi;
 |  Field="ТОЧН": if ТОЧН=0: ТОЧН=4; fi;
 |  Field="КОЛ_НФА":
    if ФиксЦена:
      Позиции[Iter].СУММА_НФА=Round(Позиции[Iter].КОЛ_НФА*Позиции[Iter].ЦЕНА_НФА, Точн);
    else
      Позиции[Iter].ЦЕНА_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_НФА, Точн);
    fi;
 |   Field="ЦЕНА_НФА":
    if Позиции[Iter].КОЛ_НФА=0: Позиции[Iter].КОЛ_НФА=1; fi;
    Позиции[Iter].СУММА_НФА=Round(Позиции[Iter].КОЛ_НФА*Позиции[Iter].ЦЕНА_НФА, Точн);
 |   Field="СУММА_НФА":
    if ФиксЦена:
      if Позиции[Iter].ЦЕНА_НФА=0: Позиции[Iter].ЦЕНА_НФА=Позиции[Iter].СУММА_НФА; fi;
      Позиции[Iter].КОЛ_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].ЦЕНА_НФА, Точн);
    else
      if Позиции[Iter].КОЛ_НФА=0: Позиции[Iter].КОЛ_НФА=1; fi;
      Позиции[Iter].ЦЕНА_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_НФА, Точн);
    fi;
 fi;
end;

Func Field_OnValidateN(Field:String; Iter:Integer; Value:Numeric): Logical;
 if Value<0 : Message('Нельзя вводить отрицательное число.', mtError); ^False; fi;
 if Field="КОЛ_НФА":
   if ФиксЦена:
     Позиции[Iter].СУММА_НФА=Round(Value*Позиции[Iter].ЦЕНА_НФА, Точн);
   else
     Позиции[Iter].ЦЕНА_НФА=Round(Позиции[Iter].СУММА_НФА/Value, Точн);
   fi;
 |  Field="ЦЕНА_НФА":
   if Позиции[Iter].КОЛ_НФА=0: Позиции[Iter].КОЛ_НФА=1; fi;
   Позиции[Iter].СУММА_НФА=Round(Позиции[Iter].КОЛ_НФА*Value, Точн);
 |  Field="СУММА_НФА":
   if ФиксЦена:
     if Позиции[Iter].ЦЕНА_НФА=0: Позиции[Iter].ЦЕНА_НФА=Value; fi;
     Позиции[Iter].КОЛ_НФА=Round(Value/Позиции[Iter].ЦЕНА_НФА, Точн);
   else
     if Позиции[Iter].КОЛ_НФА=0: Позиции[Iter].КОЛ_НФА=1; fi;
     Позиции[Iter].ЦЕНА_НФА=Round(Value/Позиции[Iter].КОЛ_НФА, Точн);
   fi;
 fi;
 ^True;
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;
var REC :Record;
var стрФИО, стрДОЛ, стрТАБ, name, tmp, tmp2 :String;
 Template.HideEditor(False);
 name=asString(Template.Field); tmp=""; стрФИО=""; стрДОЛ=""; стрТАБ="";
 Try tmp=GetVariableS(name); Except ^Cur; end;
 REC=OpenCardFile("СОТРУДНИКИ", "", SignToRecord(tmp), crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 стрДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
 tmp=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
 стрФИО=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp<>"..", tmp, ""));
 стрТАБ=GetCardFieldS("СОТРУДНИКИ", REC, "ПРИЗНАК");
 if name="СДАЛ_ДОЛЖ"  : СДАЛ_ДОЛЖ=стрДОЛ; СДАЛ_МОЛ=стрФИО; СДАЛ_ТАБНОМ=стрТАБ;
 |  name="СДАЛ_МОЛ"   : СДАЛ_ДОЛЖ=стрДОЛ; СДАЛ_МОЛ=стрФИО; СДАЛ_ТАБНОМ=стрТАБ;
 |  name="СДАЛ_ТАБНОМ": СДАЛ_ДОЛЖ=стрДОЛ; СДАЛ_МОЛ=стрФИО; СДАЛ_ТАБНОМ=стрТАБ;
 |  name="ПРИН_ДОЛЖ"  : ПРИН_ДОЛЖ=стрДОЛ; ПРИН_МОЛ=стрФИО; ПРИН_ТАБНОМ=стрТАБ;
 |  name="ПРИН_МОЛ"   : ПРИН_ДОЛЖ=стрДОЛ; ПРИН_МОЛ=стрФИО; ПРИН_ТАБНОМ=стрТАБ;
 |  name="ПРИН_ТАБНОМ": ПРИН_ДОЛЖ=стрДОЛ; ПРИН_МОЛ=стрФИО; ПРИН_ТАБНОМ=стрТАБ;
 fi;
 ^"";
end;

Func Номер_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
 Номер=РАБ.НФА.FUNC_LIB.NextNumNotCurr(SelfCRD, "Номер", Current);
 НомерБум=Str(Номер);
 ^"";
end;

Func ГЛ_БУХ_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
 ГЛ_БУХ=ВзятьДанныеКонтрагента("", "ФБУХ", True);
 ^"";
end;

Func НФА_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Iter :Integer;
var tmp :String;
 Template.HideEditor(False);
 Iter=asInteger(Template.Frame);
 tmp=AnaElection("НФА.101.*|НФА.102.*|НФА.103.*", False, False, Позиции[Iter].КОД_НФА);
 if tmp="": ^Cur; fi;
 Позиции[Iter].КОД_НФА=tmp;
 ^"";
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 btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnOK": EditorApply; Close;
 |  Sender="btnClose": if Защита=False: EditorCancel; fi; Close;
 |  Sender="btnОбновить": if ОбновитьНакладную: Message("Обновление накладной успешно завершено!", mtInformation); fi;
 |  Sender="btnПереход": РАБ.НФА.FUNC_LIB.Перейти_к_ОперацинномуДокументу(CRD, BLNCRD, ДНФАID, RECCRD, GetActiveBlankName);
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var tmp :String;
 EnableCommands(False, cmDublRec);
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("НФА")+"\Настройки\","RPO_STD_000.cfg");
 ЦветаПолей;
 tmp=UserName(AliasName(SelfCRD));
 Пользов=if(tmp<>"", "Пользователь - "+tmp, "Пользователь локальной версии");
 First=True;
end;

Proc Template_AfterOpen(Create:Logical); -- при открытии шаблона
 if First: 
   if NewREC:
     НОМЕР=РАБ.НФА.FUNC_LIB.NextNumToDate(SelfCRD, "НОМЕР", "ДАТА_НАК", 1.1.100);
     НОМЕРБУМ=Str(Номер);
     ДАТА_НАК=ToDay;
     ТОЧН=4;
     Защита=False;
   fi;
   Iter_Validation;
   ТолькоЧтение(Защита);
   ПрименитьТочность(",##0.00"+RepStr("#", ТОЧН-2)+";;-");
   СформированИзДНФА;
 fi;
 First=False;
end;

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

Proc Template_onRead; -- при считывании шаблона
 if recCurrent<>nil:
    if recCurrent<>Current:
       recCurrent=Current(recCurrent);
    fi;
    recCurrent=nil;
 fi;
 Очистить;
 if First=False:
   if NewREC:
     НОМЕР=РАБ.НФА.FUNC_LIB.NextNumToDate(SelfCRD, "НОМЕР", "ДАТА_НАК", 1.1.100);
     НОМЕРБУМ=Str(Номер);
     ДАТА_НАК=ToDay;
     ТОЧН=4;
     Защита=False;
   fi;
   Iter_Validation;
   ТолькоЧтение(Защита);
   ПрименитьТочность(",##0.00"+RepStr("#", ТОЧН-2)+";;-");
   СформированИзДНФА;
 fi;
 Template.Object="btnClose";
end;

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

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

Func ВЕД_ИНВ__OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
  if инвномер=0:ПОЗИЦИИ[Iter].ВЕД_ИНВ=Value ;fi;
  Return  true;
end;


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