БЛАНКСШАБЛОНОМ[29.12.2007] "Приходный ордер", РЕДАКТОР РПО_ПРИХ_ОРДЕР;
-- Приходный ордер (типовая форма N'М4 ОКУД 0315003)
-- Разработка бланка: ТБ.БЮДЖЕТ
-- Первый релиз: 17.08.2011

--2 Объекты
btnSave:Object; btnClose:Object; btnUpdate:Object; btnReMove:Object; lblWarning:Object; 
cb_Защита:Object; cb_Only105:Object; cb_AddsZAB:Object; cb_Adds106:Object;
секцНастр:Object; секцНомер:Object; секцШапка:Object; секцТаблШ:Object; секцКнопД:Object; секцТблДт:Object; секцИтгДт:Object; секцПодпс:Object;
--2 Переменные
var recCurrent     :Record;
var NewREC         :Logical=(CurrentState=crdusInserted);
var First          :Logical;
var SelfCRD        :String="РПО_ПРИХ_ОРДЕР";
var Пользов        :String;
var Фокус          :String="";
var РАСЧ_НДС       :String="Рассчитать НДС для таблицы";
var AA             :String="+";
var DD             :String="-";

flgOnly105         :Logical;
flgAddsZAB         :Logical;
flgAdds106         :Logical;
flgФиксЦена        :Logical=[True];
var Точн_          :Integer=Точн;
flgТочнЭкран       :Logical=[False];
flgНомерИзДНФА     :Logical=[False];
flgКОЛ_Прин        :Logical=[True];
var flgКОЛ_Прин_   :Logical=flgКОЛ_Прин;
var КОД_АНАЛ_      :String=КОД_АНАЛ;
var ВИД_АНА_НФА    :Integer=[0];
var ВИД_АНА_НОМ    :Integer=[0];
historyНДС         :String;


var НФА_ТАБ[]      :String=РАБ.НФА.FUNC_LIB.FormatAna(Позиции[$].НФА_КОД, ВИД_АНА_НФА, "наименования нет", "-");

итгКОЛ_ПРИН        :Numeric=SumOfArray(Позиции[].КОЛ_ПРИН);
итгСУММА_НФА       :Numeric=SumOfArray(Позиции[].СУММА_НФА);
итгНДС_СУММ        :Numeric=SumOfArray(Позиции[].НДС_СУММ);
итгВСЕГО_НФА       :Numeric=SumOfArray(Позиции[].ВСЕГО_НФА);

var Buf[]          :String;
var AccTmp[]       :String;
var AccBuf[]       :String;
var BufAcc[]       :String;
var BufTxt[]       :String;
var BufREC[]       :Record;
var bindVOC[]      :String;
var bindINT[]      :Integer;
var УслДЕБ[]       :String;
var УслКРЕ[]       :String;
--
var LSTНФА[]       :String;
var LSTСУМ[]       :Numeric;
var LSTКОЛ[]       :Numeric;
--
var ИменаСекций[]  :String;
var BufField[]     :String;
var BufColorBg[]   :Integer;
var BufColorFo[]   :Integer;

2-- Процедуры и функции
Proc ОчиститьПриРасчете;
 ClearVariable(LSTНФА);
 ClearVariable(LSTСУМ);
 ClearVariable(LSTКОЛ);
end;

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(AccTmp);
 ClearVariable(AccBuf);
 ClearVariable(BufAcc);
 ClearVariable(BufTxt);
 ClearVariable(BufREC);
 ClearVariable(bindVOC);
 ClearVariable(bindINT);
 ClearVariable(НФА_ТАБ);
 ClearVariable(УслДЕБ);
 ClearVariable(УслКРЕ);
 ОчиститьПриРасчете;
end;

Proc НеПустаяТаблица;
var nn :Integer;
 if Позиции<1:
   Try nn=InsertFrame(Позиции, 1); Except end;
   if historyНДС="": Позиции[1].НДС_СТАВ=-1; else Позиции[1].НДС_СТАВ=Int(historyНДС); fi;
 fi;
end;

Proc УдалитьПустыеСтроки;
var nn :Integer;
 nn=1;
 while nn<=Позиции do if Позиции[nn].НФА_КОД="": Try DeleteFrame(Позиции, nn); Except end; else nn=nn+1; fi; od;
 НеПустаяТаблица;
end;

Func TemplateSaveOK :Logical; -- проверка правильности ввода данных
 if НОМЕРБУМ=""       : Message("Не задан номер приходного ордера!",    mtWarning); Template.Field="НОМЕРБУМ"; ^False; fi;
 if ДАТА_НАК=1.1.100  : Message("Не задана дата приходного ордера!",    mtWarning); Template.Field="ДАТА_НАК"; ^False; fi;
 if ДАТА_НАК<1.1.1900 : 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:
    ni=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМЕР,НОМЕРБУМ", "ДАТА_НАК", "Ukey<>"+RecordToString(Current), 1.1.100);
 fi;
 if НОМЕР<>ni:НОМЕР = ni;fi;
 if ns='':ns=Str(ni);fi;
 if НОМЕРБУМ<>ns:НОМЕРБУМ = ns;fi;
end;

Proc ВзятьРеквизиты(REFI:Integer; ПолноеНАИМ:Logical; Auto:Logical);
var REC, SaveREC :Record;
var RO, num :Integer;
 if Auto:
   if Trim(УЧР_НАИМ)="":
     SaveREC=IntegerToRecord(REFI);
     RO=OpenWorkArea("КОНТРАГЕНТ", "", "НАШЕ");
     Try
       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:
            УЧР_НАИМ = if(ПолноеНАИМ, GetFieldS(RO, 1, "ПОЛНИМЯ"), GetFieldS(RO, 1, "КОРИМЯ"));
            УЧР_ОКПО = GetFieldS(RO, 1, "ОКПО");
            УЧР_REFI = RecordToInteger(REC);
         fi;
       fi;
     Finally
       CloseWorkArea(RO);
     end;
   fi;
 else
   REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", saveREC, crdRecordOnly);
   if REC=NIL: Exit; fi;
   RO=OpenWorkArea("КОНТРАГЕНТ", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       УЧР_НАИМ = if(ПолноеНАИМ, GetFieldS(RO, 1, "ПОЛНИМЯ"), GetFieldS(RO, 1, "КОРИМЯ"));
       УЧР_ОКПО = GetFieldS(RO, 1, "ОКПО");
       УЧР_REFI = RecordToInteger(REC);
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Proc СформированИзДНФА;
var lOK :Logical;
 lOK=РАБ.НФА.FUNC_LIB.Документ_Сформирован_из_ОперацийДНФА(CRD, ДНФАID, RECCRD);
 if not Защита:
   btnUpdate.Enabled  = lOK;
   cb_Only105.Enabled = lOK;
   cb_AddsZAB.Enabled = lOK;
   cb_Adds106.Enabled = lOK;
   if not lOK:
     flgOnly105 = False;
     flgAddsZAB = False;
   fi;
 fi;
 btnReMove.Visible  = lOK;
 lblWarning.Visible = not lOK;
end;

Proc ПрименитьТочность(Mask:String);
 секцТблДт.Cell(1, 07, CellFormat, Mask);
 секцТблДт.Cell(1, 08, CellFormat, Mask);
 секцТблДт.Cell(1, 09, CellFormat, Mask);
 секцТблДт.Cell(1, 10, CellFormat, Mask);
 секцТблДт.Cell(1, 12, CellFormat, Mask);
 секцТблДт.Cell(1, 13, CellFormat, Mask);

 секцИтгДт.Cell(1, 08, CellFormat, Mask);
 секцИтгДт.Cell(1, 10, CellFormat, Mask);
 секцИтгДт.Cell(1, 12, CellFormat, Mask);
 секцИтгДт.Cell(1, 13, CellFormat, Mask);
end;

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

Proc ТочностьКакНаЭкране;
 if flgТочнЭкран: ПрименитьТочность(",##0.00"+RepStr("#", Точн-2)+";;-"); else ПрименитьТочность(",##0.00;;-"); fi;
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("Выберите вид колонки N2 ордера.", Buf, -1, State+1, 12);
 if nn=0: ^State; fi;
 ^(nn-1);
end;

Proc ВыборПеременнойДляНомера(State:Integer);
 if State=2: секцТблДт.Cell(1, 3, CellContents, "КОД_УЧН");
 |  State=1: секцТблДт.Cell(1, 3, CellContents, "КОД_ИНВ");
 else        секцТблДт.Cell(1, 3, CellContents, "КОД_НОМ");
 fi;
end;

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

Func ВзятьСчет10(Acc:String) :String;
 if Pos("*", Acc)=1:
   if Match(Acc, "?.???.??.???"): ^Acc; fi;
 else
   if Match(Acc, "???.????.???????.???.?.???.??.???"):    ^("*."+SubStr(Acc, 24, 10));
   |  Match(Acc, "???.?.??.?????.??.????.?.???.??.???"):  ^("*."+SubStr(Acc, 26, 10));
   |  Match(Acc, "???.??.??.??.??.??.????.?.???.??.???"): ^("*."+SubStr(Acc, 27, 10));
   fi;
 fi;
 ^"";
end;

Func ВзятьСчет6(Acc:String) :String;
 if Pos("*", Acc)=1:
   if Match(Acc, "?.???.??.???"): ^SubStr(Acc, 3, 6); fi;
 else
   if Match(Acc, "???.????.???????.???.?.???.??.???"):    ^SubStr(Acc, 24, 6);
   |  Match(Acc, "???.?.??.?????.??.????.?.???.??.???"):  ^SubStr(Acc, 26, 6);
   |  Match(Acc, "???.??.??.??.??.??.????.?.???.??.???"): ^SubStr(Acc, 27, 6);
   fi;
 fi;
 ^"";
end;

Proc ЗаполнитьМассивСчетовКорреспонденций(MaskAccWork:String; Короткий:Logical);
var AccWrk, AccAll, A10Wrk, Value :String;
 Hint("");
 ClearTrace(True);
 ClearVariable(AccBuf);
 A10Wrk=ВзятьСчет10(MaskAccWork);
 if A10Wrk="": Exit; fi;
 for Account AccWrk=MaskAccWork, Sort do
   Hint("Анализ корреспонденций для "+AccWrk);
   for Account AccAll="*", Sort do
     if Correspond(AccWrk, AccAll) and not Match(AccAll, A10Wrk):
       Value=ВзятьСчет10(AccAll);
       if Value<>"": AddInArray(AccBuf, True, False, if(Короткий, SubStr(Value, 3, 6), Value)); fi;
     fi;
   od;
 od;
 Hint("");
end;

Proc ЗаполнитьМассивСчетовКорреспонденцийOpt(MaskAccWork:String; Короткий:Logical);
var AccWrk, AccAll, A10Wrk, Value :String;
var RO, ii, len :Integer;
 Hint("");
 ClearTrace(True);
 ClearVariable(AccTmp);
 ClearVariable(AccBuf);
 A10Wrk=ВзятьСчет10(MaskAccWork);
 if A10Wrk="": Exit; fi;
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "Name_Voc='СЧ' and Match(CODE, '???.??') and not (Match(CODE, '101.??') or Match(CODE, '102.??') or Match(CODE, '103.??') or Match(CODE, '104.??') or Match(CODE, '105.??') or Match(CODE, '5??.??') or Match(CODE, 'ЗАБ.??'))");
 Try
   len=Records(RO);
   if len>0:
     for ii=1 to len do AccTmp[ii]="*."+GetFieldS(RO, ii, "CODE")+".???"; od;
     for Account AccWrk=MaskAccWork, Sort do
       Hint("Анализ корреспонденций для "+AccWrk);
       for ii=1 to len do
         for Account AccAll=AccTmp[ii], Sort do
           if Correspond(AccWrk, AccAll) and not Match(AccAll, A10Wrk):
             Value=ВзятьСчет10(AccAll);                                        
             if Value<>"": AddInArray(AccBuf, True, False, if(Короткий, SubStr(Value, 3, 6), Value)); fi;
           fi;
         od;
       od;
     od;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
 Hint("");
end;

Func ВыборСчетаКорр(ТолькоМатериалы:Logical; StoreValue:String) :String;
var RO, num, ii, kk, zz, jj :Integer;
var tmp :String;
 ClearVariable(Buf);
 Buf[1]="Проверка ТИПОВЫХ корреспондирующих счетов НФА: БЫСТРО, но не все возможные корреспонденции";
 Buf[2]="Проверка ВСЕХ корреспондирующих счетов НФА: все зарегистрированные корреспонденции, но МЕДЛЕННО";
 ii=Alternate("Выберите тип анализа корреспонденций...", Buf, -1, 1, 12);
 if ii=1:
   ClearVariable(Buf);
   if ТолькоМатериалы:
     Buf[01]="106.34";
     Buf[02]="106.44";
     Buf[03]="107.33";
     Buf[04]="107.43";
     Buf[05]="208.34";
     Buf[06]="302.34";
     Buf[07]="304.04"; --*.304.04.222|*.304.04.226|*.304.04.290|*.304.04.310|*.304.04.320|*.304.04.340
     Buf[08]="401.10"; --*.401.10.151|*.401.10.152|*.401.10.153|*.401.10.172|*.401.10.180
     Buf[09]="401.20"; --*.401.20.241|*.401.20.242|*.401.20.251|*.401.20.252|*.401.20.271|*.401.20.272|*.401.20.273
     Buf[10]="401.30";
   else
     Buf[01]="106.11";
     Buf[02]="106.31";
     Buf[03]="106.32";
     Buf[04]="106.34";
     Buf[05]="106.41";
     Buf[06]="106.42";
     Buf[07]="106.44";
     Buf[08]="107.11";
     Buf[09]="107.31";
     Buf[10]="107.33";
     Buf[11]="107.41";
     Buf[12]="107.43";
     Buf[13]="208.31";
     Buf[14]="208.32";
     Buf[15]="208.34";
     Buf[16]="302.31";
     Buf[17]="302.32";
     Buf[18]="302.34";
     Buf[19]="304.04"; --*.304.04.222|*.304.04.226|*.304.04.290|*.304.04.310|*.304.04.320|*.304.04.340
     Buf[20]="401.10"; --*.401.10.151|*.401.10.152|*.401.10.153|*.401.10.172|*.401.10.180
     Buf[21]="401.20"; --*.401.20.241|*.401.20.242|*.401.20.251|*.401.20.252|*.401.20.271|*.401.20.272|*.401.20.273
     Buf[22]="401.30";
   fi;
 |  ii=2:
   ClearVariable(Buf);
   ЗаполнитьМассивСчетовКорреспонденцийOpt(if(ТолькоМатериалы, "???.????.???????.???.?.105.??.???", "???.????.???????.???.?.101.??.???|???.????.???????.???.?.105.??.???"), True);
   num=LengthOfArray(AccBuf);
   if num>0: CopyArray(AccBuf, Buf); else Message("Счета корреспонденций не найдены!", mtError); ^StoreValue; fi;
 else ^StoreValue;
 fi;
 ii=1;
 while not Buf[ii]="" do
   tmp=SubStr(Buf[ii], 1, 4);
   if SearchInArray(Buf, tmp, True)=-1: InsertInArraySort(Buf, tmp); ii=ii+1; fi; --Добавление группы идет перед выбранным элементом (сортировка)
   ii=ii+1;
 od;
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "NAME_VOC='СЧ' and Match(CODE,'???.??')");
 Try
   num=Records(RO);
   if num=0: Message("Выполните обновление справочников и повторите выбор", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^StoreValue; fi;
   ClearVariable(BufAcc); ClearVariable(BufTxt);
   ShowProgress(num, "Построение списка счетов...");
   Try
     for ii=1 to num do ProgressPos(ii); BufAcc[ii]=GetFieldS(RO, ii, "CODE"); BufTxt[ii]=GetFieldS(RO, ii, "TXT"); od;
   Finally
     CloseProgress;
   end;
   SetFilter(RO, "NAME_VOC='СЧ' and Match(CODE,'???')");
   ShowProgress(0, "Обработка счетов...");
   Try
     num=LengthOfArray(Buf);
     ShowProgress(num, "Обработка счетов...");
     for ii=1 to num do
       zz=Length(Buf[ii]);
       if SubStr(Buf[ii], zz, 1)=".":
         tmp=SubStr(Buf[ii], 1, zz-1);
         kk=Search(RO, 1, tmp);
         if kk>0: Buf[ii]=Buf[ii]+"--"+GetFieldS(RO, kk, "TXT"); fi;
       else
         kk=SearchInArray(BufAcc, Buf[ii], True);
         if kk>0: Buf[ii]=BufAcc[kk]+"--"+BufTxt[kk]; if StoreValue=BufAcc[kk]: jj=ii; fi; fi;
       fi;
     od;
   Finally
     CloseProgress;
   end;
 Finally
   CloseWorkArea(RO);
 end;
 tmp="";
 num=AlternateTree("Выберите корреспондирующий счет...", Buf, -1, jj, 12, ".", "Счета", "Наименование", -1, True);
 if num=0: ^StoreValue; fi;
 tmp=SubStr(Buf[num], 1, 6);
 if SubStr(tmp, 5, 2)="--": tmp=SubStr(tmp, 1, 4)+"00"; fi;
 ClearVariable(Buf); ClearVariable(BufAcc); ClearVariable(BufTxt);
 ^tmp;
end;

Func СчетаНФА_вУчете(maskСЧТ:String; ddBP:Date; ddEP:Date) :Integer;
var Путь, Acc :String;
var num, kk :Integer;
var Отч1 :Report;
 ClearVariable(Buf);
 Путь=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst";
 if not ExistFile(Путь): ^-1; fi;
 Try
   Отч1=RepOpen(Путь+"|По_счетам_НФА_Бал_Заб", maskСЧТ, "", if(ddBP>1.1.1990, ddBP, 1.1.100), if(ddEP>1.1.1990, ddEP, ToDay));
   RepReset(Отч1);
   Try
     num=RepRowsCount(Отч1);
     kk=0;
     while RepNext(Отч1) do
       Acc=RepIdent(Отч1);
       if Match(Acc, "???.????.???????.???.?.???.??.???")    or
          Match(Acc, "???.??.??.??.??.??.????.?.???.??.???") or
          Match(Acc, "ЗАБ.??.???.??"):
         kk=kk+1;
         Buf[kk]=Объединить(SignsMask(Acc, True), SignsMask(Acc, False), "|");
       fi;
     end; -- while
   Finally
     Отч1=RepClose(Отч1);
   end;
 Except
   ^-1;
 end;
 ^LengthOfArray(Buf);
end;

Func СчетаНФА_поСтруктуре(maskСЧТ:String) :Integer;
var Acc :String;
var kk :Integer;
 ClearVariable(Buf);
 kk=0;
 for Account Acc=maskСЧТ, Sort do 
   kk=kk+1;
   Buf[kk]=Объединить(SignsMask(Acc, True), SignsMask(Acc, False), "|");
 od;
 ^LengthOfArray(Buf);
end;

Func СправочникиСтруктурыПоМаскеСчетовПрогресс(maskСЧТ:String; ddBP:Date; ddEP:Date; OnlyUseAcc:Logical; EnableProgress:Logical) :String;
var Voc, MaskVoc :String;
var xx, ii, num, jj, kk :Integer;
var qq :Numeric;
 Try qq=Saldo(maskСЧТ, 1.1.100); Except ^" "; end;
 ClearVariable(bindVOC); ClearVariable(bindINT);
 if EnableProgress: ShowProgress(0, "Подготовка..."); fi;
 MaskVoc="";
 Try
   xx=0;
   if OnlyUseAcc: xx=СчетаНФА_вУчете(maskСЧТ, ddBP, ddEP); fi;
   if not xx>0:   xx=СчетаНФА_поСтруктуре(maskСЧТ); fi;
   if xx>0:
     if EnableProgress: ShowProgress(xx, "Анализ привязки справочников к счетам..."); fi;
     for ii=1 to xx do
       if EnableProgress: ProgressPos(ii); fi;
       num=WordsCount(Buf[ii], "|");
       for jj=1 to num do
         Voc=ExtractWord(jj, Buf[ii], "|");
         kk=SearchInArray(bindVOC, Voc, True, 1);
         if kk>0:
           bindINT[kk]=bindINT[kk]+1;
         else
           kk=InsertInArraySort(bindVOC, Voc);
           InsertInArray(bindINT, kk, 1);
         fi;
       od;
     od;
     num=LengthOfArray(bindVOC);
     if num>0:
       if EnableProgress: ShowProgress(num, "Обработка полученных данных..."); fi;
       jj=num; -- удаляем с конца
       for ii=1 to num do
         if EnableProgress: ProgressPos(ii); fi;
         -- xx - количество рабочих счетов
         if bindINT[jj]<>xx: DeleteFromArray(bindVOC, jj); else MaskVoc=Объединить(MaskVoc, bindVOC[jj], "|"); fi;
         jj=jj-1;
       od;
     fi;
   fi; -- xx>0
 Finally
   if EnableProgress: CloseProgress; fi;
 end;
 ^MaskVoc;
end;

Func УдалитьСловоИзНабора_Диалог(Set:String; SepSet:String) :String;
var num, i, nn :Integer;
 ClearVariable(Buf);
 num=WordsCount(Set, SepSet);
 if num<2: ^""; fi;
 for i=1 to num do Buf[i+1]=ExtractWord(i, Set, SepSet); od;
 Buf[1]="Удалить все";
 nn=Alternate("Удаление...", Buf, -1, 1, 12);
 if nn=0: ^Set; fi;
 Set="";
 if nn=1: ^Set; fi;
 num=num+1;
 for i=2 to num do if not i=nn: Set=Set+SepSet+Buf[i]; fi; od;
 Set=SubStr(Set, Length(SepSet)+1, 255);
 ^Set;
end;

Func УдалитьСловаИзНабораПоМаске(Set:String; SetSep:String; Mask:String; MaskSep:String) :String;
var nn1, nn2, i, j :Integer;
var Res, tmp1, tmp2 :String;
 if Set="" or Mask="": ^Set; fi;
 Res="";
 nn1=WordsCount(Set,   SetSep);
 nn2=WordsCount(Mask, MaskSep);
 for i=1 to nn1 do
   tmp1=ExtractWord(i, Set, SetSep);
   for j=1 to nn2 do
     tmp2=ExtractWord(j, Mask, MaskSep);
     if Match(tmp1, tmp2): tmp1=""; Break; fi;
   od;
   if not tmp1="": Res=Res+SetSep+tmp1; fi;
 od;
 Res=SubStr(Res, Length(SetSep)+1, 255);
 ^Res;
end;

Func ДобавитьСловоВНаборСЗаменой(Set:String; SetSep:String; Value:String; Mask:String; MaskSep:String) :String;
var Res :String;
 if Set="": ^Value; fi;
 Res=УдалитьСловаИзНабораПоМаске(Set, SetSep, Mask, MaskSep);
 Res=Объединить(Res, Value, SetSep);
 ^Res;
end;

Func ДобавитьПризнак(Set:String; NewSign:String) :String;
var Voc :String;
 Voc=GetAnaGlossary(NewSign);
 if Voc<>"": Voc=Voc+".*"; else Voc="*"; fi;
 ^ДобавитьСловоВНаборСЗаменой(Set, " ", NewSign, Voc, "");
end;

Func СортироватьНаборСлов(Set:String; SepSet:String; Flag:Logical) :String; --Сортирует набор по словам
-- Set набор слов; SepSet разделитель; Flag направление сортировки
var num, i, k :Integer;
var tmp :String;
 ClearVariable(Buf);
 num=WordsCount(Set, SepSet);
 k=0;
 for i=1 to num do
   tmp=ExtractWord(i, Set, SepSet);
   if tmp<>"": k=k+1; Buf[k]=tmp; fi;
 od;
 SortArray(Buf, Flag);
 tmp="";
 for i=1 to k do tmp=tmp+SepSet+Buf[i]; od;
 tmp=SubStr(tmp, Length(SepSet)+1, 255);
 ^tmp;
end;

Func TimeToHMSstring_adv(valTime:Integer; valSep:String) :String;
var ihh, imm, icc :Integer;
var shh, smm, scc :String;
 shh=''; smm=''; scc='';
 ihh=Int(Trunc(valTime/3600));
 imm=Int(Trunc((valTime-ihh*3600)/60));
 icc=valTime-ihh*3600-imm*60;
 shh=Format("%.2d", ihh);
 smm=Format("%.2d", imm);
 scc=Format("%.2d", icc);
 ^(shh+valSep+smm+valSep+scc);
end;

Proc НФА_Выбор(Iter:Integer);
var StoreCOD, StoreNAM, ANA :String;
 StoreCOD=Позиции[Iter].НФА_КОД;
 StoreNAM=Позиции[Iter].НФА_ИМЯ;
 ANA=Up(AnaElection("НФА.101.*|НФА.102.*|НФА.105.*", False, False, StoreCOD));
 if ANA="": Exit; fi;
 if ANA<>StoreCOD:
   Позиции[Iter].НФА_КОД=ANA;
   Позиции[Iter].НФА_ИМЯ=Trim(Name_A(ANA));
 fi;
end;

Proc ЦветаПолей;
var nn, len, sysTxt, sysObj :Integer;
 sysTxt=РАБ.ЦВЕТА.GetColor("coBtnText");
 sysObj=РАБ.ЦВЕТА.GetColor("coBtnFace");
 ClearVariable(BufField); ClearVariable(BufColorBg); ClearVariable(BufColorFo);
 nn=InsertInArraySort(BufField,"FLGФИКСЦЕНА");  InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"ТОЧН_");        InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"FLGТОЧНЭКРАН"); InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"НДС_ТИП_");     InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"FLGКОЛ_ПРИН_"); InsertInArray(BufColorBg,nn,coTeal);
 nn=InsertInArraySort(BufField,"flgНомерИзДНФА");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,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,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,coAqua);
 nn=InsertInArraySort(BufField,"ПСПРТ_НОМ");    InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"СКЛАД_НОМ");    InsertInArray(BufColorBg,nn,coAqua);
 nn=InsertInArraySort(BufField,"AA");           InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"DD");           InsertInArray(BufColorBg,nn,sysObj);
 nn=InsertInArraySort(BufField,"РАСЧ_НДС");     InsertInArray(BufColorBg,nn,sysObj);
 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);
 len=LengthOfArray(BufField);
 for nn=1 to len do
   if BufColorBg[nn]=coTeal: BufColorFo[nn]=coWhite;
   |  BufColorBg[nn]=sysObj: BufColorFo[nn]=sysTxt;
   |  True:                  BufColorFo[nn]=coBlack;
   fi;
 od;
