-- Шаблон создан мастером бланков
-- 27.10.2008 14:03:29
--
БланкСШаблоном "НАКЛАДНАЯ. Типовая межотраслевая форма N М-15 - редактор", Редактор РПО_НАКЛАДНАЯ_М15;

btnOK :Object; btnClose :Object; btnОбновить :Object; btnПереход :Object; cbЗащита :Object; cbФиксЦена :Object; cbСвыше1000 :Object;
СекцШАПКА0 :Object; СекцШАПКА1 :Object; СекцШАПКА2 :Object; СекцШАПКА3 :Object; СекцШАПКА4 :Object;
СекцПОДВАЛ1 :Object; СекцТАБ :Object; СекцПОД :Object; lblWarning :Object;
Подпись1:l;
Подпись2:l;
flgНомерИзДНФА     :Logical=[False];
бухкмнт:S=['Бухгалтер'];
Начслкмнт:S=['Начальник службы'];
  МолБух:Строка;
  МолНач:Строка;
  ФИОБух:Строка=Name_A(МолБух);
  МолДбух:Строка=if(ФИОБух<>' ':Раб.НФА.B01.ПолеПоПризнакуС(МолБух,'ДОЛЖНОСТЬ.ДОЛЖ'),'');
  ФИОнач:Строка=Name_A(МолНач);
  МолДнач:Строка=if(ФИОнач<>' ':Раб.НФА.B01.ПолеПоПризнакуС(МолНач,'ДОЛЖНОСТЬ.ДОЛЖ'),'');
Func ВыборМол(S:S;I:I):L;
var R:Record;
var n:i;
var Сч:s;
var sss:s;
-- if s='ФИОКН':ФИОК=AnaElection("МОЛ.*");
--  | s='МолН' :МОЛ=AnaElection("МОЛ.*");
 if s='ФИОБух' :МОЛбух=AnaElection("МОЛ.*");
  | s='ФИОНач' :МОЛнач=AnaElection("МОЛ.*");
 fi;
^false;
end;

var recCurrent:record;
var МаскаСЧ        :String="(*.?.10?.??.???&~*.?.104.??.???)|ЗАБ.??.10?.??";
var NewREC         :Logical=(CurrentState=crdusInserted);
var First          :Logical;
var ФиксЦена       :Logical;
var Свыше1000      :Logical=[False];
var ВИД_АНА1       :Integer=[2];
var ВИД_АНА2       :Integer=[2];
var ВИД_АНА3       :Integer=[0];
var ВИД_АНА4       :Integer=[2];
var SelfCRD        :String="РПО_НАКЛАДНАЯ_М15";
var A :String="+";   var D :String="-";
var Пользов        :String;
var Buf[]          :String;
var BufREC[]       :Record;
var BufI[]         :Integer;
var СЧНФА_[]       :String;
var ИМЯ_НФАv[]     :String=Name_A(Позиции[$].КОД_НФА);
var ИМЯ_НФА_[]     :String=if(ИМЯ_НФАv[$]<>"" and ИМЯ_НФАv[$]<>" ", ИМЯ_НФАv[$], Позиции[$].КОД_НФА);
var ИМЯ_П_ОТК      :String=РАБ.НФА.B01.ФорматСтрокиАн(КОД_П_ОТК,' ',CHR(13), ВИД_АНА1);
var ИМЯ_П_КУД      :String=РАБ.НФА.B01.ФорматСтрокиАн(КОД_П_КУД,' ',CHR(13), ВИД_АНА2);
var ИМЯ_П_ОТВ      :String=РАБ.НФА.B01.ФорматСтрокиАн(КОД_П_ОТВ,' ',CHR(13), ВИД_АНА4);
var ИМЯ_М_ОТК_     :String=РАБ.НФА.B01.ФорматСтрокиАн(КОД_М_ОТК,' ',CHR(13), ВИД_АНА1);
var ИМЯ_М_КУД_     :String=РАБ.НФА.B01.ФорматСтрокиАн(КОД_М_КУД,' ',CHR(13), ВИД_АНА2);
var ИМЯ_М_ОТВ_     :String=РАБ.НФА.B01.ФорматСтрокиАн(КОД_М_ОТВ,' ',CHR(13), ВИД_АНА4);

--var ИМЯ_П_ОТК      :String=РАБ.НФА.FUNC_LIB.FormatAna(КОД_П_ОТК, ВИД_АНА1, "наименования нет", "-");
--var ИМЯ_П_КУД      :String=РАБ.НФА.FUNC_LIB.FormatAna(КОД_П_КУД, ВИД_АНА2, "наименования нет", "-");
--var ИМЯ_М_ОТК_     :String=РАБ.НФА.FUNC_LIB.FormatAna(КОД_М_ОТК, ВИД_АНА1, "наименования нет", "-");
--var ИМЯ_М_КУД_     :String=РАБ.НФА.FUNC_LIB.FormatAna(КОД_М_КУД, ВИД_АНА2, "наименования нет", "-");
var ИТ_КОЛ_ЗАТ     :Numeric=SumOfArray(Позиции[].КОЛ_ЗАТРЕБ);
var ИТ_КОЛ_ОТП     :Numeric=SumOfArray(Позиции[].КОЛ_ОТПУЩ);
var ИТ_СУММА       :Numeric=SumOfArray(Позиции[].СУММА_НФА);
var ИТ_СУММА_НДС   :Numeric=SumOfArray(Позиции[].СУММА_НДС);
var СУММА_НФА_[]   :Numeric=Позиции[$].СУММА_НФА+Позиции[$].СУММА_НДС;
var ИТ_СУММА_      :Numeric=SumOfArray(СУММА_НФА_,Позиции);
--var ИТ_КОЛ_ОТП_ПРОПИСЬ:s=slo_(ИТ_КОЛ_ОТП,'ДОКН');
var ИТ_КОЛ_ОТП_ПРОПИСЬ:s=slo_(Позиции,'ДОКНАИМ');
var ИТ_СУММА_ПРОПИСЬ:s=slo(ИТ_СУММА_);
--
var УслНомДоп[]    :i;-- список номеров видов операций не входящий в УслНом и нуждающийся в доп проверкена присутствие в данном движении (усл>255)
var УслНом[]       :i;-- список номеров видов операций, работающих в данном движении
var СписокПроводок[]:i;--
var Select[]       :String;
var УслИМЯ[]       :String;
var УслДЕБ[]       :String;
var УслКРЕ[]       :String;
var УслАНА[]       :String;
var ДебНФА[]       :Logical;
--
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(УслИМЯ); ClearVariable(НФА_ИНВ_COD); ClearVariable(ИНВ_MSK); ClearVariable(Buf);
 ClearVariable(УслДЕБ); ClearVariable(НФА_ИНВ_СУМ); ClearVariable(ИНВ_INI); ClearVariable(BufI);
 ClearVariable(УслКРЕ); ClearVariable(НФА_ИНВ_КОЛ); ClearVariable(ИНВ_NUM);
 ClearVariable(УслАНА);
 ClearVariable(ДебНФА);
end;

Proc Очистить;
 ClearVariable(ИМЯ_НФАv); ClearVariable(СЧНФА_);
 ClearVariable(ИМЯ_НФА_); ClearVariable(BufREC);
 ОчиститьПриРасчете;
end;

Func ВыборВидаТаблицы(State:Integer) :Integer;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="код + наименование";
 Buf[2]="только наименование";
 Buf[3]="только код";
 nn=Alternate("Выберите способ отображения аналитики", Buf, -1, State+1, 12);
 if nn=0: ^State; fi;
 ^(nn-1);
end;

Func ВыборВидаНомера(State:Integer) :Integer;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="номенклатурный номер";
 Buf[2]="инвентарный номер";
 Buf[3]="учетный номер";
 nn=Alternate("Выберите вид колонки N4 накладной.", Buf, -1, State+1, 12);
 if nn=0: ^State; fi;
 ^(nn-1);