end;

Proc ТолькоЧтение(Flag:Logical);
var len, kk, ii, jj, ik, jk, nn, цвFont, цвBack :Integer;
var ТЧ :Logical;
var tmp :String;
var СекцИмя : Object;
 ClearVariable(ИменаСекций);
 ИменаСекций[1] ="СЕКЦНАСТР";
 ИменаСекций[2] ="СЕКЦНОМЕР";
 ИменаСекций[3] ="СЕКЦШАПКА";
 ИменаСекций[4] ="СЕКЦТАБЛШ";
 ИменаСекций[5] ="СЕКЦКНОПД";
 ИменаСекций[6] ="СЕКЦТБЛДТ";
 ИменаСекций[7] ="СЕКЦИТГДТ";
 ИменаСекций[8] ="СЕКЦПОДПС";
 len=LengthOfArray(ИменаСекций);
 ShowProgress(len, "Обработка данных...");
 Try
   for kk=1 to len do
     ProgressPos(kk);
     if FindObject(ИменаСекций[kk], СекцИмя):
       ik=asInteger(СекцИмя.RowsCount); jk=asInteger(СекцИмя.ColsCount);
       for ii=1 to ik do
         for jj=1 to jk do
           tmp=Up(asString(СекцИмя.Cell(ii, jj, CellContents, "")));
           nn=SearchInArray(BufField, tmp, True, 1);
           if nn<>-1:
             if Flag: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=BufColorFo[nn]; цвBack=BufColorBg[nn]; ТЧ=False; fi;
             СекцИмя.Cell(ii, jj, CellFontColor, цвFont); СекцИмя.Cell(ii, jj, CellBgColor, цвBack); СекцИмя.Cell(ii, jj, CellReadOnly, ТЧ);
           fi;
         od;
       od;
     fi;
   od;
 Finally
   CloseProgress;
 end;
 btnSave.Enabled    = not Flag;
 btnUpdate.Enabled  = not Flag;
 cb_Only105.Enabled = not Flag;
 cb_AddsZAB.Enabled = not Flag;
 cb_Adds106.Enabled = not Flag;

 ClearVariable(ИменаСекций);
end;

Proc ИнициализироватьУсловияОбновления(Только105:Logical; ЕстьЗабаланс:Logical);
var jj :Integer;
 jj=0; 
 ClearVariable(УслДЕБ);
 ClearVariable(УслКРЕ);
 jj=jj+1;
 УслДЕБ[jj]="???.????.???????.???.?.105.??.340";
 УслКРЕ[jj]="((*.106.?4.?40|*.107.?3.440|*.208.34.660|*.302.34.730|*.304.04.340)&???.????.???????.???.?.???.??.???)|((*.401.10.15?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)|00";
 if not Только105:
   jj=jj+1;
   УслДЕБ[jj]="???.????.???????.???.?.101.??.310";
   --УслКРЕ[jj]="((*.106.?1.?10|*.107.?1.410|*.208.31.660|*.302.31.730|*.304.04.310)&???.????.???????.???.?.???.??.???)|((*.401.10.15?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)|00";
   УслКРЕ[jj]="((*.106.?1.?10|*.106.?4.?40|*.107.?1.410|*.208.31.660|*.302.31.730|*.304.04.310)&???.????.???????.???.?.???.??.???)|((*.401.10.15?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)|00";
 fi;
 if ЕстьЗабаланс:
   jj=jj+1;
   УслДЕБ[jj]="ЗАБ.??.105.??";
   УслКРЕ[jj]="ЗАБАЛАНС|00Z";
   if not Только105:
     jj=jj+1;
     УслДЕБ[jj]="ЗАБ.??.101.??";
     УслКРЕ[jj]="ЗАБАЛАНС|00Z";
   fi;
 fi;
 if flgAdds106:
   jj=jj+1;
   УслДЕБ[jj]="???.????.???????.???.?.106.??.340";
   УслКРЕ[jj]="((*.107.?3.440|*.208.34.660|*.302.34.730|*.304.04.340)&???.????.???????.???.?.???.??.???)|((*.401.10.15?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)";
   if not Только105:
     jj=jj+1;
     УслДЕБ[jj]="???.????.???????.???.?.106.??.310";
     УслКРЕ[jj]="((*.107.?1.410|*.208.31.660|*.302.31.730|*.304.04.310)&???.????.???????.???.?.???.??.???)|((*.401.10.15?|*.401.10.180)&???.?.??.?????.??.????.?.???.??.???)";
   fi;
 fi;
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 ОбновитьОрдер :Logical;
var КОДНФА, СЧТНФА, КОДУЧН, КОДМХЭ, КОДПОДР, КОДМОЛ, ПОСТКНТ, ПОСТМОЛ, ПОСТПБС, КОРСЧТ, КОДДВИЖ, CRDwork, BLNwork, ДНФАID_16, fld_ДАТЫ_ОПЕР :String;
var Value, FtrTrans, tmp1, tmp2 :String;
var RO, num, kk, ii, jj, pp, RECID_REF :Integer;
var OK, Режим, Work :Logical;
var SUM, KOL :Numeric;
var dBT, dET :Date;
var REC :Record;