end;

Proc ВыборПеременнойДляНомера(State:Integer);
 if State=2: СекцТАБ.Cell(1, 8, CellContents, "КОД_ИНВ");
 |  State=1: СекцТАБ.Cell(1, 8, CellContents, "ВЕД_ИНВ");
 else        СекцТАБ.Cell(1, 8, CellContents, "НОМЕН_НОМ");
 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].КОД_НФА="": Try DeleteFrame(Позиции, nn); Except end; else nn=nn+1; fi; od;
 Iter_Validation;
end;

Func TemplateSaveOK :Logical; -- проверка правильности ввода данных
 if НОМЕРБУМ="": Message("Не задан номер требования-накладной!", mtWarning); Template.Field="НОМЕРБУМ"; ^False; fi;
 if ДАТА_НАК=1.1.100: Message("Не задана дата требования-накладной!", 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="ДАТА_НАК": ^ДАТА_НАК;
 fi;
end;

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

Proc SetNDOC;
var ni:i;
var ns:s;
 ns='';
 if flgНомерИзДНФА and (ДНФАID<>0 or (reccrd<>0 and crd='РПО_ОПЕРАЦИИДНФА')):
    if ДНФАID<>0:ni=ДНФАID;
     | true:ni=reccrd;
    fi;
    try
     ns=getcardfields('РПО_ОПЕРАЦИИДНФА',IntegerToRecord(ni),'НОМЕР');
     ni=int(ns);
    except
     ni=0;
    end;
  | true:
    Try
      ni=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМЕР,НОМЕРБУМ", "ДАТА_НАК", "Ukey<>"+RecordToString(Current), 1.1.100);
    Except
      ni=0;
    end;
    if ni=0: ni=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМЕР", "ДАТА_НАК", "Ukey<>"+RecordToString(Current), 1.1.100); fi;
 fi;
 if НОМЕР<>ni:НОМЕР = ni;fi;
 if ns='':ns=Str(ni);fi;
 if НОМЕРБУМ<>ns:НОМЕРБУМ = ns;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, 11, CellFormat, Mask);