--var RecWrk: Record;
--var BlnWrk,CrdWrk,fielddate: String;

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

-- Refresh(False);

-- OK=False;
-- if REC<>NIL: OK=RecordExists(CrdWrk, RECWrk); fi;
-- if not OK: 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;

 Refresh(False);
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Подготовка ...");
 RO=OpenWorkArea(CRDwork, "", "Ukey="+RecordToString(REC));
 Try
   dBT=GetFieldD(RO, 1, fld_ДАТЫ_ОПЕР);
   dET=dBT+1;
   FtrTrans = "("+if(flgOnly105, "", "*.101.*|")+"*.105.*|*.106.*)&(???.????.???????.???.?.???.??.???"+if(flgAddsZAB, "|ЗАБ.??.???.??", "")+")";
   FtrTrans = FtrTrans+"{ДНФАID."+ДНФАID_16+"}";
   ОчиститьПриРасчете;
   ИнициализироватьУсловияОбновления(flgOnly105, flgAddsZAB);
   num=0;
   for Transaction kk=FtrTrans, dBT, dET do num=num+1; od;
   ShowProgress(num, "Считывание информации операции движения НФА...");
   num=LengthOfArray(УслДЕБ);
   КОДМХЭ=""; КОДПОДР=""; КОДМОЛ=""; ПОСТКНТ=""; ПОСТМОЛ=""; ПОСТПБС=""; КОРСЧТ=""; КОДДВИЖ="";
   for Transaction kk=FtrTrans, dBT, dET do
     КОДНФА="";
     ProgressPos(kk);
     if TransCardFile(kk)=CRDwork:
       tmp1=TransDeb(kk);
       tmp2=TransCre(kk);
       if КОРСЧТ="": if not Match(tmp2, "*.?.10?.??.???") or Match(tmp2, "*.?.106.??.???"): КОРСЧТ=ВзятьСчет6(tmp2); fi; fi;
       if ПОСТКНТ="": ПОСТКНТ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "К",   False); fi;
       if ПОСТМОЛ="": ПОСТМОЛ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "МОЛ", False); fi;
       if ПОСТПБС="": ПОСТПБС=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "ПБС", False); fi;
       if КОДПОДР="": КОДПОДР=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "П",   False); fi;
       if КОДПОДР="": КОДПОДР=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "П",   True);  fi;
       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; Break; fi;
       od;
       if Work:
         if Match(TransQuantSign(kk),"НФА.???.??.*"): КОДНФА=TransQuantSign(kk); else КОДНФА=""; fi;
         --
         if Match(tmp1, "???.????.???????.???.?.101.??.???"): СЧТНФА=if(flgOnly105, "", SubStr(tmp1, 1, 30)+"???");
         |  Match(tmp1, "???.????.???????.???.?.105.??.???"): СЧТНФА=SubStr(tmp1, 1, 30)+"???";
         |  Match(tmp1, "???.????.???????.???.?.106.??.310"): if flgAdds106 and not flgOnly105: СЧТНФА=SubStr(tmp1, 1, 30)+"???"; fi;
         |  Match(tmp1, "???.????.???????.???.?.106.??.340"): if flgAdds106:                    СЧТНФА=SubStr(tmp1, 1, 30)+"???"; fi;
         |  Match(tmp1, "ЗАБ.??.101.??"):                     if flgAddsZAB and not flgOnly105: СЧТНФА=tmp1; fi;
         |  Match(tmp1, "ЗАБ.??.105.??"):                     if flgAddsZAB:                    СЧТНФА=tmp1; fi;
         else СЧТНФА="";
         fi;
         if СЧТНФА<>"" and КОДНФА<>"":
           КОДУЧН="";
           if КОДМХЭ="": КОДМХЭ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "М",   True);  fi;
           if КОДМОЛ="": КОДМОЛ=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "МОЛ", True);  fi;
           if КОДУЧН="": КОДУЧН=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "УЧН", True);  fi;
           if КОДУЧН="": КОДУЧН=РАБ.НФА.FUNC_LIB.ПризнакИзСтрокиАналитикиПроводки(kk, "УЧН", False); fi;
           SUM=TransSum(kk);
           KOL=TransSum(kk, "КОЛ");
           Value=КОДНФА+"@"+if(КОДУЧН="", " ", КОДУЧН)+"@"+СЧТНФА;
           jj=SearchInArray(LSTНФА, Value, True, 1);
           if jj>0:
             LSTСУМ[jj]=LSTСУМ[jj]+SUM;
             LSTКОЛ[jj]=LSTКОЛ[jj]+KOL;
           else
             pp=InsertInArraySort(LSTНФА, Value);
             InsertInArray(LSTСУМ, pp, SUM);
             InsertInArray(LSTКОЛ, pp, KOL);
           fi;
         fi;
       fi;
     fi;
   end; -- Transaction
   --
   num=LengthOfArray(LSTНФА);
   if num=0: Message("НФА для создания приходного ордера не найдено!", mtWarning); ^False; fi;
   if Точн=0: Точн=4; fi;
   ClearVariable(Позиции);
   ClearVariable(НФА_ТАБ);
   historyНДС="";
   --
   ДАТА_НАК=dBT;
   if НОМЕР=0 or НОМЕРБУМ="":SetNDOC;fi;