-- СекцТАБ.Cell(1, 12, CellFormat, Mask);
-- СекцТАБ.Cell(1, 13, CellFormat, Mask);
-- СекцТАБ.Cell(1, 14, CellFormat, Mask);
-- СекцПОД.Cell(1,  3, CellFormat, Mask);
-- СекцПОД.Cell(1,  4, CellFormat, Mask);
-- СекцПОД.Cell(1,  6, 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 НФА_Выбор(OldValue:String) :String;
var out :String;
 out=AnaElection("НФА.101.*|НФА.102.*|НФА.105.*", False, False, OldValue);
 if out="": ^OldValue; fi;
 ^out;
end;

Func Счет26_Выбор(OldValue:String) :String;
var out :String;
 out=AccountElection("*.?.101.??.310|*.?.102.??.320|*.?.105.??.340|ЗАБ.??.101.??|ЗАБ.??.102.??|ЗАБ.??.105.??", False, OldValue);
 if out="": ^OldValue; fi;
 ^out;
end;

Proc СинхрСчет26;
var num, Iter :Integer;
 num=Позиции;
 if num>0: 
   for Iter=1 to num do 
     if Match(Позиции[Iter].СЧНФА, "???.????.???????.???.?.???.??.???"):    СЧНФА_[Iter]=SubStr(Позиции[Iter].СЧНФА, 24, 6);
     |  Match(Позиции[Iter].СЧНФА, "???.??.??.??.??.??.????.?.???.??.???"): СЧНФА_[Iter]=SubStr(Позиции[Iter].СЧНФА, 27, 6);
     |  Match(Позиции[Iter].СЧНФА, "ЗАБ.??.10?.??"):                        СЧНФА_[Iter]=Позиции[Iter].СЧНФА;
     else СЧНФА_[Iter]="";
     fi;
   od;
 fi;
end;

Func USE_ИНВ_КАРТОЧКА(СЧ:String; Цена:Numeric;Д1:date) :Logical;
 if Match(СЧ, "*.?.101.1?.???"): ^True;
  | Match(СЧ, "*.?.101.3?.???"):
       if not Match(СЧ, "*.101.37.???") :
          if Цена>Общ_Пер('ОС_РАСХ',Д1): ^True; fi;
        | true:
          if Цена>Общ_Пер('ОС_100_БИБЛ',Д1): ^True; fi;
       fi;
 |  Match(СЧ, "*.?.102.??.???"): ^True;
 |  Match(СЧ, "*.?.103.??.???"): ^True;
 fi;
 ^False;
end;
Proc ИнициализироватьУсловияОбновления;
 ClearVariable(УслИМЯ); ClearVariable(УслКРЕ); ClearVariable(УслДЕБ); ClearVariable(УслАНА); ClearVariable(ДебНФА);ClearVariable(УслНомДоп);ClearVariable(УслНом);ClearVariable(СписокПроводок);
 УслИМЯ[1]  = "Снятие с учета НФА, уценка";
 УслДЕБ[1]  = "*&~(ЗАБ.??.10?.??|*.?.10?.??.??0&(*1.??.?10|*2.??.?20|*5.??.?40))";
 УслКРЕ[1]  = "ЗАБ.??.10?.??|(*.?.10?.??.4?0&(*1.?4.410|*1.?5.410|*1.?6.410|*1.?8.410|*2.??.420|*5.??.440))"; -- ИНВ может - ЦЕНА любая
 УслАНА[1]  = "НФА.*";
 ДебНФА[1]  = False;

 УслИМЯ[2]  = "Внутреннее перемещение объекта";
 УслДЕБ[2]  = "ЗАБ.??.10?.??|(*.?.10?.??.3?0&(*1.?4.310|*1.?5.310|*1.?6.310|*1.?8.310|*2.??.320|*5.??.340))"; -- ИНВ может - ЦЕНА любая
 УслКРЕ[2]  = "ЗАБ.??.10?.??|(*.?.10?.??.3?0&(*1.?4.310|*1.?5.310|*1.?6.310|*1.?8.310|*2.??.320|*5.??.340))"; -- ИНВ может - ЦЕНА любая
 УслАНА[2]  = "НФА.*";
 ДебНФА[2]  = True;

 УслИМЯ[3]  = "Принятие к учету НФА, дооценка";
 УслДЕБ[3]  = "ЗАБ.??.10?.??|(*.?.10?.??.3?0&(*1.?4.310|*1.?5.310|*1.?6.310|*1.?8.310|*2.??.320|*5.??.340))"; -- ИНВ может - ЦЕНА любая
 УслКРЕ[3]  = "*&~(ЗАБ.??.10?.??|*.?.10?.??.??0&(*1.??.?10|*2.??.?20|*5.??.?40))";
 УслАНА[3]  = "НФА.*";
 ДебНФА[3]  = True;

 УслИМЯ[4]  = "Снятие со 106 ЦС";
 УслДЕБ[4]  = "*&~(ЗАБ.??.10?.??|*.?.106.??.4?0|*.?.106.34.2??)";
 УслКРЕ[4]  = "ЗАБ.??.10?.??|*.?.106.??.4?0|*.?.106.34.2??"; -- ИНВ может - ЦЕНА любая
 УслАНА[4]  = "НФА.*";
 ДебНФА[4]  = False;

 УслИМЯ[5]  = "Принятие на 106 ЦС";
 УслДЕБ[5]  = "ЗАБ.??.10?.??|*.?.106.??.4?0|*.?.106.34.2??"; -- ИНВ может - ЦЕНА любая
 УслКРЕ[5]  = "*&~(ЗАБ.??.10?.??|*.?.106.??.4?0|*.?.106.34.2??)";
 УслАНА[5]  = "НФА.*";
 ДебНФА[5]  = True;

 УслИМЯ[6]  = "Снятие с учета материалы+забаланс, ";
 УслДЕБ[6]  = "*&~(ЗАБ.??.105.??|ЗАБ.??.101.??|*.?.105.??.4?0)";
 УслКРЕ[6]  = "ЗАБ.??.105.??|ЗАБ.??.101.??|*.?.105.??.4?0"; -- ИНВ может - ЦЕНА любая
 УслАНА[6]  = "НФА.*";
 ДебНФА[6]  = False;

 выход;
 УслИМЯ[1]  = "Выдача в эксплуатацию свыше 3000 рублей";
 УслДЕБ[1]  = "(*.?.401.2.271|*.2.109.??.271)&???.?.??.?????.??.????.?.???.??.???"; -- ИНВ нет - ЦЕНА от 1001 руб.
 УслКРЕ[1]  = "(*.?.101.?4.410|*.?.101.?5.410|*.?.101.?6.410|*.?.101.?8.410)&???.?.??.?????.??.????.?.???.??.???";
 УслАНА[1]  = "НФА.*";
 ДебНФА[1]  = False;

 УслИМЯ[2]  = "Внутреннее перемещение объекта";
 УслДЕБ[2]  = "((*.?.101.??.310|*.?.102.??.320|*.?.105.??.340)&???.????.???????.???.?.???.??.???)|???.??.??.??.??.??.????.?.103.??.330"; -- ИНВ может - ЦЕНА любая
 УслКРЕ[2]  = "((*.?.101.??.310|*.?.102.??.320|*.?.105.??.340)&???.????.???????.???.?.???.??.???)|???.??.??.??.??.??.????.?.103.??.330";
 УслАНА[2]  = "НФА.*";
 ДебНФА[2]  = True;

 УслИМЯ[3]  = "Принятие к учету ОС";
 УслДЕБ[3]  = "???.????.???????.???.?.101.??.310"; -- ИНВ может - ЦЕНА любая
 УслКРЕ[3]  = "???.????.???????.???.?.106.?1.310|00";
 УслАНА[3]  = "НФА.*";
 ДебНФА[3]  = True;

 УслИМЯ[4]  = "Принятие к учету нематериальных активов";
 УслДЕБ[4]  = "???.????.???????.???.?.102.??.320"; -- ИНВ есть - ЦЕНА любая
 УслКРЕ[4]  = "???.????.???????.???.?.106.32.?20|00";
 УслАНА[4]  = "НФА.*";
 ДебНФА[4]  = True;

 УслИМЯ[5]  = "Принятие к учету материальных запасов";
 УслДЕБ[5]  = "???.????.???????.???.?.105.??.340&~???.????.???????.???.?.105.37.340"; -- ИНВ нет - ЦЕНА любая
 УслКРЕ[5]  = "00|((*.?.106.34.440|*.?.208.34.660|*.?.302.34.730|*.?.304.04.340)&???.????.???????.???.?.???.??.???)|((*.?.401.10.151|*.?.401.10.180)&???.?.??.?????.??.????.?.???.??.???)";
 УслАНА[5]  = "НФА.*";
 ДебНФА[5]  = True;

 УслИМЯ[6]  = "Принятие к учету готовой продукции";
 УслДЕБ[6]  = "???.????.???????.???.?.105.37.340";   -- ИНВ нет - ЦЕНА любая
 УслКРЕ[6]  = "???.????.???????.???.?.106.34.440|00";
 УслАНА[6]  = "НФА.*";
 ДебНФА[6]  = True;

 УслИМЯ[7]  = "Списание готовой продукции при ее отпуске заказчику";
 УслДЕБ[7]  = "???.?.??.?????.??.????.?.401.10.130"; -- ИНВ нет - ЦЕНА любая
 УслКРЕ[7]  = "???.????.???????.???.?.105.37.440";
 УслАНА[7]  = "НФА.*";
 ДебНФА[7]  = False;

 УслИМЯ[8]  = "Оприходование материалов от ликвидации ОС"; -- ИНВ нет - ЦЕНА любая
 УслДЕБ[8]  = "???.????.???????.???.?.105.3?.340&~???.????.???????.???.?.105.37.340";
 УслКРЕ[8]  = "???.?.??.?????.??.????.?.401.10.172";
 УслАНА[8]  = "НФА.*";
 ДебНФА[8]  = True;

 УслИМЯ[9]  = "Списание НФА (в части предоставления работ, услуг) заказчику"; -- ИНВ нет - ЦЕНА любая
 УслДЕБ[9]  = "???.?.??.?????.??.????.?.401.10.130";
 УслКРЕ[9]  = "(*.?.106.?1.410|*.?.106.32.420|*.?.106.34.440)&???.????.???????.???.?.???.??.???";
 УслАНА[9]  = "НФА.*";
 ДебНФА[9]  = False;

 УслИМЯ[10] = "Оприходование излишков"; -- ИНВ может - ЦЕНА любая
 УслДЕБ[10] = "((*.?.101.??.310|*.?.102.??.320|*.?.105.37.340)&???.????.???????.???.?.???.??.???)|???.??.??.??.??.??.????.?.103.??.330";
 УслКРЕ[10] = "???.?.??.?????.??.????.?.401.10.180";
 УслАНА[10] = "НФА.*";
 ДебНФА[10] = True;

 УслИМЯ[11] = "ОС в пути";              -- ИНВ нет - ЦЕНА любая
 УслДЕБ[11] = "???.????.???????.???.?.107.?1.310";
 УслКРЕ[11] = "???.????.???????.???.?.304.04.310|???.??.??.??.??.??.????.?.201.?6.610";
 УслАНА[11] = "НФА.*";
 ДебНФА[11] = True;

 УслИМЯ[12] = "НМА в пути";             -- ИНВ нет - ЦЕНА любая
 УслДЕБ[12] = "???.????.???????.???.?.107.32.320";
 УслКРЕ[12] = "???.????.???????.???.?.304.04.320|???.??.??.??.??.??.????.?.201.?6.610";
 УслАНА[12] = "НФА.*";
 ДебНФА[12] = True;

 УслИМЯ[13] = "Материалы в пути";       -- ИНВ нет - ЦЕНА любая
 УслДЕБ[13] = "???.????.???????.???.?.107.33.340";
 УслКРЕ[13] = "???.????.???????.???.?.304.04.340|???.??.??.??.??.??.????.?.201.?6.610";
 УслАНА[13] = "НФА.*";
 ДебНФА[13] = True;

 УслИМЯ[14] = "Принятие к учету ювелирных изделий";          -- ИНВ нет - ЦЕНА любая
 УслДЕБ[14] = "???.??.??.??.??.??.????.?.101.08.310_";
 УслКРЕ[14] = "???.??.??.??.??.??.????.?.106.01.410_|00";
 УслАНА[14] = "НФА.*";
 ДебНФА[14] = True;

 УслИМЯ[15] = "Оприходование излишков ювелирных изделий";    -- ИНВ нет - ЦЕНА любая
 УслДЕБ[15] = "???.??.??.??.??.??.????.?.101.08.310_";
 УслКРЕ[15] = "???.??.??.??.??.??.????.?.401.01.180_";
 УслАНА[15] = "НФА.*";
 ДебНФА[15] = True;

 УслИМЯ[16] = "Учет на забалансе";    -- ИНВ нет - ЦЕНА любая
 УслДЕБ[16] = "ЗАБ.??.101.??|ЗАБ.??.102.??|ЗАБ.??.105.??";
 УслКРЕ[16] = "ЗАБАЛАНС|00Z";
 УслАНА[16] = "НФА.*";
 ДебНФА[16] = True;

 УслИМЯ[17] = "Учет на забалансе";    -- ИНВ нет - ЦЕНА любая
 УслДЕБ[17] = "ЗАБАЛАНС";
 УслКРЕ[17] = "ЗАБ.??.101.??|ЗАБ.??.102.??|ЗАБ.??.105.??";
 УслАНА[17] = "НФА.*";
 ДебНФА[17] = False;

 УслИМЯ[18] = "Учет на забалансе";    -- ИНВ нет - ЦЕНА любая
 УслДЕБ[18] = "ЗАБ.??.101.??|ЗАБ.??.102.??|ЗАБ.??.105.??";
 УслКРЕ[18] = "ЗАБ.??.101.??|ЗАБ.??.102.??|ЗАБ.??.105.??";
 УслАНА[18] = "НФА.*";
 ДебНФА[18] = True;
end;

Func ОбновитьНакладную :Logical;
var REC :Record;
var CRDинвк, УслПР, СЧД, СЧК, СЧНФА, КОДНФА, КОДИНВ, ВЕД, tmp, tmp2, v1,ss1,ss2,ss3,КОНТП,КОНТС,ПБСП,ПБСС, ss,OKOF,УслАнПров :String;
var КОНТ, ПОДС, ПОДП, МХЭС, МХЭП, МОЛС, МОЛП :String;
var OK, Режим, Work,Work1, fИНВ, fЭКС :Logical;
var RECID_REF, ROднфа, ROинвк, k, len, i, j, y, z, LastNum, pN, lN, num ,ii1,ii2,wa_control,rs:Integer;
var Цена, SUM, KOL :Numeric;
var dBT, dET :Date;
var CRDwork, BLNwork, ДНФАID_16, fld_ДАТЫ_ОПЕР :String;

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

-- REC=IntegerToRecord(ДНФАID); OK=False;
-- if ДНФАID>0: REC=IntegerToRecord(ДНФАID); CRDднфа='РПО_ОПЕРАЦИИДНФА';blnCRD_="НФА.ЖУР.ОПЕРАЦИИДНФА";ДНФАID_16=Str16(ДНФАID);fДАТОПЕР='ДАТОПЕР' ;fi;
-- if RECCRD>0: REC=IntegerToRecord(RECCRD); CRDднфа=CRD               ;blnCRD_=BLNCRD                ;ДНФАID_16=Str16(RECCRD);fДАТОПЕР='ДАТАОПЕР';fi;
-- if REC<>NIL: OK=RecordExists(CRDднфа, REC); fi;
-- if OK=False: Message("Не найдена ссылка на операцию движения НФА.^MРасчет невозможен!", mtError); ^False; fi;

 OK=False;
 RECID_REF=0;
 REC=NIL;
 if CRD<>"" and CRD<>"РПО_ОПЕРАЦИИДНФА":
   CRDwork   = CRD;
   RECID_REF=RECCRD;
   if RECID_REF=0 and ДНФАID<>0: RECID_REF=ДНФАID; fi; -- на всякий случай
   if RECID_REF<>0:
     BLNwork        = BLNCRD;
     REC            = IntegerToRecord(Abs(RECID_REF));
     ДНФАID_16      = Str16(Abs(RECID_REF));
     fld_ДАТЫ_ОПЕР  = РАБ.БЮДЖЕТ2005.ПолеДатыПроводкиКартотеки(CRDwork);
     if fld_ДАТЫ_ОПЕР="": fld_ДАТЫ_ОПЕР = 'ДАТАОПЕР'; fi;
   fi;
 else
   CRDwork   = "РПО_ОПЕРАЦИИДНФА";
   RECID_REF = ДНФАID;
   if RECID_REF=0 and RECCRD<>0: RECID_REF=RECCRD; fi;
   if RECID_REF<>0:
     BLNwork        = "НФА.ЖУР.ОПЕРАЦИИДНФА";
     REC            = IntegerToRecord(Abs(RECID_REF));
     ДНФАID_16      = Str16(Abs(RECID_REF));
     fld_ДАТЫ_ОПЕР  = 'ДАТОПЕР';
   fi;
 fi;
 if REC<>NIL: OK=RecordExists(CRDwork, REC); fi;
 if not OK: Message("Не найден операционный документ^Mиз которого сформирован текущий документ.^MРасчет невозможен!", mtError); ^False; fi;

 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ROднфа=OpenWorkArea(CRDwork, "", "Ukey="+RecordToString(REC));
 ROинвк=OpenWorkArea(CRDинвк, "", "1=0");
 ShowProgress(0, "Подготовка ...");
 Try
   Refresh(False);
   dBT=GetFieldD(ROднфа, 1, fld_ДАТЫ_ОПЕР);
   dET=dBT+1;
--   УслПР="(*.?.10?.??.???&~*.?.104.??.???)|ЗАБ.??.10?.??"+"{НФА.*&ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"}";
--   Выключили из условия отбора проводок НФА.* -> включили НФА.* в "ИнициализироватьУсловияОбновления"
   ОчиститьПриРасчете;
   ИнициализироватьУсловияОбновления;
   len=LengthOfArray(УслИМЯ); --количество нужных условий (принятие к учету)


   if CRDwork='РПО_НФА_СПРАВКА':
      wa_control=OpenWorkArea('РПО_НФА_СПРАВКА_ПРОВОДКИ','','НФА_СПРАВКА="'+GetFieldS(ROднфа, 1, "НФА_СПРАВКА")+'"');
      rs=records(wa_control);
      УслАнПров='{НФА.*';
      УслАнПров=Раб.НФА.B01.ab(УслАнПров,'&',GetFieldS(ROднфа, 1, "МХЭ_ОТККОД_ОБЩ"));
      УслАнПров=Раб.НФА.B01.ab(УслАнПров,'&',GetFieldS(ROднфа, 1, "МОЛ_ОТККОД"));
      ss=GetFieldS(ROднфа, 1, "ДОП_АН_КОД");
      ss=Раб.СТР.ЗаменаПодстрокиВсе(ss,'  ',' ');
      ss=Раб.СТР.ЗаменаПодстрокиВсе(ss,' ','&');
      УслАнПров=Раб.НФА.B01.ab(УслАнПров,'&',ss);
      УслАнПров=Раб.НФА.B01.ab(УслАнПров,'&','НФА_СПРАВКА.'+str(GetFieldI(ROднфа, 1, "СПОСОБ_РАСЧЕТА")))+"}";
      УслПР=МаскаСЧ+УслАнПров;
    | true: 
       УслАнПров="{НФА.*&ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"}";
       УслПР=МаскаСЧ+УслАнПров;
   fi;



   ------------------ выбор условия формирования -----------------------------------
   for y=1 to len do -- len=(условия принятия к учету)
     ii1=Length(УслДЕБ[y])+Length(УслКРЕ[y])+1;
     ii2=Length(УслАнПров);
--     ii2=Length("{ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"&("+УслАНА[y]+")}");
--     if ii1+ii2<254: ss1=УслДЕБ[y]+"/"+УслКРЕ[y]+"{ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"&("+УслАНА[y]+")}";
     if ii1+ii2<254: ss1=УслДЕБ[y]+"/"+УслКРЕ[y]+УслАнПров;
      | true:ss1='';ДобавитьВмассив(УслНомДоп,true,false,y);
     fi;
     if ss1<>'':-- проверка на присутствие проводок по данному виду в данном движении
       if CRDwork='РПО_НФА_СПРАВКА':
          for Transaction k=ss1, dBT, dET
          do
             if GetRecordNumber(wa_control,TransRecord(k))>0:
                ДобавитьВмассив(УслНом,true,false,y);ДобавитьВмассив(СписокПроводок,true,false,k);break;
             fi;
          od;
        | true:
          for Transaction k=ss1, dBT, dET
          do
                ДобавитьВмассив(УслНом,true,false,y);ДобавитьВмассив(СписокПроводок,true,false,k);break;
          od;
       fi;
     fi;
   od;
   len=ДлинаМассива(УслНомДоп);
   ii1=ДлинаМассива(УслНом);
   if len>0: -- проверка УслНомДоп
      if CRDwork='РПО_НФА_СПРАВКА':

         for y=1 to len do -- len=(условия принятия к учету)
           for Transaction k=УслПР, dBT, dET do
             if GetRecordNumber(wa_control,TransRecord(k))>0:

                if поисквмассиве(СписокПроводок,k,true)<1:--проводку еще не обрабатывали
                  ДобавитьВмассив(СписокПроводок,true,false,k);
                  СЧД=TransDeb(k);
                  СЧК=TransCre(k);
                    OK=True;
                    if OK:OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧД, УслДЕБ[y]));fi;
                    if OK:OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, УслКРЕ[y]));fi;
      --              if OK:
      --                if УслАНА[y]<>"":
      --                  OK=False;
      --                  for i=1 to z do
      --                    OK=РАБ.НФА.FUNC_LIB.ПризнакСоотвМаске(TransSignName(k, i), УслАНА[y]);
      --                    if OK: Break; fi;
      --                  od;
      --                fi;
      --              fi;
                    if OK: ДобавитьВмассив(УслНом,true,false,y);Break;
                    fi;
                fi;
             fi;
           od;
         od;
       | true:
         for y=1 to len do -- len=(условия принятия к учету)
           for Transaction k=УслПР, dBT, dET do
               if поисквмассиве(СписокПроводок,k,true)<1:--проводку еще не обрабатывали
                 ДобавитьВмассив(СписокПроводок,true,false,k);
                 СЧД=TransDeb(k);
                 СЧК=TransCre(k);
                   OK=True;
                   if OK:OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧД, УслДЕБ[y]));fi;
                   if OK:OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, УслКРЕ[y]));fi;
                   if OK: ДобавитьВмассив(УслНом,true,false,y);Break;
                   fi;
                fi;
           od;
         od;

      fi;
   fi;
   len=ДлинаМассива(УслНом);
   if len=0: Message("НФА для создания требование-накладной не найдено!", mtWarning); ^False; fi;
   if len>1:-- выбор вида
      ClearVariable(Select);
      for k=1..len do
        Select[k]=УслИМЯ[УслНом[k]];
      od;
      y=Alternate('Выбор варианта заполнения документа...',Select);
      if y<1: Message("НФА для создания требование-накладной не найдено!", mtWarning); ^False; fi;
    | true:y=1;
   fi;
   --trace(УслИМЯ[y]);
   ------------------ окончание выбор условия формирования -------------------------
   КОНТ=""; ПОДП=""; ПОДС=""; МХЭП=""; МХЭС=""; МОЛП=""; МОЛС="";КОНТП="";КОНТС="";ПБСП="";ПБСС="";
   num=0;
   Work1=false;
   y=УслНом[y];
   if ПоискВмассиве(УслНомДоп,y,true)<1:
      УслПР=УслДЕБ[y]+"/"+УслКРЕ[y]+УслАнПров;