--   if НОМЕР=0: НОМЕР=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМЕР,НОМЕРБУМ", "ДАТА_НАК", "Ukey<>"+RecordToString(Current), 1.1.100); fi;
--   if НОМЕРБУМ="": НОМЕРБУМ=Str(НОМЕР); fi;
   if CRDwork = "РПО_ОПЕРАЦИИДНФА": КОД_ОПЕР=Lo(GetFieldS(RO, 1, "АН_ДНФА")); fi;
   --
   ВзятьРеквизиты(УЧР_REFI, False, True);
   --
   Value=Name_A(КОДПОДР);
   if Value<>" ": ПДР_НАИМ=if(Trim(Value)="", КОДПОДР, Value); ПДР_КОД=КОДПОДР; fi;
   --
   Value=Name_A(КОДМХЭ);
   if Value<>" ": МХЭ_ИМЯ =if(Trim(Value)="", КОДМХЭ, Value);  МХЭ_КОД=КОДМХЭ;  fi;
   --
   tmp1="";
   if tmp1="": tmp1=ПОСТКНТ; fi;
   if tmp1="": tmp1=ПОСТМОЛ; fi;
   if tmp1="": tmp1=ПОСТПБС; fi;
   Value=Name_A(tmp1);
   if Value<>" ": ПОСТ_ИМЯ=if(Trim(Value)="", tmp1, Value); ПОСТ_КОД=tmp1; fi;
   --
   REC=SignToRecord(КОДМОЛ, False);
   if REC<>NIL:
     tmp1=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
     tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
     Value=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp1<>"..", tmp1, ""));
     ДОЛ_ПОЛУЧ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
     ФИО_ПОЛУЧ=Value;
     КОД_ПОЛУЧ="Ф."+GetCardFieldS("СОТРУДНИКИ", REC, "ПРИЗНАК");
   fi;
   --
   КОД_СИНТ=КОРСЧТ;
   КОД_АНАЛ=РАБ.НФА.FUNC_LIB.FormatAna(КОДДВИЖ, 3, "наименования нет", "-");
   --  Основная таблица
   for ii=1 to num do
     КОДНФА=Trim(ExtractWord(1, LSTНФА[ii], "@"));
     КОДУЧН=Trim(ExtractWord(2, LSTНФА[ii], "@"));
     СЧТНФА=Trim(ExtractWord(3, LSTНФА[ii], "@"));
     pp=InsertFrame(Позиции, ii);
     Позиции[pp].НФА_КОД=КОДНФА;
     Позиции[pp].НФА_ИМЯ=Trim(Name_A(КОДНФА));
     Позиции[pp].КОД_УЧН=КОДУЧН;
     Позиции[pp].КОД_ИНВ=if(КОДУЧН<>"", Trim(Name_A("ИНВВЕД."+КОДНФА+"."+КОДУЧН)), "");
     Позиции[pp].КОД_НОМ="";
     REC=SignToRecord(КОДНФА, False);
     if REC<>NIL:
       Позиции[pp].КОД_ЕДИЗМ=GetCardFieldS("РПО_НФА", REC, "ЕДИЗМОКЕИ");
       Позиции[pp].ИМЯ_ЕДИЗМ=GetCardFieldS("РПО_НФА", REC, "ЕДИЗМ");
     else
       Позиции[pp].КОД_ЕДИЗМ="";
       Позиции[pp].ИМЯ_ЕДИЗМ=Up(Unit(КОДНФА));
     fi;
     Позиции[pp].КОЛ_ПРИН=LSTКОЛ[ii];
     if not flgКОЛ_Прин: Позиции[pp].КОЛ_ДОКМ=Позиции[pp].КОЛ_ПРИН; fi;
     Позиции[pp].СУММА_НФА=LSTСУМ[ii];
     Позиции[pp].ЦЕНАП_НФА=Round(LSTСУМ[ii]/LSTКОЛ[ii], Точн);
     Позиции[pp].НДС_СТАВ=-1;
     Позиции[pp].НДС_СУММ=0.00;
     Позиции[pp].ВСЕГО_НФА=LSTСУМ[ii];
   od;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
   ToggleAutorefresh(Режим);
 end;
 ТочностьКакНаЭкране;
 ^True;
end;

Proc РассчитатьНДСтаблицы;
var przНДС, typНДС :Numeric;
var num, ii :Integer;
var OK :Logical;
 if Позиции>0 and Позиции[1].НФА_КОД<>"":
   ClearVariable(AccTmp);
   AccTmp[1]="...";
   AccTmp[2]="НДС = 18%";
   AccTmp[3]="НДС = 10%";
   AccTmp[4]="НДС =  0%";
   AccTmp[5]="Без НДС";
   ClearVariable(AccBuf);
   AccBuf[1]="Меняем сумму С  учетом НДС";
   AccBuf[2]="Меняем сумму БЕЗ учета НДС";
   OK=True;
   while OK do
     przНДС=0.00; typНДС=0.00;
     num=Alternate("Выберите метод расчета...", AccBuf, -1, 1, 12);
     if num=1: typНДС=1.00;
     |  num=2: typНДС=2.00;
     fi;
     if typНДС>0.00:
       num=Alternate("По ставке НДС...", AccTmp, -1, 1, 12);
       if num=0: OK=False; Exit;
       |  num=1: przНДС=-1;
       |  num=2: przНДС=18.00; OK=False;
       |  num=3: przНДС=10.00; OK=False;
       |  num=4: przНДС= 0.00; OK=False;
       |  num=5: przНДС=-1;    OK=False;
       fi;
     fi;
   end; --while
   num=Позиции;
   if typНДС=2.00:
     for ii=1 to num do
       Позиции[ii].НДС_СТАВ=przНДС;
       Позиции[ii].НДС_СУММ=Round(Позиции[ii].ВСЕГО_НФА*Позиции[ii].НДС_СТАВ/(100+Позиции[ii].НДС_СТАВ), Точн);
       Позиции[ii].СУММА_НФА=Позиции[ii].ВСЕГО_НФА-Позиции[ii].НДС_СУММ;
       if flgФиксЦена:
         if Позиции[ii].ЦЕНАП_НФА=0.00: Позиции[ii].ЦЕНАП_НФА=Позиции[ii].СУММА_НФА; fi;
         Позиции[ii].КОЛ_ПРИН=Round(Позиции[ii].СУММА_НФА/Позиции[ii].ЦЕНАП_НФА, Точн);
         if not flgКОЛ_Прин: Позиции[ii].КОЛ_ДОКМ=Позиции[ii].КОЛ_ПРИН; fi;
       else
         if Позиции[ii].КОЛ_ПРИН=0.00: Позиции[ii].КОЛ_ПРИН=1; fi;
         Позиции[ii].ЦЕНАП_НФА=Round(Позиции[ii].СУММА_НФА/Позиции[ii].КОЛ_ПРИН, Точн);
       fi;
     od;
   else
     for ii=1 to num do
       Позиции[ii].НДС_СТАВ=przНДС;
       if Позиции[ii].НДС_СТАВ>0.00:
         Позиции[ii].НДС_СУММ=Round(Позиции[ii].СУММА_НФА*Позиции[ii].НДС_СТАВ/100, Точн);
         Позиции[ii].ВСЕГО_НФА=Позиции[ii].СУММА_НФА+Позиции[ii].НДС_СУММ;
       else
         Позиции[ii].НДС_СУММ=0.00;
         Позиции[ii].ВСЕГО_НФА=Позиции[ii].СУММА_НФА;
       fi;
     od;
   fi;
 else
   Message("Ошибка!^MВозможно таблица ордера пустая", mtError);
 fi;
end;

Proc ПересчетСум(FieldName:String; Iter:Integer);
 if FieldName="КОЛ_ДОКМ":
   if not flgКОЛ_Прин: if Позиции[Iter].КОЛ_ДОКМ=0.00 and Позиции[Iter].КОЛ_ПРИН>0.00: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi; fi;
 |  FieldName="КОЛ_ПРИН":
   if flgФиксЦена:
     Позиции[Iter].СУММА_НФА=Round(Позиции[Iter].КОЛ_ПРИН*Позиции[Iter].ЦЕНАП_НФА, Точн);
     if Позиции[Iter].НДС_СТАВ>0.00:
       Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн);
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Позиции[Iter].НДС_СУММ;
     else
       Позиции[Iter].НДС_СУММ=0.00;
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА;
     fi;
   else
     if Позиции[Iter].НДС_СТАВ>0.00:
       Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].ВСЕГО_НФА*Позиции[Iter].НДС_СТАВ/(100+Позиции[Iter].НДС_СТАВ), Точн);
       Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА-Позиции[Iter].НДС_СУММ;
     else
       Позиции[Iter].НДС_СУММ=0.00;
       Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА;
     fi;
     Позиции[Iter].ЦЕНАП_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_ПРИН, Точн);
   fi;
 |  FieldName="ЦЕНАП_НФА":
   if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi; fi;
   Позиции[Iter].СУММА_НФА=Round(Позиции[Iter].КОЛ_ПРИН*Позиции[Iter].ЦЕНАП_НФА, Точн);
   if Позиции[Iter].НДС_СТАВ>0.00:
     Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн);
     Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Позиции[Iter].НДС_СУММ;
   else
     Позиции[Iter].НДС_СУММ=0.00;
     Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА;
   fi;
 |  FieldName="СУММА_НФА":
   if flgФиксЦена:
     if Позиции[Iter].ЦЕНАП_НФА=0.00: Позиции[Iter].ЦЕНАП_НФА=Позиции[Iter].СУММА_НФА; fi;
     Позиции[Iter].КОЛ_ПРИН=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].ЦЕНАП_НФА, Точн);
     if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi;
   else
     if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; fi;
     Позиции[Iter].ЦЕНАП_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_ПРИН, Точн);
   fi;
   if Позиции[Iter].НДС_СТАВ>0.00:
     Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн);
     Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Позиции[Iter].НДС_СУММ;
   else
     Позиции[Iter].НДС_СУММ=0.00;
     Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА;
   fi;
 |  FieldName="НДС_СТАВ":