--      УслПР=УслДЕБ[y]+"/"+УслКРЕ[y]+"{ДНФАID."+Str16(ДНФАID)+"&ДНФА."+GetFieldS(ROднфа, 1, "АН_ДНФА")+"&("+УслАНА[y]+")}";
      Work1=true;
   fi;
   for Transaction k=УслПР, dBT, dET do num=num+1; od;
--   #ИМЯ_П_ОТК        #ИМЯ_П_КУД
   ShowProgress(num, "Считывание информации операции движения НФА ...");
   for Transaction k=УслПР, dBT, dET do ok=true;
    if CRDwork='РПО_НФА_СПРАВКА':
       ok=ok and GetRecordNumber(wa_control,TransRecord(k))>0;
    fi;
    if ok:
     ProgressPos(k);
     СЧД=TransDeb(k);
     СЧК=TransCre(k);
     if trim(КОНТ)='':
       if y=1 or y=4 or y=6:--расход
          if ПБСП ="": ПБСП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "ПБС", True ); fi;
          if КОНТП="": КОНТП=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "К"  , True ); fi;
          if МОЛП ="": МОЛП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", True ); fi;
          if МОЛП ="": МОЛП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "Ф"  , True ); fi;
          if ПОДП ="": ПОДП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П"  , True ); fi;
          if МОЛС ="": МОЛС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", False); fi;
          if МХЭС ="": МХЭС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "М"  , False); fi;
          if ПОДС ="": ПОДС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П"  , False); fi;
          КОНТ=ПБСП+' '+КОНТП+' '+МОЛП+' '+ПОДП+' '+МОЛС+' '+МХЭС+' '+ПОДС;
        | y=2:--внпр
          if МОЛС ="": МОЛС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", False); fi;
          if МХЭС ="": МХЭС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "М"  , False); fi;
          if ПОДС ="": ПОДС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П"  , False); fi;
          if МОЛП ="": МОЛП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", True ); fi;
          if МХЭП ="": МХЭП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "М"  , True ); fi;
          if ПОДП ="": ПОДП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П"  , True ); fi;
          КОНТ=МОЛС+' '+МХЭС+' '+ПОДС+' '+МОЛП+' '+МХЭП+' '+ПОДП;
        | y=3 or y=5:--приход
          if ПБСС ="": ПБСС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "ПБС", False); fi;
          if КОНТС="": КОНТС=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "К"  , False); fi;
          if МОЛС ="": МОЛС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", False); fi;
          if МОЛС ="": МОЛС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "Ф"  , False); fi;
          if ПОДС ="": ПОДС =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П"  , False); fi;
          if МОЛП ="": МОЛП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "МОЛ", True ); fi;
          if МХЭП ="": МХЭП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "М"  , True ); fi;
          if ПОДП ="": ПОДП =РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "П"  , True ); fi;
          КОНТ=ПБСС+' '+КОНТС+' '+МОЛС+' '+ПОДС+' '+МОЛП+' '+МХЭП+' '+ПОДП;
       fi;
     fi;
     tmp=TransQuantSign(k);
     if not Work1:
       Work=false;
       z=TransSignCount(k);
         OK=True;
         if OK:OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧД, УслДЕБ[y]));fi;
         if OK:OK=(OK and РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧК, УслКРЕ[y]));fi;
         if OK:
           if УслАНА[y]<>"":
             OK=False;
             for i=1 to z do
               OK=РАБ.НФА.FUNC_LIB.ПризнакСоотвМаске(TransSignName(k, i), УслАНА[y]);
               if OK: Break; fi;
             od;
           fi;
         fi;
         if OK: Work=True;  fi;
      | true:Work=True;
     fi;
     if Work:
       if соотв(ПроводКоличПризнак(k),'НФА.*'):КОДНФА=ПроводКоличПризнак(k);
        | true:КОДНФА='';
       fi;
--       КОДНФА=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "НФА", True);
       КОДИНВ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(k, "УЧН", ДебНФА[y]);
       if КОДНФА<>"":
         СЧНФА=if(ДебНФА[y], СЧД, СЧК);
         if Match(СЧНФА, "???.????.???????.???.?.10?.??.???")   : СЧНФА=SubStr(СЧНФА, 1, 30)+"???";
         |  Match(СЧНФА, "???.??.??.??.??.??.????.?.10?.??.???"): СЧНФА=SubStr(СЧНФА, 1, 33)+"???";
         |  Match(СЧНФА, "ЗАБ.??.10?.??")                       : СЧНФА=СЧНФА;
         else СЧНФА="";
         fi;
         if СЧНФА<>"":
--           fЭКС=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧНФА, "(*.?.101.04.410|*.?.101.05.410|*.?.101.06.410|*.?.101.09.410)&???.?.??.?????.??.????.?.???.??.???");
           fЭКС=РАБ.НФА.FUNC_LIB.СчетСоотвМаске(СЧНФА, "(*.?.101.?4.410|*.?.101.?5.410|*.?.101.?6.410|*.?.101.?8.410)");
           SUM=TransSum(k);
           KOL=TransSum(k, "КОЛ");
           if KOL<>0: Цена=Abs(SUM/KOL); else Цена=0; fi;
           if Свыше1000=False or (Свыше1000=True and fЭКС=False) or (Свыше1000=True and fЭКС=True and Цена>Общ_Пер('ОС_РАСХ',dbt)):
             tmp=КОДНФА+"|"+if(КОДИНВ="", " ", КОДИНВ)+"|"+СЧНФА;
             j=SearchInArray(НФА_ИНВ_COD, tmp, True, 1);
             if j<1:
               j=InsertInArraySort(НФА_ИНВ_COD, tmp);
               InsertInArray(НФА_ИНВ_СУМ, j, TransSum(k));
               InsertInArray(НФА_ИНВ_КОЛ, j, TransSum(k, "КОЛ"));
              | true:
                 НФА_ИНВ_СУМ[j]=НФА_ИНВ_СУМ[j]+TransSum(k);
                 НФА_ИНВ_КОЛ[j]=НФА_ИНВ_КОЛ[j]+TransSum(k, "КОЛ");
             fi;
           fi;
         fi;
       fi;
     fi;
    fi;
   end; -- Transaction
   len=LengthOfArray(НФА_ИНВ_COD);
   if len=0: Message("НФА для создания требование-накладной не найдено!", 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(2, НФА_ИНВ_COD[i], "|");
--        СЧД=ExtractWord(3, НФА_ИНВ_COD[i], "|");
--     if КОДИНВ<>"" and КОДИНВ<>" " and СЧД<>"":
--       fИНВ=USE_ИНВ_КАРТОЧКА(СЧД, if(НФА_ИНВ_КОЛ[i]<>0, Abs(НФА_ИНВ_СУМ[i]/НФА_ИНВ_КОЛ[i]), 0),dBT);
--       if fИНВ:
--         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;
--       fi;
--     fi;
--   od;
   --
   Try LastNum=РАБ.НФА.FUNC_LIB.NextNum(CRDинвк, "НОМЕР"); Except LastNum=0; end;
   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, ""));
    | true:ДОЛ_ОТПУС='';ФИО_ОТПУС='';
   fi;
   REC=SignToRecord(МОЛП, False);
   if REC<>NIL:
     tmp=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
     tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
     ФИО_ПОЛУЧ=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp<>"..", tmp, ""));
    | true:ФИО_ПОЛУЧ='';
   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].КОД_ИНВ    = КОДИНВ;
     REC=SignToRecord(КОДНФА, False);
     if REC<>NIL and картотекапризнака(КОДНФА,false)="РПО_НФА":
       Позиции[i].КОД_ЕДИЗМ=GetCardFieldS("РПО_НФА", REC, "ЕДИЗМОКЕИ");
       Позиции[i].ИМЯ_ЕДИЗМ=GetCardFieldS("РПО_НФА", REC, "ЕДИЗМ");
      | true:Позиции[i].ИМЯ_ЕДИЗМ=Name_U(КОДНФА);
     fi;
     Позиции[i].СУММА_НФА  = НФА_ИНВ_СУМ[i];
     Позиции[i].КОЛ_ОТПУЩ  = НФА_ИНВ_КОЛ[i];
     Позиции[i].ЦЕНА_НФА   = if(НФА_ИНВ_КОЛ[i]>0, Round(НФА_ИНВ_СУМ[i]/НФА_ИНВ_КОЛ[i], Точн), 0);
     Позиции[i].КОЛ_ЗАТРЕБ = Позиции[i].КОЛ_ОТПУЩ;
     Позиции[i].СКЛАД_НОМ  = "";
     if КОДИНВ<>"" and КОДИНВ<>" " and СЧД<>"":
       fИНВ=USE_ИНВ_КАРТОЧКА(СЧД, if(НФА_ИНВ_КОЛ[i]<>0, Abs(НФА_ИНВ_СУМ[i]/НФА_ИНВ_КОЛ[i]), 0),dBT);
       if fИНВ:
         tmp="ИНВВЕД."+КОДНФА+"."+КОДИНВ;
         ВЕД=Name_A(tmp); v1="";
         if ВЕД=" " or ВЕД="":
           BeginChanging(ROинвк);
           Try
             REC=SignToRecord(tmp, False);
             OK=False; Work=False;
             if REC<>NIL:
               Work=LockRecord(ROинвк, k, 0);
             else
               k=InsertRecord(ROинвк);
               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].ВЕД_ИНВ=ВЕД; --Ведомственный номер уже присвоен
         fi;
       fi;
     fi;
   od;
   if НОМЕР=0 or НОМЕРБУМ="":SetNDOC;fi;
--   if НОМЕР=0: НОМЕР=РАБ.НФА.FUNC_LIB.NextNumToDate(SelfCRD, "НОМЕР", "ДАТА_НАК", 1.1.100); fi;
--   if НОМЕРБУМ="": НОМЕРБУМ=Str(Номер); fi;
   ДАТА_НАК=dBT;
   if CRDwork='РПО_НФА_СПРАВКА':
      КОДОПЕР='РАСХ.НФА.304';
      Основание='Справка';
    | true:
      КОДОПЕР=Up(ExtractWord(1, GetFieldS(ROднфа, 1, "АН_ДНФА"), "."));
      Основание=GetFieldS(ROднфа, 1, "Основание");
   fi;
 Finally
   CloseProgress;
   CloseWorkArea(ROинвк);
   CloseWorkArea(ROднфа);
   if CRDwork='РПО_НФА_СПРАВКА':
      CloseWorkArea(wa_control);
   fi;

   ToggleAutorefresh(Режим);
 end;
 СинхрСчет26;
 ПрименитьТочность(",##0.00"+RepStr("#", ТОЧН-2)+";;-");
 if ДОЛ_ГЛБУХ='':ДОЛ_ГЛБУХ='Главный бухгалтер';fi;
 if КОДОПЕР='ПРИХ':РеквП=УЧРЕЖД;УЧРЕЖД=ИМЯ_П_ОТК;fi;
 if КОДОПЕР='РАСХ':РеквП=ИМЯ_П_КУД;fi;
 ^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,coAqua);
 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,coTeal);
 nn=InsertInArraySort(BufField,"ИМЯ_М_ОТК_");    InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ВИД_Д_ОТП");     InsertInArray(BufColorBg,nn,coAqua);
 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,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,coTeal);
 nn=InsertInArraySort(BufField,"ФИО_РАЗРЕШИЛ");  InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"A");             InsertInArray(BufColorBg,nn,coYellow);
 nn=InsertInArraySort(BufField,"D");             InsertInArray(BufColorBg,nn,coYellow);
 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,"ДОЛ_ОТПУС");     InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ДОЛ_ПОЛУЧ");     InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"ФИО_ОТПУС");     InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ФИО_ПОЛУЧ");     InsertInArray(BufColorBg,nn,coAqua);
 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] ="СЕКЦШАПКА0";
-- ИменаСекций[2] ="СЕКЦШАПКА1";
-- ИменаСекций[3] ="СЕКЦШАПКА2";
-- ИменаСекций[4] ="СЕКЦШАПКА3";
-- ИменаСекций[5] ="СЕКЦШАПКА4";
-- ИменаСекций[6] ="СЕКЦТАБ";
-- ИменаСекций[7] ="СЕКЦПОДВАЛ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 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);
-- cbСвыше1000.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;

Proc СинронизацияЗаписи;
var num, i :Integer;
 ИМЯ_М_ОТК=ИМЯ_М_ОТК_;
 ИМЯ_М_КУД=ИМЯ_М_КУД_;
 num=Позиции;
 if num>0: for i=1 to num do Позиции[i].ИМЯ_НФА=ИМЯ_НФА_[i]; od; fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