--   if Позиции[Iter].НДС_СТАВ>0.00:
--     Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн);
--     Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Позиции[Iter].НДС_СУММ;
--   else
--     Позиции[Iter].НДС_СУММ=0.00;
--     Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА;
--   fi;
   if flgФиксЦена:
     if Позиции[Iter].НДС_СТАВ>0.00:
       Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн);
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Позиции[Iter].НДС_СУММ;
     else
       Позиции[Iter].НДС_СУММ=0.00;
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА;
     fi;
   else
     Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].ВСЕГО_НФА*Позиции[Iter].НДС_СТАВ/(100+Позиции[Iter].НДС_СТАВ), Точн);
     Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА-Позиции[Iter].НДС_СУММ;
     if flgФиксЦена:
       if Позиции[Iter].ЦЕНАП_НФА=0.00: Позиции[Iter].ЦЕНАП_НФА=Позиции[Iter].СУММА_НФА; fi;
       Позиции[Iter].КОЛ_ПРИН=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].ЦЕНАП_НФА, Точн);
       if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi;
     else
       if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; fi;
       Позиции[Iter].ЦЕНАП_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_ПРИН, Точн);
     fi;
   fi;
 |  FieldName="НДС_СУММ": -- здесь случай только для DEL, то есть когда Позиции[Iter].НДС_СУММ=0.00
   if Позиции[Iter].НДС_СТАВ>0.00:
     if flgФиксЦена:
       Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн);
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Позиции[Iter].НДС_СУММ;
     else
       Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].ВСЕГО_НФА*Позиции[Iter].НДС_СТАВ/(100+Позиции[Iter].НДС_СТАВ), Точн);
       Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА-Позиции[Iter].НДС_СУММ;
       if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi; fi;
       Позиции[Iter].ЦЕНАП_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_ПРИН, Точн);
     fi;
   else
     Позиции[Iter].НДС_СУММ=0.00;
     if flgФиксЦена: 
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА;
     else 
       Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА;
       if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi; fi;
       Позиции[Iter].ЦЕНАП_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_ПРИН, Точн);
     fi;
   fi;
 |  FieldName="ВСЕГО_НФА":
   if Позиции[Iter].НДС_СТАВ>0.00:
       Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].ВСЕГО_НФА*Позиции[Iter].НДС_СТАВ/(100+Позиции[Iter].НДС_СТАВ), Точн);
       Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА-Позиции[Iter].НДС_СУММ;
   else
     Позиции[Iter].НДС_СУММ=0.00;
     Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА;
   fi;
   if flgФиксЦена:
     if Позиции[Iter].ЦЕНАП_НФА=0.00: Позиции[Iter].ЦЕНАП_НФА=Позиции[Iter].СУММА_НФА; fi;
     Позиции[Iter].КОЛ_ПРИН=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].ЦЕНАП_НФА, Точн);
     if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi;
   else
     if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[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].КОЛ_ПРИН=0.00  : Позиции[Iter].КОЛ_ПРИН=Value;
   |  Value<Позиции[Iter].КОЛ_ПРИН : Message("Количество по документу^Mне должно быть меньше принятого!", mtWarning); ^False;
   fi;
 |  Field="КОЛ_ПРИН":
   if Позиции[Iter].КОЛ_ДОКМ=0.00  : if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Value; fi;
   |  Позиции[Iter].КОЛ_ДОКМ<Value : Message("Количество по документу^Mне должно быть меньше принятого!", mtWarning); ^False;
   fi;
   if flgФиксЦена:
     Позиции[Iter].СУММА_НФА=Round(Value*Позиции[Iter].ЦЕНАП_НФА, Точн);
     if Позиции[Iter].НДС_СТАВ>0.00:
       Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн);
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Позиции[Iter].НДС_СУММ;
     else
       Позиции[Iter].НДС_СУММ=0.00;
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА;
     fi;
   else
     if Позиции[Iter].НДС_СТАВ>0.00:
       Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].ВСЕГО_НФА*Позиции[Iter].НДС_СТАВ/(100+Позиции[Iter].НДС_СТАВ), Точн);
       Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА-Позиции[Iter].НДС_СУММ;
     else
       Позиции[Iter].НДС_СУММ=0.00;
       Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА;
     fi;
     Позиции[Iter].ЦЕНАП_НФА=Round(Позиции[Iter].СУММА_НФА/Value, Точн);
   fi;
 |  Field="ЦЕНАП_НФА":
   if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi; fi;
   Позиции[Iter].СУММА_НФА=Round(Позиции[Iter].КОЛ_ПРИН*Value, Точн);
   if Позиции[Iter].НДС_СТАВ>0.00:
     Позиции[Iter].НДС_СУММ=Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн);
     Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Позиции[Iter].НДС_СУММ;
   else
     Позиции[Iter].НДС_СУММ=0.00;
     Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА;
   fi;
 |  Field="СУММА_НФА":
   if flgФиксЦена:
     if Позиции[Iter].ЦЕНАП_НФА=0.00: Позиции[Iter].ЦЕНАП_НФА=Value; fi;
     Позиции[Iter].КОЛ_ПРИН=Round(Value/Позиции[Iter].ЦЕНАП_НФА, Точн);
     if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi;
   else
     if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; fi;
     Позиции[Iter].ЦЕНАП_НФА=Round(Value/Позиции[Iter].КОЛ_ПРИН, Точн);
   fi;
   if Позиции[Iter].НДС_СТАВ>0.00:
     Позиции[Iter].НДС_СУММ=Round(Value*Позиции[Iter].НДС_СТАВ/100, Точн);
     Позиции[Iter].ВСЕГО_НФА=Value+Позиции[Iter].НДС_СУММ;
   else
     Позиции[Iter].НДС_СУММ=0.00;
     Позиции[Iter].ВСЕГО_НФА=Value;
   fi;
 |  Field="НДС_СУММ":
   if Позиции[Iter].НДС_СТАВ>0.00:
     if flgФиксЦена:
       if Abs(Round(Позиции[Iter].СУММА_НФА*Позиции[Iter].НДС_СТАВ/100, Точн)-Value)>0.03: 
         Message("Недопустимо большая разница между введенной^Mвручную суммой НДС и суммой НДС авторасчета!", mtError);
         ^False; 
       fi;
       Позиции[Iter].ВСЕГО_НФА=Позиции[Iter].СУММА_НФА+Value;
     else
       if Abs(Round(Позиции[Iter].ВСЕГО_НФА*Позиции[Iter].НДС_СТАВ/(100+Позиции[Iter].НДС_СТАВ), Точн)-Value)>0.03:
         Message("Недопустимо большая разница между введенной^Mвручную суммой НДС и суммой НДС авторасчета!", mtError);
         ^False; 
       fi;
       Позиции[Iter].СУММА_НФА=Позиции[Iter].ВСЕГО_НФА-Value;
       if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi; fi;
       Позиции[Iter].ЦЕНАП_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_ПРИН, Точн);
     fi;
   else
     if Value>0.00: Message("Не выбрана ставка НДС!", mtError); ^False; fi;
   fi;
 |  Field="ВСЕГО_НФА":
   if Позиции[Iter].НДС_СТАВ>0.00:
       Позиции[Iter].НДС_СУММ=Round(Value*Позиции[Iter].НДС_СТАВ/(100+Позиции[Iter].НДС_СТАВ), Точн);
       Позиции[Iter].СУММА_НФА=Value-Позиции[Iter].НДС_СУММ;
   else
     Позиции[Iter].НДС_СУММ=0.00;
     Позиции[Iter].СУММА_НФА=Value;
   fi;
   if flgФиксЦена:
     if Позиции[Iter].ЦЕНАП_НФА=0.00: Позиции[Iter].ЦЕНАП_НФА=Позиции[Iter].СУММА_НФА; fi;
     Позиции[Iter].КОЛ_ПРИН=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].ЦЕНАП_НФА, Точн);
     if not flgКОЛ_Прин: Позиции[Iter].КОЛ_ДОКМ=Позиции[Iter].КОЛ_ПРИН; fi;
   else
     if Позиции[Iter].КОЛ_ПРИН=0.00: Позиции[Iter].КОЛ_ПРИН=1; fi;
     Позиции[Iter].ЦЕНАП_НФА=Round(Позиции[Iter].СУММА_НФА/Позиции[Iter].КОЛ_ПРИН, Точн);
   fi;
 fi;
 ^True;
end;

Proc СинхроКОЛ;
var num, ii :Integer;
 if not flgКОЛ_Прин:
   num=Позиции;
   if num>0: for ii=1 to num do if Позиции[ii].КОЛ_ПРИН>0.00: Позиции[ii].КОЛ_ДОКМ=Позиции[ii].КОЛ_ПРИН; fi; od; fi;
 fi;
end;

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

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="УЧР_НАИМ"     : if УЧР_НАИМ="":  УЧР_ОКПО=""; УЧР_REFI=0; fi;
 |  Field="ПДР_НАИМ"     : if ПДР_НАИМ="":  ПДР_КОД=""; fi;
 |  Field="МХЭ_ИМЯ"      : if  МХЭ_ИМЯ="":  МХЭ_КОД=""; fi;
 |  Field="ПОСТ_ИМЯ"     : if ПОСТ_ИМЯ="": ПОСТ_КОД=""; fi;
 |  Field="КОД_АНАЛ_"    : КОД_АНАЛ=УдалитьСловоИзНабора_Диалог(КОД_АНАЛ, " ");
 |  Field="ФИО_ПОЛУЧ"    : if ФИО_ПОЛУЧ="": ДОЛ_ПОЛУЧ=""; fi;
 |  Field="ФИО_ОТПУС"    : if ФИО_ОТПУС="": ДОЛ_ОТПУС=""; fi;
 |  Field="ТОЧН_"        : if ТОЧН=0: ТОЧН=4; fi;
 |  Field="FLGТОЧНЭКРАН" : ТочностьКакНаЭкране;
 fi;
 ПересчетСум(Field, Iter);
end;

Func НДС_OnEnter(FieldName:String; Iter:Integer): Logical;
var num :Integer;
 НеПустаяТаблица;
 ClearVariable(Buf);
 Buf[1]="НДС = 18%";
 Buf[2]="НДС = 10%";
 Buf[3]="НДС =  0%";
 Buf[4]="Без НДС";
 num=Alternate("Ставка НДС", Buf, 20, 1, 12);
 if num=1: Позиции[Iter].НДС_СТАВ=18;
 |  num=2: Позиции[Iter].НДС_СТАВ=10;
 |  num=3: Позиции[Iter].НДС_СТАВ=0;
 |  num=4: Позиции[Iter].НДС_СТАВ=-1;
 | True: ^False;
 fi;
 historyНДС=Str(Позиции[Iter].НДС_СТАВ, 2);
 ПересчетСум(FieldName,Iter);
 ^False;