var tmp, tmp2 :String;
var nn :Integer;
var REC :Record;
 if Field="ТОЧН":
      Точн=УстановитьТочность(Точн); ^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;
 |  Field="УЧРЕЖД" or Field="ОКПО":
      Реквизиты; ^False;
 |  Field="ИМЯ_П_ОТК":
      tmp=AnaElection("К.*|МОЛ.*|П.*|ПБС.*", False, False, КОД_П_ОТК);
      if tmp="": 
        ClearVariable(Buf);
        Buf[1]="Оставить предыдущее (перед выбором) значение.";
        Buf[2]="Присвоить пустое значение (очистить поле).";
        nn=Alternate("Отмена выбора. Ваше действие...", Buf, -1, 1, 12);
        if nn=2: tmp=""; else ^False; fi;
      fi;
      КОД_П_ОТК=tmp;
      КОД_П_КУД="";
      if tmp<>"": 
        if GetAnaGlossary(tmp)="К" or GetAnaGlossary(tmp)="ПБС":
          КОД_М_ОТК="";
        fi; 
      fi;
      ^False;
 |  Field="ИМЯ_М_ОТК_":
      if КОД_П_ОТК="": Message("Выберите сначала структурное подразделение отправителя!", mtWarning); Template.Field="ИМЯ_П_ОТК"; ^False; fi;
      if GetAnaGlossary(КОД_П_ОТК)="К": Message("При выборе контрагента^M выбор местонахождения не предусмотрен!", mtWarning); ^False; fi;
      tmp=AnaElection("М.*", False, False, КОД_М_ОТК);
      if tmp="": 
        ClearVariable(Buf);
        Buf[1]="Оставить предыдущее (перед выбором) значение.";
        Buf[2]="Присвоить пустое значение (очистить поле).";
        nn=Alternate("Отмена выбора. Ваше действие...", Buf, -1, 1, 12);
        if nn=2: tmp=""; else ^False; fi;
      fi;
      КОД_М_ОТК=tmp;
      КОД_М_КУД="";
      ^False;
 |  Field="ИМЯ_П_КУД":
      tmp=AnaElection("К.*|МОЛ.*|П.*|ПБС.*", False, False, КОД_П_КУД);
      if tmp="": 
        ClearVariable(Buf);
        Buf[1]="Оставить предыдущее (перед выбором) значение.";
        Buf[2]="Присвоить пустое значение (очистить поле).";
        nn=Alternate("Отмена выбора. Ваше действие...", Buf, -1, 1, 12);
        if nn=2: tmp=""; else ^False; fi;
      fi;
      КОД_П_КУД=tmp;
      ^False;
 |  Field="ИМЯ_М_КУД_":
      tmp=AnaElection("М.*", False, False, КОД_М_КУД);
      if tmp="": 
        ClearVariable(Buf);
        Buf[1]="Оставить предыдущее (перед выбором) значение.";
        Buf[2]="Присвоить пустое значение (очистить поле).";
        nn=Alternate("Отмена выбора. Ваше действие...", Buf, -1, 1, 12);
        if nn=2: tmp=""; else ^False; fi;
      fi;
      КОД_М_КУД=tmp;
      ^False;
 |  Field="ФИО_ГЛБУХ":
      tmp=AnaElection("МОЛ.*", False, False, КОД_ТРЕБОВАЛ);
      if tmp="": ^False; fi;
      КОД_ТРЕБОВАЛ=tmp;
      REC=SignToRecord(tmp, True);
      if REC<>NIL:
        tmp=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
        tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
        ФИО_ГЛБУХ=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp<>"..", tmp, ""));
        ДОЛ_ГЛБУХ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
      else
        ФИО_ГЛБУХ=if(Name_A(tmp)<>"" and Name_A(tmp)<>" ", Name_A(tmp), tmp);
      fi;
      ^False;
 |  Field="ФИО_ОТПУС" or Field="ДОЛ_ОТПУС":
      tmp=AnaElection("МОЛ.*", False, False, КОД_ОТПУС);
      if tmp="": ^False; fi;
      КОД_ОТПУС=tmp;
      REC=SignToRecord(tmp, True);
      if REC<>NIL:
        tmp=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
        tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
        ФИО_ОТПУС=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp<>"..", tmp, ""));
        ДОЛ_ОТПУС=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
      else
        ФИО_ОТПУС=if(Name_A(tmp)<>"" and Name_A(tmp)<>" ", Name_A(tmp), tmp);
        ДОЛ_ОТПУС="";
      fi;
      ^False;
 |  Field="ФИО_РАЗРЕШИЛ" or Field="ДОЛ_РАЗРЕШИЛ":
      tmp=AnaElection("МОЛ.*|Ф.*", False, False, КОД_ОТПУС);
      if tmp="": ^False; fi;
      ФИО_РАЗРЕШИЛ=tmp;
      REC=SignToRecord(tmp, True);
      if REC<>NIL:
        tmp=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
        tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
        ФИО_РАЗРЕШИЛ=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp<>"..", tmp, ""));
        ДОЛ_РАЗРЕШИЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
      else
        ФИО_РАЗРЕШИЛ=if(Name_A(tmp)<>"" and Name_A(tmp)<>" ", Name_A(tmp), tmp);
        ДОЛ_РАЗРЕШИЛ="";
      fi;
      ^False;
 |  Field="СЧНФА_":  
      Позиции[Iter].СЧНФА=Счет26_Выбор(Позиции[Iter].СЧНФА);
      if Match(Позиции[Iter].СЧНФА, "???.????.???????.???.?.???.??.???"):    СЧНФА_[Iter]=SubStr(Позиции[Iter].СЧНФА, 24, 6);
      |  Match(Позиции[Iter].СЧНФА, "???.??.??.??.??.??.????.?.???.??.???"): СЧНФА_[Iter]=SubStr(Позиции[Iter].СЧНФА, 27, 6);
      |  Match(Позиции[Iter].СЧНФА, "ЗАБ.??.10?.??"):                        СЧНФА_[Iter]=Позиции[Iter].СЧНФА;
      else СЧНФА_[Iter]="";
      fi;
      ^False;
 |  Field="КОД_СИНТ":
      tmp=Счет26_Выбор("");
      if tmp<>"":
        if Match(tmp, "???.????.???????.???.?.???.??.???"):    КОД_СИНТ=SubStr(tmp, 24, 6);
        |  Match(tmp, "???.??.??.??.??.??.????.?.???.??.???"): КОД_СИНТ=SubStr(tmp, 27, 6);
        |  Match(tmp, "ЗАБ.??.10?.??"):                        КОД_СИНТ=tmp;
        else КОД_СИНТ="";
        fi;
      fi;
      ^False;
 |  Field="КОД_НФА":
      Позиции[Iter].КОД_НФА=НФА_Выбор(Позиции[Iter].КОД_НФА);
      ^False;
 |  Field="КОД_АНАЛ":
      КОД_АНАЛ=НФА_Выбор(КОД_АНАЛ);
      ^False;
 |  Field="ВИД_АНА1":
      ВИД_АНА1=ВыборВидаТаблицы(ВИД_АНА1); if Защита: EditorApply; fi; ^False;
 |  Field="ВИД_АНА2":
      ВИД_АНА2=ВыборВидаТаблицы(ВИД_АНА2); if Защита: EditorApply; fi; ^False;
 |  Field="ВИД_АНА3":
      ВИД_АНА3=ВыборВидаНомера(ВИД_АНА3); ВыборПеременнойДляНомера(ВИД_АНА3); if Защита: EditorApply; 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].КОЛ_ЗАТРЕБ<Позиции[Iter].КОЛ_ОТПУЩ: Позиции[Iter].КОЛ_ЗАТРЕБ=Позиции[Iter].КОЛ_ОТПУЩ; 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;
 |  Field="ФИО_ТРЕБОВАЛ": if ФИО_ТРЕБОВАЛ="": КОД_ТРЕБОВАЛ=""; fi;
 |  Field="ФИО_ОТПУС": if ФИО_ОТПУС="": КОД_ОТПУС=""; ДОЛ_ОТПУС=""; fi;
 |  Field="СЧНФА_": if СЧНФА_[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 Value<Позиции[Iter].КОЛ_ОТПУЩ:
     Message("Затребованное количество^Mне должно быть меньше отпущенного!", mtWarning);
     ^False;
   fi;
   if Позиции[Iter].КОЛ_ОТПУЩ=0: Позиции[Iter].КОЛ_ОТПУЩ=Value; fi;
 |  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="ФИО_ПОЛУЧ"   : ФИО_ПОЛУЧ=стрФИО; ДОЛ_ПОЛУЧ=стрДОЛ;
 fi;
 ^"";
end;

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

--Func ВыборВидОКЕИ :String;
--var nn :Integer;
--var out :String;
-- ClearVariable(Buf);
-- out="";
-- Buf[1]='Отказ от выбора';
-- Buf[2]='Все единицы';
-- Buf[3]='Единицы времени';
-- Buf[4]='Единицы длины';
-- Buf[5]='Единицы массы';
-- Buf[6]='Единицы объема';
-- Buf[7]='Единицы площади';
-- Buf[8]='Технические единицы';
-- Buf[9]='Экономические единицы';
-- nn=Alternate("Фильтр по справочнику ОКЕИ", Buf, -1, 1, 12);
-- if nn=2: out="";
-- |  nn=3: out="ВРЕМЯ";
-- |  nn=4: out="ДЛИНА";
-- |  nn=5: out="МАССА";
-- |  nn=6: out="ОБЪЕМ";
-- |  nn=7: out="ПЛОЩАДЬ";
-- |  nn=8: out="ТЕХН";
-- |  nn=9: out="ЭКОН";
-- else out=" ";
-- fi;
-- ^out;
--end;

--Func ЕдИзм_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
--var Iter, RO, nn :Integer;
--var fltr :String;
--var REC, RR :Record;
-- Template.HideEditor(False);
-- Iter=asInteger(Template.Frame);
-- RR=NIL; fltr="";
-- if Позиции[Iter].КОД_ЕДИЗМ<>"":
--   RO=OpenWorkArea("РПО_ОКЕИ", "",  "КОД='"+Позиции[Iter].КОД_ЕДИЗМ+"'");
--   Try
--     if Records(RO)=1: RR=GetRecordKey(RO, 1); else RR=NIL; fi;
--   Finally
--     CloseWorkArea(RO);
--   end;
-- fi;
-- if RR<>NIL:
--   ClearVariable(Buf);
--   nn=0;
--   Buf[1]="Открыть картотеку по уже введеному коду.";
--   Buf[2]="Открыть выбор вида ед.изм.";
--   nn=Alternate("Выберите действие...", Buf, -1, 1, 12);
-- else nn=0;
-- fi;
-- if nn<>1:
--   fltr=ВыборВидОКЕИ;
--   if fltr=" ": ^Cur; fi;
--   RR=NIL;
-- fi;
-- REC=OpenCardFile("РПО_ОКЕИ", if(fltr<>"", "--ВИД='"+fltr+"'", ""), RR, crdRecordOnly);
-- if REC<>NIL:
--   Позиции[Iter].КОД_ЕДИЗМ=GetCardFieldS("РПО_ОКЕИ", REC, "КОД");
--   Позиции[Iter].ИМЯ_ЕДИЗМ=GetCardFieldS("РПО_ОКЕИ", REC, "НКБО");
-- fi;
-- ^"";
--end;

Func НазваниеВидаОКЕИ(ВидОКЕИ:String) :String;
 if ВидОКЕИ="ВРЕМЯ":   ^"--Единицы времени";
 |  ВидОКЕИ="ДЛИНА":   ^"--Единицы длины";
 |  ВидОКЕИ="МАССА":   ^"--Единицы массы";
 |  ВидОКЕИ="ОБЪЕМ":   ^"--Единицы объема";
 |  ВидОКЕИ="ПЛОЩАДЬ": ^"--Единицы площади";
 |  ВидОКЕИ="ТЕХН":    ^"--Технические единицы";
 |  ВидОКЕИ="ЭКОН":    ^"--Экономические единицы";
 else ^"";
 fi;
end;

Func Выбор_ЕдИзм(oldКОД:String; oldНКБО:String) :Record;
var RO, i, num, k, j :Integer;
var ВИД, tmp, ИЩЕМ :String;
var REC, OUT :Record;
 REC=NIL; OUT=NIL;
 RO=OpenWorkArea("РПО_ОКЕИ", "НКБО", "1=0");
 Try
   if oldКОД<>"" or oldНКБО<>"":
     ClearVariable(Buf);
     k=0;
     if oldКОД<>"" and oldНКБО<>"": Buf[LengthOfArray(Buf)+1]="КОД='"+oldКОД+"' and НКБО='"+oldНКБО+"'"; fi;
     if oldКОД<>"": Buf[LengthOfArray(Buf)+1]="КОД='"+oldКОД+"'"; fi;
     if oldНКБО<>"": Buf[LengthOfArray(Buf)+1]="НКБО='"+oldНКБО+"'"; k=LengthOfArray(Buf); fi;
     num=LengthOfArray(Buf);
     if num>0:
       for i=1 to num do
         SetFilter(RO, Buf[i]);
         if k<>i and Records(RO)=1: REC=GetRecordKey(RO, 1); Break; fi;
         if k=i  and Records(RO)>0: REC=GetRecordKey(RO, 1); Break; fi;
       od;
     fi;
   fi;
   k=0;
   SetFilter(RO, "");
   num=Records(RO);
   if num>0:
     ClearVariable(Buf);
     ClearVariable(BufREC);
     ИЩЕМ="";
     for i=1 to num do
       ВИД=GetFieldS(RO, i, "ВИД");
       if ВИД<>"":
         tmp=ВИД+"#"+НазваниеВидаОКЕИ(ВИД);
         if SearchInArray(Buf, tmp, True, 1)=-1: 
           j=InsertInArraySort(Buf, tmp);
           InsertInArray(BufREC, j, NIL);
         fi;
         tmp=ВИД+"#"+GetFieldS(RO, i, "НКБО")+"  ["+GetFieldS(RO, i, "КОД")+"]"+"--"+GetFieldS(RO, i, "НАИМЕНОВАНИЕ");
         if SearchInArray(Buf, tmp, True, 1)=-1: 
           j=InsertInArraySort(Buf, tmp); 
           InsertInArray(BufREC, j, GetRecordKey(RO, i));
           if REC<>NIL: if BufREC[j]=REC: ИЩЕМ=tmp; fi; fi;
         fi;
       fi;
     od;
     k=SearchInArray(Buf, ИЩЕМ, True, 1);
   fi;
   num=0;
   if LengthOfArray(Buf)>0:
     num=AlternateTree("Единицы измерения...", Buf, -1, k, 12, "#", "Национальное кодовое буквенное обозначение [КОД]", "Наименование", -1, False);
     if num>0: OUT=BufREC[num]; fi;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 ^OUT;
end;

Func ЕдИзм_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Iter :Integer;
var REC :Record;
 Template.HideEditor(False);
 Iter=asInteger(Template.Frame);
 REC=Выбор_ЕдИзм(Позиции[Iter].КОД_ЕДИЗМ, Позиции[Iter].ИМЯ_ЕДИЗМ);
 if REC<>NIL:
   Позиции[Iter].КОД_ЕДИЗМ=GetCardFieldS("РПО_ОКЕИ", REC, "КОД");
   Позиции[Iter].ИМЯ_ЕДИЗМ=GetCardFieldS("РПО_ОКЕИ", REC, "НКБО");
 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 btnOnClick(Sender:String); -- объекты при нажатии
var REC :Record;
var OK :Logical;
 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_0315006_000.cfg");
 ЦветаПолей;
 tmp=UserName(AliasName(SelfCRD));
 Пользов=if(tmp<>"", "Пользователь - "+tmp, "Пользователь локальной версии");
 First=True;
end;

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

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