end;

Proc НДС_OnExit(FieldName:String; Iter:Integer);
 Позиции[Iter].НДС_СТАВ=-1;
 historyНДС="-1";
 ПересчетСум(FieldName,Iter);
end;

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

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

Func Учреждение_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
 ВзятьРеквизиты(УЧР_REFI, False, False);
 ^"";
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;
 ANA=Trim(Name_A(ПДР_КОД));
 ПДР_НАИМ=if(ANA<>"", ANA, ПДР_КОД);
 ^"";
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 МХЭ_ИМЯ<>"": МХЭ_ИМЯ=МХЭ_ИМЯ+" ["+МХЭ_КОД+"]"; else МХЭ_ИМЯ=МХЭ_КОД; fi;
 if МХЭ_ИМЯ="": МХЭ_ИМЯ=МХЭ_КОД; fi;
 ^"";
end;

Func Контр_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var ANA, MaskPost :String;
 Template.HideEditor(False);
 RefreshAna;
 if Match(КОД_СИНТ, "206.??"): MaskPost="К.*";
 |  Match(КОД_СИНТ, "208.??"): MaskPost="МОЛ.*";
 |  Match(КОД_СИНТ, "302.??"): MaskPost="К.*";
 |  Match(КОД_СИНТ, "304.??"): MaskPost="ПБС.*";
 else MaskPost="К.*|МОЛ.*|ПБС.*";
 fi;
 ANA=AnaElection(MaskPost, False, False, ПОСТ_КОД);
 if ANA="": ^""; fi;
 ПОСТ_КОД=ANA;
 ПОСТ_ИМЯ=Trim(Name_A(ПОСТ_КОД));
 --if ПОСТ_ИМЯ<>"": ПОСТ_ИМЯ=ПОСТ_ИМЯ+" ["+ПОСТ_КОД+"]"; else ПОСТ_ИМЯ=ПОСТ_КОД; fi;
 if ПОСТ_ИМЯ="": ПОСТ_ИМЯ=ПОСТ_КОД; fi;
 ^"";
end;

Func СчетСубсчет_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
 Template.HideEditor(False);
 КОД_СИНТ=ВыборСчетаКорр(flgOnly105, КОД_СИНТ);
 ^"";
end;

Func СправКорр_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var BindANA, ANA, MaskAccKorr :String;
var num :Integer;
 Template.HideEditor(False);
 ClearVariable(Buf);
 Buf[1]="Аналитика счетов НФА";
 Buf[2]="Аналитика корреспондирующих счетов НФА";
 num=Alternate("Выберите аналитику...", Buf, -1, 1, 12);
 if num=1: MaskAccKorr=if(flgOnly105, "*.105.*", "*.101.*|*.105.*");
 |  num=2: if Match(КОД_СИНТ, "???.??"): 
             MaskAccKorr="*."+КОД_СИНТ+".???";
           else 
             if Trim(КОД_СИНТ)="":
               Message("Предварительно выберите 'Корреспондирующий счет; счет, субсчет'", mtWarning); Template.Field="КОД_СИНТ";
             else
               Message("Некорректное значение в поле 'Корреспондирующий счет; счет, субсчет'", mtWarning); Template.Field="КОД_СИНТ";
             fi;
             ^"";
           fi;
 else ^"";
 fi;
 BindANA=СправочникиСтруктурыПоМаскеСчетовПрогресс(MaskAccKorr, 1.1.100, if(ДАТА_НАК>1.1.2000, ДАТА_НАК+1, ToDay+1), True, True);
 if Trim(BindANA)<>"":
   ANA=AnaElection(BindANA, False, False, КОД_АНАЛ);
   if ANA<>"": 
     КОД_АНАЛ=ДобавитьПризнак(КОД_АНАЛ, ANA);
     КОД_АНАЛ=СортироватьНаборСлов(КОД_АНАЛ, " ", True);
   fi;
 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;

Func Сотрудники_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var FieldName, стрФИО, стрДОЛ, стрАНА, tmp1, tmp2 :String;
var REC, RECsave :Record;
 Template.HideEditor(False);
 RefreshAna;
 RECsave=NIL; tmp1=""; tmp2=""; стрФИО=""; стрДОЛ=""; стрАНА="";
 FieldName=asString(Template.Field);
 if Match(FieldName, "???_ОТПУС"): RECsave=SignToRecord(КОД_ОТПУС, False);
 |  Match(FieldName, "???_ПОЛУЧ"): RECsave=SignToRecord(КОД_ПОЛУЧ, False);
 fi;
 REC=OpenCardFile("СОТРУДНИКИ", "", RECsave, crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 стрДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ");
 tmp1=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
 стрФИО=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp1<>"..", tmp1, ""));
 стрАНА="Ф."+GetCardFieldS("СОТРУДНИКИ", REC, "ПРИЗНАК");
 if FieldName="ДОЛ_ОТПУС" : ДОЛ_ОТПУС=стрДОЛ; ФИО_ОТПУС=стрФИО; КОД_ОТПУС=стрАНА;
 |  FieldName="ФИО_ОТПУС" : ДОЛ_ОТПУС=стрДОЛ; ФИО_ОТПУС=стрФИО; КОД_ОТПУС=стрАНА;
 |  FieldName="ДОЛ_ПОЛУЧ" : ДОЛ_ПОЛУЧ=стрДОЛ; ФИО_ПОЛУЧ=стрФИО; КОД_ПОЛУЧ=стрАНА;
 |  FieldName="ФИО_ПОЛУЧ" : ДОЛ_ПОЛУЧ=стрДОЛ; ФИО_ПОЛУЧ=стрФИО; КОД_ПОЛУЧ=стрАНА;
 fi;
 ^"";
end;

2-- События объектов
Proc cbЗащита_onChange(Sender:String);
var Flag, SaveOK :Logical;
var num :Integer;
 Flag=False;
 if not Защита:
   SaveOK=True; -- если защита 'снимается' значит проверка данных уже производилась
   num=EnqOkCancel("Вы действительно хотите снять^Mзащиту от изменений^Mу данного документа?", mtConfirmation);
   if num=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="btnSave"   : EditorApply; Close;
 |  Sender="btnClose"  : if not Защита: EditorCancel; fi; Close;
 |  Sender="btnUpdate" : if ОбновитьОрдер: Message("Обновление накладной успешно завершено!", mtInformation); fi;
 |  Sender="btnReMove" : РАБ.НФА.FUNC_LIB.Перейти_к_ОперацинномуДокументу(CRD, BLNCRD, ДНФАID, RECCRD, GetActiveBlankName);
 fi;
end;

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;

2-- События шаблона
Proc Инициализация(CreateNew:Logical);
 if CreateNew:
   ДАТА_НАК=ToDay;
   SetNDOC;
--   НОМЕР=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМЕР", "ДАТА_НАК", "Ukey<>"+RecordToString(Current), 1.1.100);
--   НОМЕРБУМ=Str(НОМЕР);
   FLGФИКСЦЕНА=True;
   ТОЧН=4;
   FLGТОЧНЭКРАН=False;
   FLGКОЛ_ПРИН=False;
   ЗАЩИТА=False;
   flgAddsZAB=False;
   flgAdds106=False;
 fi;
 if not Защита: НеПустаяТаблица; fi;
 ТолькоЧтение(Защита);
 СформированИзДНФА;
 ВзятьРеквизиты(УЧР_REFI, False, True);
 if flgТочнЭкран: ПрименитьТочность(",##0.00"+RepStr("#", Точн-2)+";;-"); else ПрименитьТочность(",##0.00;;-"); fi;
 ВыборПеременнойДляНомера(ВИД_АНА_НОМ);
end;

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

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
 if First: Инициализация(NewREC); 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 not First: Инициализация(NewREC); fi;
 Template.Field="Фокус";
end;

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

Func Template_OnValidate: Logical; -- при проверке шаблона
var SaveOK :Logical;
var num :Integer;
 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;

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