-- Шаблон создан мастером бланков
-- 04.03.2005 10:56:36
--
БланкСШаблоном  "Авансовый отчет", Редактор РПО_АВАНС_ОТЧЕТ;

var First:L;
var ДенДокВид_Номинал_[]:S=Str(Позиции[$].ДенДок_Вид.Номинал,Позиции[$].ДенДок_Вид.Точ);

Var SQLver:l;    -- расчитывается при открытии бланка (шаблонпослеоткрытия)
var CopyClosedModFob:l=ClosedModFob;
var ИМЯКРТ   :s='РПО_АВАНС_ОТЧЕТ';-- Картотека которую редактирует данный бланк
ФлCopyClosedModFob:object;
var установили_блокировку:l;
2func UpdateTimeSecCurrent:i;0 2^UpdateTimeSec;0 2end;-- функция обязательная для работы с SQL запросами

proc ПриИзменении(s:s);
2-- блок обработки до проверки разрешения на изменения
 if  s='ФлCopyClosedModFob':
     if not ClosedModFob:
        if EnqOkCancel('Вы не сможете снять блокировку, если недостаточно прав!^MУстановить блокировку?^M',mtWarning)=кмдВерно:
           ClosedModFob=true;--блокировка от удаления
         | true:exit;
        fi;
      | true:-- надо снять флаг
        try
          ClosedModFob=false;
        except
          Message('У Вас нет прав на снятие блокировки!^M',mtWarning);
        end;
--        Раб.SQL.SetClosedModFobUpdateOnBlankEditor_false(ИМЯКРТ,current,5,SQLver,false);
     fi;
     установили_блокировку=true;
     РедакторПрименить;
     установили_блокировку=false;
     ClearVariable(CopyClosedModFob);
     if AsLogical(ФлCopyClosedModFob.State)<>ClosedModFob:
        ФлCopyClosedModFob.State=ClosedModFob;
     fi;
     exit;
 fi;
end;

Расписка:L;
АльтПолучАв:L;

cbПроводить:Object;
btnДатаОпер:Object;
edДатаОпер :Object;
btnРасчет  :Object;
cbУчетБО   :Object;
cbНеПровДО :Object;
cbДенДок   :Object;

Секц0 : Section; --Раписка
Секц1 : Section;
Секц2 : Section;
Секц3 : Section;
Секц4 : Section;
Секц5 : Section;
Секц6 : Section;
Секц7 : Section;
Секц8 : Section;
Секц9 : Section;
Секц10: Section;
Секц11: Section;
Секц12: Section;
Секц13: Section;
Секц14: Section;
Секц15: Section;
Секц16: Section;
Секц17: Section;


var FlagEdit:L=[True];

--var FlagДенДок:L=[True];

var НоваяЗапись:L=(CurrentState=crdusInserted);

var ПризнАванс_:S=Name_A(ПризнАванс);

var ФИОМОЛ_:S="";

var Валюта_:S=if(Валюта=BaseCurrency,"",Валюта);

var РасчетВОВП:S=if(Проводить,"","Расчитать");
--var СоздатьКО:S=if(Проводить,"","Создать ПКО/РКО");
var СоздатьКО:S="Создать ПКО/РКО";
var СведВОВП:S=if(Проводить,"","Заполнить из ПКО/РКО");


var Сум_Руб:N=Сум0_Руб+Сум1_Руб+Сум2_Руб+Сум3_Руб+Сум4_Руб;
var Сум_Вал:N=Сум0_Вал+Сум1_Вал+Сум2_Вал+Сум3_Вал+Сум4_Вал;

var Расх_:I;
var Дт[]:S;
var Кт[]:S;
var СумОтч_Руб[]:N;
var СумОтч_Вал[]:N;
var СумУчт_Руб[]:N;
var СумУчт_Вал[]:N;
var ИтогСумУчт_Руб:N=SumOfArray(СумУчт_Руб,10);

var BufДт[]:S;
var BufКт[]:S;
var BufСумОтч_Руб[]:N;
var BufСумОтч_Вал[]:N;
var BufСумУчт_Руб[]:N;
var BufСумУчт_Вал[]:N;

var Гр7:I=7;
var Гр8:I=8;

var пп[]:i=$;
var СчКре_:S="";
var Призн_[]:s=Позиции[$].Призн;
var ВыборИзОтч:S=if(Проводить,"","Выбрать из отчета");
var ffff:S="";

var ДО_КОСГУ[]:S=if(НеПровДО,"",Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",SubStr(Позиции[$].СчКре,28,2)));
var СчДеб_ДО[]:S=if(ДО_КОСГУ[$]="","",SubStr(Позиции[$].СчКре,1,23)+"502.11."+ДО_КОСГУ[$]);
var СчКре_ДО[]:S=if(ДО_КОСГУ[$]="","",SubStr(Позиции[$].СчКре,1,23)+"502.12."+ДО_КОСГУ[$]);
var Контр_  []:S=Позиции[$].Контр.КорИмя+" "+Позиции[$].Контр.ЮрАдрес;

var ВсегоОтч_Руб=SumOfArray(Позиции[].Отч_Руб,Позиции);
var ВсегоОтч_Вал=SumOfArray(Позиции[].Отч_Вал,Позиции);
var ВсегоУчт_Руб=SumOfArray(Позиции[].Учт_Руб,Позиции);
var ВсегоУчт_Вал=SumOfArray(Позиции[].Учт_Вал,Позиции);

var Текст1[]:S=if($=1,"Израсходовано, всего","");
var Текст2[]:S=if($=1,"Остаток","");
var Текст3[]:S=if($=1,"Перерасход","");

var ВсегоОстаток_Отч_Руб:N=SumOfArray(Остаток[].Отч_Руб,Остаток);
var ВсегоОстаток_Отч_Вал:N=SumOfArray(Остаток[].Отч_Вал,Остаток);
var ВсегоОстаток_Учт_Руб:N=SumOfArray(Остаток[].Учт_Руб,Остаток);
var ВсегоОстаток_Учт_Вал:N=SumOfArray(Остаток[].Учт_Вал,Остаток);

var ВсегоПерерасход_Отч_Руб:N=SumOfArray(Перерасход[].Отч_Руб,Перерасход);
var ВсегоПерерасход_Отч_Вал:N=SumOfArray(Перерасход[].Отч_Вал,Перерасход);
var ВсегоПерерасход_Учт_Руб:N=SumOfArray(Перерасход[].Учт_Руб,Перерасход);
var ВсегоПерерасход_Учт_Вал:N=SumOfArray(Перерасход[].Учт_Вал,Перерасход);

var Остаток_Руб:N=Round(ОстП_Руб+Сум_Руб-ВсегоУчт_Руб-ПрРасхП_Руб,2);
var Остаток_Вал:N=Round(ОстП_Вал+Сум_Вал-ВсегоУчт_Вал-ПрРасхП_Вал,2);

var Ост_Руб:N=Deb(Остаток_Руб);
var Ост_Вал:N=Deb(Остаток_Вал);
var ПрРасх_Руб:N=Cre(Остаток_Руб);
var ПрРасх_Вал:N=Cre(Остаток_Вал);

var Проп:S=if(Round(ВсегоУчт_Руб,2)=0,"",Slo(ВсегоУчт_Руб));

var КонтрРЗ_[]:s=РЗ[$].Контр.КорИмя+" "+РЗ[$].Контр.ЮрАдрес;

var ВсегоСумСНДС:N=SumOfArray(РЗ[].СумСНДС,РЗ);

var МаскаСч1:S="*.?.208.??.660";
var МаскаСч2:S="*.?.208.??.*";

var Clr:S=if(Проводить,"","Очист");
var A :S=if(Проводить,"","+");
var AA:S=if(Проводить,"","++");
var D :S=if(Проводить,"","-");

var SelfCrd:S="РПО_АВАНС_ОТЧЕТ";
var SelfBln:S="ДОКУМЕНТЫ.ПРОЧИЕ.АВАНСОТЧЕТ";

var Buf[]:S;
var Buf2[]:S;
var Buf3[]:S;
var BufI[]:I;
var BufN[]:N;
var BufN2[]:N;
var BufSum[]:N;
var BufSum2[]:N;

var BufField[]:S;
var BufColorBg[]:I;
var BufColorFo[]:I;

var hКонтр:Record;
var hПризнАванс:S;

var fОКДП:I;
var fОКПД:I;
var ОКДП_ГР_:S;
var ОКДП_:S;

var fОКЕИ:I;

var ИсклПризн:S="МОЛ.*|ОКДП.*|ОКДП2.*|ОКПД.*|БО.*|АВ.*|СОП.*";

var verОКДП_Гр_:S=if(verОКДП_Гр=273,"в ред. прик. № 273","в ред. прик. № 601");
--
--Процедуры и функции -------------
Proc Инициализация;
var n,l,s,r,c,rr,cc,BgColor:i;
var Field:S;
var Obj: Object;
 ClearVariable(BufField);
 ClearVariable(BufColorBg);
 ClearVariable(BufColorFo);
 for s=1..14 do
  if FindObject("Секц"+Str(s),Obj):
     rr=asInteger(Obj.RowsCount);
     cc=asInteger(Obj.ColsCount);
     for r=1 ..rr  do
      for c=1 ..cc  do
       BgColor=asInteger(Obj.Cell(r,c,CellBgColor,""));
       if BgColor=coAqua or BgColor=coTeal or BgColor=coYellow:
          Field=asString(Obj.Cell(r,c,CellContents,""));
          if not Field="":
             if SearchInArray(BufField,Field,True)=-1:
                n=InsertInArraySort(BufField,Field);
                InsertInArray(BufColorBg,n,BgColor);
             fi;
          fi;
       fi;
      od;
     od;
  fi;
 od;
 l=LengthOfArray(BufField);
 for n=1..l do
  if BufColorBg[n]=coTeal: BufColorFo[n]=coWhite;
    |True: BufColorFo[n]=coBlack;
  fi;
 od;
end;

Proc СкрытиеПустТабл;
var v8, v9, v10:L;
  v8 = False;
  v9 = False;
  v10 = False;

  if Получ4<>"" or Сум4_Руб <> 0 or Сум4_Вал <> 0 or 
     Дт[06]<> "" or Кт[06] <> "" or СумУчт_Руб[06] <> 0 or
     Получ3<>"" or Сум3_Руб <> 0 or Сум3_Вал <> 0:
      v8 = True; v9 = True; v10 = True;

   | Получ3<>"" or Сум3_Руб <> 0 or Сум3_Вал <> 0 or
     Дт[05]<> "" or Кт[05] <> "" or СумУчт_Руб[05] <> 0 or
     Получ2<>"" or Сум2_Руб <> 0 or Сум2_Вал <> 0:
      v8 = True; v9 = True;

   | Получ2<>"" or Сум2_Руб <> 0 or Сум2_Вал <> 0 or
     Дт[04]<> "" or Кт[04] <> "" or СумУчт_Руб[04] <> 0 or
     Получ1<>"" or Сум1_Руб <> 0 or Сум1_Вал <> 0:
      v8 = True;

  fi;
  Секц3.Row(8, RowVisible, v8);
  Секц3.Row(9, RowVisible, v9);
  Секц3.Row(10, RowVisible, v10);

end;

Proc Оформление;
var s,c,r,cc,rr,n:i;
var Obj: Object;
var Flag:L;
 btnДатаОпер.Enabled=not Проводить;
 edДатаОпер.Enabled=not Проводить;
 btnРасчет.Enabled=not Проводить;
 cbДенДок.Enabled=not Проводить;
 if ДенДок:
    Секц9.CellLinks(14,2,15,2);
    Секц9.CellLinks(16,2,17,2);
    Секц9.Cell(2,14,CellBorder,"1,1,1,1");
    Секц9.Cell(2,16,CellBorder,"1,1,1,1");
    Секц9.Cell(2,14,CellBgColor,coTransparent);
    Секц9.Cell(2,16,CellBgColor,coAqua  );

    Секц9.Cell(2,16,CellFieldType,cftStringField);
    Секц9.Cell(2,16,CellContents,"СерияБум");
    Секц9.Cell(2,14,CellFieldType,cftStaticText);
    Секц9.Cell(2,14,CellContents,"Серия документа:");
   else
    for c=14..17 do
      Секц9.CellLinks(c,2);
      Секц9.Cell(2,c,CellBorder,"1,0,1,1");
      Секц9.Cell(2,c,CellBgColor,coAqua  );
      Секц9.Cell(2,c,CellReadOnly,True  );
      Секц9.Cell(2,c,CellFieldType,cftStringField);
      Секц9.Cell(2,c,CellContents,"ffff");
    od;
 fi;
 Секц9.Row(3,RowVisible,ДенДок);
 for s=1..14 do
  if FindObject("Секц"+Str(s),Obj):
     rr=asInteger(Obj.RowsCount);
     cc=asInteger(Obj.ColsCount);
     for r=1..rr do
      for c=1..cc do
       n=SearchInArray(BufField,asString(Obj.Cell(r,c,CellContents,"")),True);
       if not n=-1:
          if Проводить or (ДенДок and s=9 and BufField[n]="Кол")
             or (RECCRD<>0 AND (s=9 or s=2)):
             Obj.Cell(r,c,CellFontColor,coBlack);
             Obj.Cell(r,c,CellBgColor,coTransparent);
             Obj.Cell(r,c,CellReadOnly,True);
            else
             Obj.Cell(r,c,CellFontColor,BufColorFo[n]);
             Obj.Cell(r,c,CellBgColor,BufColorBg[n]);
             Obj.Cell(r,c,CellReadOnly,False);
          fi;
       fi;
      od;
    od;
  fi;
 od;
 Секц0.Row(1,RowNewPage,Расписка);
 Секц14.Visible=ver<2;
 Секц15.Visible=ver<2;
 Секц16.Visible=ver<2;
 --
 Flag=ДатаДок>=1.1.2014 or ДатаОпер>1.1.2014;
 Секц13.Column(7 ,ColVisible,not Flag); --ОКДП
 Секц13.Column(8 ,ColVisible,not Flag );
 Секц9.Column(7 ,ColVisible,not Flag); --ОКДП
 Секц9.Column(8 ,ColVisible,not Flag);
 Секц17.Column(7 ,ColVisible,not Flag); --ОКДП
 Секц17.Column(8 ,ColVisible,not Flag);
 Секц13.Column(9 ,ColVisible,Flag); --ОКПД
 Секц13.Column(10,ColVisible,Flag);
 Секц9.Column(9 ,ColVisible,Flag); --ОКПД
 Секц9.Column(10,ColVisible,Flag);
 Секц17.Column(9 ,ColVisible,Flag); --ОКПД
 Секц17.Column(10,ColVisible,Flag);
 СкрытиеПустТабл;
end;

Proc НеПустаяСтрока;
 if Сведения<1: InsertFrame(Сведения,1); fi;
 if Позиции<1: InsertFrame(Позиции,1); fi;
 if Остаток<1: InsertFrame(Остаток,1); fi;
 if Перерасход<1: InsertFrame(Перерасход,1); fi;
end;

Proc УдалитьПустыеСтроки;
var n:i;
 n=1;
 While n<=Позиции do
  if Позиции[n].ДДок=1.1.100 and
     Позиции[n].НДок="" and
     Позиции[n].Содерж="" and
     Позиции[n].Содерж="" and
     Позиции[n].Отч_Руб=0 and
     Позиции[n].Отч_Вал=0 and
     Позиции[n].Учт_Руб=0 and
     Позиции[n].Учт_Вал=0 and
     Позиции[n].СчДеб="" and
     Позиции[n].СчКре="" and
     Позиции[n].Призн="": DeleteFrame(Позиции,n);
    else
     n=n+1;
  fi;
 od;
 НеПустаяСтрока;
end;

Proc Очистить;
 ClearVariable(Расх_);
 ClearVariable(Дт);
 ClearVariable(Кт);
 ClearVariable(СумОтч_Руб);
 ClearVariable(СумОтч_Вал);
 ClearVariable(СумУчт_Руб);
 ClearVariable(СумУчт_Вал);
end;

Proc РасчетБухИтогов;
var Iter,n:i;
var Key:S;
 Очистить;
 ClearVariable(Buf);
 ClearVariable(BufДт);
 ClearVariable(BufКт);
 ClearVariable(BufСумОтч_Руб);
 ClearVariable(BufСумОтч_Вал);
 ClearVariable(BufСумУчт_Руб);
 ClearVariable(BufСумУчт_Вал);
 УдалитьПустыеСтроки;
 for Iter=1..Позиции do
  if not Позиции[Iter].СчДеб="" and not Позиции[Iter].СчКре="" and not Round(Позиции[Iter].Учт_Руб,2)=0:
     Key=Позиции[Iter].СчДеб+" "+Позиции[Iter].СчКре;
     n=SearchInArray(Buf,Key,True);
     if n=-1:
        n=InsertInArraySort(Buf,Key);
        InsertInArray(BufДт,n,Позиции[Iter].СчДеб);
        InsertInArray(BufКт,n,Позиции[Iter].СчКре);
        InsertInArray(BufСумОтч_Руб,n,Позиции[Iter].Отч_Руб);
        InsertInArray(BufСумОтч_Вал,n,Позиции[Iter].Отч_Вал);
        InsertInArray(BufСумУчт_Руб,n,Позиции[Iter].Учт_Руб);
        InsertInArray(BufСумУчт_Вал,n,Позиции[Iter].Учт_Вал);
       else
        BufСумОтч_Руб[n]=BufСумОтч_Руб[n]+Позиции[Iter].Учт_Руб;
        BufСумОтч_Вал[n]=BufСумОтч_Вал[n]+Позиции[Iter].Учт_Вал;
        BufСумУчт_Руб[n]=BufСумУчт_Руб[n]+Позиции[Iter].Учт_Руб;
        BufСумУчт_Вал[n]=BufСумУчт_Вал[n]+Позиции[Iter].Учт_Вал;
     fi;
  fi;
 od;
 CopyArray(BufДт,Дт);
 CopyArray(BufКт,Кт);
 CopyArray(BufСумОтч_Руб,СумОтч_Руб);
 CopyArray(BufСумОтч_Вал,СумОтч_Вал);
 CopyArray(BufСумУчт_Руб,СумУчт_Руб);
 CopyArray(BufСумУчт_Вал,СумУчт_Вал);
 Расх_ = LengthOfArray(Buf);
 if Расх_ >10: Message("Внимание ! Число уникальных комбинаций счетов (в таблице бухгалтерских записей) превысило 10. Разбейте авансовый отчет.",mtWarning); fi;
 СкрытиеПустТабл;
end;

Proc РасчетОст;
var Iter,n,nn,z:i;
var Сч_,ВД_:S;
 ClearVariable(Buf);
 ClearVariable(BufSum);
 Раб.Свертка.РазрешитьПрогресс=False;
 Раб.Свертка.ВыполнитьОбновление=True;
 Раб.Свертка.РазрешитьАналитику=False;
 Раб.Свертка.РазрешитьСинтетику=True;
 Раб.Свертка.ДН=1.1.1900;
 Раб.Свертка.ДК=if(ДатаОпер=1.1.100,ДатаДок+1,ДатаОпер+1);
 Раб.Свертка.УслСч="*.?.208.??.*";
 Раб.Свертка.УслАн=Раб.Бюджет2005.Объединить(ПризнМОЛ,ПризнАванс,"&");
 Раб.Свертка.Расщепление=TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna;
 Раб.Свертка.МаскаСправ="";
 Раб.Свертка.ПолнСоотвМаскеСправ=False;
 Раб.Свертка.spМаскаСправ="|";
 Раб.Свертка.СжатиеСправ="";
 Раб.Свертка.ПорядокПоМаскеСправ=False;
 Раб.Свертка.ТипСинтетики="КБК+СЧ6";
 nn=Раб.Свертка.Расчет;
 if АльтПолучАв:
    Сум0_Руб=0; Сум0_Вал=0;
    if Раб.Свертка.Список_Синт[1]="":
       Получ1=""; Сум1_Руб=0; Сум1_Вал=0;
      else
       Получ1=Раб.Бюджет2005.ВзятьКодСчета(Раб.Свертка.Список_Синт[1],"","БК",False)+"."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Раб.Свертка.Список_Синт[1],"","Ан",False));
       Сум1_Руб=Раб.Свертка.Сум1[1]; Сум1_Вал=0;
    fi;
    if Раб.Свертка.Список_Синт[2]="":
       Получ2=""; Сум2_Руб=0; Сум2_Вал=0;
      else
       Получ2=Раб.Бюджет2005.ВзятьКодСчета(Раб.Свертка.Список_Синт[2],"","БК",False)+"."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Раб.Свертка.Список_Синт[2],"","Ан",False));
       Сум2_Руб=Раб.Свертка.Сум1[2]; Сум2_Вал=0;
    fi;
    if Раб.Свертка.Список_Синт[3]="":
       Получ3=""; Сум3_Руб=0; Сум3_Вал=0;
      else
       Получ3=Раб.Бюджет2005.ВзятьКодСчета(Раб.Свертка.Список_Синт[3],"","БК",False)+"."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Раб.Свертка.Список_Синт[3],"","Ан",False));
       Сум3_Руб=Раб.Свертка.Сум1[3]; Сум3_Вал=0;
    fi;
    if Раб.Свертка.Список_Синт[4]="":
       Получ4=""; Сум4_Руб=0; Сум4_Вал=0;
      else
       Получ4=Раб.Бюджет2005.ВзятьКодСчета(Раб.Свертка.Список_Синт[4],"","БК",False)+"."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Раб.Свертка.Список_Синт[4],"","Ан",False));
       Сум4_Руб=Раб.Свертка.Сум1[4]; Сум4_Вал=0;
    fi;
    if nn>4:
       Message("Недостаточно строк в разделе 'Получен аванс', часть данных не может быть отображена",mtWarning);
    fi;
   else
    Сум0_Руб=SumOfArray(Раб.Свертка.Сум1,nn); Сум0_Вал=0;
    Получ1=""; Сум1_Руб=0; Сум1_Вал=0;
    Получ2=""; Сум2_Руб=0; Сум2_Вал=0;
    Получ3=""; Сум3_Руб=0; Сум3_Вал=0;
    Получ4=""; Сум4_Руб=0; Сум4_Вал=0;
 fi;
 CopyArray(Раб.Свертка.Список_Синт,Buf);
 CopyArray(Раб.Свертка.Сум1,BufSum);
 for Iter=1..Позиции do
  if not Позиции[Iter].СчКре="":
     Сч_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"","АН",True);
     z=SearchInArray(Buf,Сч_,True);
     if z=-1:
        z=InsertInArraySort(Buf,Сч_);
        InsertInArray(BufSum,z,-Позиции[Iter].Учт_Руб);
       else
        BufSum[z]=BufSum[z]-Позиции[Iter].Учт_Руб;
     fi;
  fi;
 od;
 ClearVariable(Остаток);
 ClearVariable(Перерасход);
 nn=LengthOfArray(Buf);
 for n=1..nn do
  ВД_=Раб.Бюджет2005.ВзятьКодСчета(Buf[n],"","ВД",False);
  if Round(BufSum[n],2)>0:
     Iter=InsertFrame(Остаток,Остаток+1);
     Остаток[Iter].СчДеб=Buf[n]+".560";
     Остаток[Iter].СчКре="";
     Остаток[Iter].Отч_Руб=0;
     Остаток[Iter].Отч_Вал=0;
     Остаток[Iter].Учт_Руб=BufSum[n];
     Остаток[Iter].Учт_Вал=0;
    |Round(BufSum[n],2)<0:
     Iter=InsertFrame(Перерасход,Перерасход+1);
     Перерасход[Iter].СчДеб="";
     Перерасход[Iter].СчКре=Buf[n]+".660";
     Перерасход[Iter].Отч_Руб=0;
     Перерасход[Iter].Отч_Вал=0;
     Перерасход[Iter].Учт_Руб=-BufSum[n];
     Перерасход[Iter].Учт_Вал=0;
  fi;
 od;
 if not ПризнАванс="":
    ОстП_Руб=Saldo("*.?.208.??.*{"+ПризнМОЛ+"&~"+ПризнАванс+"}",ДатаДок);
    ПрРасхП_Руб=Cre(ОстП_Руб);
    ОстП_Руб=Deb(ОстП_Руб);
 fi;
end;

Func ПроверитьБО:L;
var Iter:I;
var БК_,КОСГУ_,ВД_,СчД_,СчК_,ПризнБО_:s;
 if УчетБО:
    Раб.КСА.Начать;
    for Iter=1..Позиции do
     БК_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","БК",False);
     ВД_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","ВД",False);
     КОСГУ_=Раб.Бюджет2005.Соотв_Ан_КОСГУ(Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","СИНТ",False),Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","АН",False));
     if ВД_="1": СчД_=БК_+".1.501.13."+КОСГУ_; СчК_=БК_+".1.502.11."+КОСГУ_;
       |not ВД_="3": СчД_=БК_+"."+ВД_+".506.10."+КОСГУ_; СчК_=БК_+"."+ВД_+".502.11."+КОСГУ_;
     fi;
     Раб.КСА.Добавить(СчД_); Раб.КСА.Добавить(СчК_);
    od;
    if Раб.КСА.Закончить(True): Message("Добавление счетов завершено"); fi;
    for Iter=1..Позиции do
     БК_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","БК",False);
     ВД_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","ВД",False);
     КОСГУ_=Раб.Бюджет2005.Соотв_Ан_КОСГУ(Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","СИНТ",False),Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","АН",False));
     if ВД_="1": СчД_=БК_+".1.501.13."+КОСГУ_; СчК_=БК_+".1.502.11."+КОСГУ_;
       |not ВД_="3": СчД_=БК_+"."+ВД_+".506.10."+КОСГУ_; СчК_=БК_+"."+ВД_+".502.11."+КОСГУ_;
     fi;
     if СчД_="": Message("Неизвестный счет дебета "+СчД_,mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
     if СчК_="": Message("Введите счет кредита "+СчК_,mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
     if not Correspond(СчД_,СчК_): Message("Счета '"+СчД_+"/"+СчК_+"' не могут корреспондировать",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
     ПризнБО_=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","БО.*","");
     if ПризнБО_="": ПризнБО_=" БО.000"; else ПризнБО_=""; fi;
     if Раб.Бюджет.ПроверитьПризнакиОбязательные(СчД_,СчК_,Позиции[Iter].Призн+" "+ПризнПодр+" "+ПризнМОЛ+ПризнБО_,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
     if Раб.Бюджет.ПроверитьПризнакиСвязанные(СчД_,СчК_,Позиции[Iter].Призн+" "+ПризнПодр+" "+ПризнМОЛ+ПризнБО_,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
    od;
 fi;
 ^True;
end;

Func Проверить:L;
var Iter:I;
var Mask:s;
var tmp,tmp2:s;
 УдалитьПустыеСтроки;
 if ДатаОпер=1.1.100: Message("Введите дату операции",mtError); Template.Object="btnДатаОпер"; ^False; fi;
 if not ДатаДок=1.1.100 and not Year(ДатаДок)=Year(ДатаДок): 
    if EnqOkCancel("Внимание! Год даты документа "+Str(Year(ДатаДок))+" отличается от года даты операции "+Str(Year(ДатаОпер))+" Игнорировать ?",mtWarning)=cmCancel: Template.Field="ДатаДок";  ^False; fi;
 fi;
 if not ПризнАванс="" and Name_A(ПризнАванс)=" ": Message("Неизвестный идентификатор аналитического признака "+ПризнАванс,mtError); Template.Field="ПризнАванс"; ^False; fi;
 if ПризнМОЛ="": Message("Введите подотчетное лицо",mtError); Template.Field="ФИОМОЛ"; ^False; fi;
 if Name_A(ПризнМОЛ)=" ": Message("Неизвестный идентификатор аналитического признака "+ПризнМОЛ,mtError); Template.Field="ФИОМОЛ"; ^False; fi;
 if not ПризнПодр="" and Name_A(ПризнПодр)=" ": Message("Неизвестный идентификатор аналитического признака "+ПризнПодр,mtError); Template.Field="НаимПодр"; ^False; fi;
 if Валюта="":Message("Укажите валюту",mtError); Template.Field="Валюта_"; ^False; fi;
 if Name_C(Валюта)=" ":Message("Неизвестный идентификатор валюты "+Валюта,mtError); Template.Field="Валюта_"; ^False; fi;
 Раб.КСА.Начать;
 for Iter=1..Позиции do
  Раб.КСА.Добавить(Позиции[Iter].СчДеб);
  Раб.КСА.Добавить(Позиции[Iter].СчКре);
  if not НеПровДО:
     Раб.КСА.Добавить(СчДеб_ДО[Iter]);
     Раб.КСА.Добавить(СчКре_ДО[Iter]);
  fi;
 od;
 if Раб.КСА.Закончить(True): Message("Добавление счетов завершено"); fi;
 RefreshAna;
 if not ПризнБО="":
    if Name_A(ПризнБО)=" ": Message("Неизвестный идентификатор аналитического признака "+ПризнБО,mtError); Template.Field="ПризнБО"; ^False; fi;
 fi;
 Раб.Бюджет.ПроверитьПризнакиНачать;
 for Iter=1..Позиции do
  if (not Round(Позиции[Iter].Цена,2)=0 or not Round(Позиции[Iter].Кол,6)=0 or not Позиции[Iter].ЕдИзм="") and not ДенДок:
    if not Позиции[Iter].Предм="" or not Позиции[Iter].ОКДП_Гр="" or not Позиции[Iter].ОКДП="" or  not Позиции[Iter].Контр=nil:
       if Позиции[Iter].Предм="": Message("Заполните краткое наименование товара, работы, услуги",mtError); Template.Field="Предм"; Template.Frame=Iter; ^False; fi;
       if ДатаДок>=1.1.2014 or ДатаОпер>=1.1.2014:
          if Позиции[Iter].ОКДП="": Message("Заполните ОКПД",mtError); Template.Field="ОКДП "; Template.Frame=Iter; ^False; fi;
          if Length(Позиции[Iter].ОКДП)=7: Message("Введите код ОКПД, а не код ОКДП",mtError); Template.Field="ОКДП "; Template.Frame=Iter; ^False; fi;
         else
          if Позиции[Iter].ОКДП_Гр="": Message("Заполните номенклатурную группу",mtError); Template.Field="ОКДП_Гр"; Template.Frame=Iter; ^False; fi;
          if Позиции[Iter].ОКДП="": Message("Заполните ОКДП",mtError); Template.Field="ОКДП"; Template.Frame=Iter; ^False; fi;
          if Length(Позиции[Iter].ОКДП)=12: Message("Введите код ОКДП, а не код ОКПД",mtError); Template.Field="ОКДП "; Template.Frame=Iter; ^False; fi;
       fi;
       if Round(Позиции[Iter].Цена,2)=0: Message("Заполните цену",mtError); Template.Field="Цена"; Template.Frame=Iter; ^False; fi;
       if Round(Позиции[Iter].Кол,4)=0: Message("Заполните количество",mtError); Template.Field="Кол"; Template.Frame=Iter; ^False; fi;
       if Позиции[Iter].ЕдИзм="": Message("Заполните единицу измерения",mtError); Template.Field="ЕдИзм"; Template.Frame=Iter; ^False; fi;
       if Позиции[Iter].Контр=nil: Message("Заполните контрагента",mtError); Template.Field="Контр_"; Template.Frame=Iter; ^False; fi;
       if not Round(Позиции[Iter].Цена*Позиции[Iter].Кол,2)=Round(Позиции[Iter].Учт_Руб,2): Message("Произведение Цена x Количестов ("+Str(Позиции[Iter].Цена*Позиции[Iter].Кол,2)+") не равно указанной сумме "+Str(Позиции[Iter].Учт_Руб),mtError); Template.Field="Учт_Руб"; Template.Frame=Iter; ^False; fi;
       if not Позиции[Iter].Призн="":
          Mask=Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","К.*","|");
          if not Mask="":
             tmp=CardFileRecSign("КОНТРАГЕНТ","ПРИЗНАК","К",Позиции[Iter].Контр);
             if not tmp=Mask: Message("Признак контрагента по реестру закупок '"+tmp+"' отличается от указанного в аналитических признаках '"+Mask+"'",mtError); Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
          fi;
       fi;
    fi;
  fi;
  if Позиции[Iter].Учт_Руб=0: Message("Введите сумму",mtError); Template.Field="Учт_Руб"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].СчДеб="": Message("Введите счет дебета",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
  if Позиции[Iter].СчКре="": Message("Введите счет кредита",mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
  if Name_S(Позиции[Iter].СчДеб)=" ": Message("Неизвестный счет дебета '"+Позиции[Iter].СчДеб+"'",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
  if Name_S(Позиции[Iter].СчКре)=" ": Message("Неизвестный счет кредита '"+Позиции[Iter].СчКре+"'",mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
  if Correspond(Позиции[Iter].СчДеб,Позиции[Iter].СчКре)=False: Message("Счета '"+Позиции[Iter].СчДеб+"/"+Позиции[Iter].СчКре+"' не могут корреспондировать",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
  if not НеПровДО:
     if Name_S(СчДеб_ДО[Iter])=" ": Message("Неизвестный счет дебета (денежное обязательство)'"+СчДеб_ДО[Iter]+"'",mtError); Template.Field="СчДеб_ДО"; Template.Frame=Iter; ^False; fi;
     if Name_S(СчКре_ДО[Iter])=" ": Message("Неизвестный счет кредита (денежное обязательство)'"+СчКре_ДО[Iter]+"'",mtError); Template.Field="СчКре_ДО"; Template.Frame=Iter; ^False; fi;
     if Correspond(СчДеб_ДО[Iter],СчКре_ДО[Iter])=False: Message("Счета '"+СчДеб_ДО[Iter]+"/"+СчКре_ДО[Iter]+"' не могут корреспондировать",mtError); Template.Field="СчДеб_ДО"; Template.Frame=Iter; ^False; fi;
  fi;
  if Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  if Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  if not НеПровДО:
     if Раб.Бюджет.ПроверитьПризнакиОбязательные(СчДеб_ДО[Iter],СчКре_ДО[Iter],Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
     if Раб.Бюджет.ПроверитьПризнакиСвязанные(СчДеб_ДО[Iter],СчКре_ДО[Iter],Позиции[Iter].Призн,ИсклПризн+if(ПризнПодр="","","|П.*"))=False : Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  fi;
  tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Позиции[Iter].Призн," ","КОСГУ.*","");
  if not tmp="":
     tmp2=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"","АН",False);
     tmp2=Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",tmp2);
     if not Match(tmp,"КОСГУ."+tmp2+"!"): Message("Аналитический признак "+tmp+" не соответствует КБК счета "+Позиции[Iter].СчКре,mtError); Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  fi;
  tmp=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Позиции[Iter].Призн," ","ФКР.*","");
  if not tmp="":
     tmp2=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"","БК",False);
     if not tmp="ФКР."+tmp2: Message("Аналитический признак "+tmp+" не соответствует КБК счета"+Позиции[Iter].СчКре,mtError); Template.Field="Призн_"; Template.Frame=Iter; ^False; fi;
  fi;
 od;
  --Проверям нужен ли признак подразделения
 for Iter=1..Позиции do
  Mask=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,"П.*");
  if Раб.Бюджет.ПроверитьПризнакиОбязательные(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,Позиции[Iter].Призн+" "+ПризнПодр,Mask)=False : Template.Field="НаимПодр"; ^False; fi;
  if Раб.Бюджет.ПроверитьПризнакиСвязанные(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,Позиции[Iter].Призн+" "+ПризнПодр,Mask)=False : Template.Field="НаимПодр"; ^False; fi;
 od;
 if ver<2:
    Template.Name="Секц14";
    for Iter=1..РЗ do
     if not РЗ[Iter].Предм="" or not Round(РЗ[Iter].Цена,2)=0 or not Round(РЗ[Iter].Кол,6)=0 or not РЗ[Iter].ЕдИзм="" or not Round(РЗ[Iter].СумСНДС,2)=0 or not РЗ[Iter].Контр=nil:
        if РЗ[Iter].Предм="": Message("Заполните краткое наименование",mtError); Template.Field="Предм"; Template.Frame=Iter; ^False; fi;
        if Round(РЗ[Iter].Цена,2)=0: Message("Заполните цену",mtError); Template.Field="Цена"; Template.Frame=Iter; ^False; fi;
        if РЗ[Iter].Контр=nil: Message("Заполните контрагента",mtError); Template.Field="Контр_"; Template.Frame=Iter; ^False; fi;
     fi;
    od;
 fi;
 if not ПроверитьБО: ^False; fi;
 ^True;
end;

Proc Конвертация;
 if not Ф0504049 and CanUpdate(SelfCrd):
    ClearVariable(Сведения);
    InsertFrame(Сведения,1);
    Сведения[1].НомОрд=НомОрд;
    Сведения[1].ДатаОрд=ДатаОрд;
    if not Round(Ост_Руб,2)=0: Сведения[1].Внесен_Ост_Руб=Ост_Руб;
      |not Round(ПрРасх_Руб,2)=0: Сведения[1].Выдан_ПрРасх_Руб=ПрРасх_Руб;
    fi;
    Ф0504049=True;
    EditorApply;
 fi;
end;

Proc ПересчетСум(FieldName:S; Iter:I);
var Сум_:N;
 if FieldName="Цена" or FieldName="Кол": 
    Сум_=Round(Позиции[Iter].Цена*Позиции[Iter].Кол,2);
    Позиции[Iter].Отч_Руб=Сум_;
    Позиции[Iter].Учт_Руб=Сум_;
 fi;
end;

Proc ПересчетСумРЗ (FieldName:S; Iter:I);
var Сум_:N;
 if FieldName="Цена" or FieldName="Кол": 
    Сум_=Round(РЗ[Iter].Цена*РЗ[Iter].Кол,2);
    if РЗ[Iter].НДС>0: РЗ[Iter].СумСНДС=Сум_+Round(Сум_*РЗ[Iter].НДС/100,2); else РЗ[Iter].СумСНДС=Сум_; fi;
   |FieldName="СумСНДС" or FieldName="НДС":
    if РЗ[Iter].НДС>0:
       Сум_=РЗ[Iter].СумСНДС-Round(РЗ[Iter].СумСНДС*РЗ[Iter].НДС/(100+РЗ[Iter].НДС),2);
       РЗ[Iter].Цена=Round(Сум_/РЗ[Iter].Кол,2);
      else
       РЗ[Iter].Цена=Round(РЗ[Iter].СумСНДС/РЗ[Iter].Кол,2);
    fi;
 fi;
end;

Func ЗаполнитьИзОтчета(Iter:I):L;
var n,nn,z,zz,i,ii,w,ww,y:i;
var tmp,Сч_:S;
var fsub:L;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 ClearVariable(BufSum);
 Раб.Свертка.РазрешитьПрогресс=False;
 Раб.Свертка.ВыполнитьОбновление=True;
 Раб.Свертка.РазрешитьАналитику=True;
 Раб.Свертка.РазрешитьСинтетику=True;
 Раб.Свертка.ДН=1.1.1900;
 Раб.Свертка.ДК=if(ДатаОпер=1.1.100,ДатаДок+1,ДатаОпер+1);
 Раб.Свертка.УслСч="*.?.208.??.*";
 Раб.Свертка.УслАн=Раб.Бюджет2005.Объединить(ПризнМОЛ,ПризнАванс,"&");
 Раб.Свертка.Расщепление=TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna;
 Раб.Свертка.МаскаСправ=Раб.Бюджет2005.СписокСправ("*.?.208.??.*",0,ИсклПризн);
 Раб.Свертка.ПолнСоотвМаскеСправ=False;
 Раб.Свертка.spМаскаСправ="|";
 Раб.Свертка.СжатиеСправ=ИсклПризн;
 Раб.Свертка.ПорядокПоМаскеСправ=False;
 Раб.Свертка.ТипСинтетики="КБК+СЧ6";
 nn=Раб.Свертка.Расчет;
 --Нормализиция по аналитике
 for n=1..nn do
  z=SearchInArray(Buf,Раб.Свертка.Список_Синт[n],True);
  if z=-1:
     z=InsertInArraySort(Buf,Раб.Свертка.Список_Синт[n]);
     ClearVariable(Buf3);
     ClearVariable(BufI);
     ii=0;
     i=n;
     While not i=-1 do
      ii=ii+1;
      ww=WordsCount(Раб.Свертка.Список_Ан[i]," ");
      for w=1..ww do
       tmp=ExtractWord(w,Раб.Свертка.Список_Ан[i]," ");
       tmp=ExtractWord(1,tmp,".")+".*";
       y=SearchInArray(Buf3,tmp,True);
       if y=-1:
          y=InsertInArraySort(Buf3,tmp);
          InsertInArray(BufI,y,1);
         else
          BufI[y]=BufI[y]+1;
       fi;
      od;
      i=SearchInArray(Раб.Свертка.Список_Синт,Buf[z],True,i+1);
     od;
     tmp="";
     ww=LengthOfArray(Buf3);
     for w=1..ww do
      if ii=BufI[w]:
         tmp=tmp+" "+Buf3[w];
      fi;
     od;
     InsertInArray(Buf2,z,Trim(tmp));
  fi;
 od;
 --Дополнительная досвертка
 ClearVariable(Buf3);
 for n=1..nn do
  if Round(Раб.Свертка.Сум1[n],2)<>0:
     z=SearchInArray(Buf,Раб.Свертка.Список_Синт[n],True);
     tmp=Раб.Бюджет2005.ПривестиВСоотвНаборСлов(Раб.Свертка.Список_Ан[n]," ",Buf2[z]," ");
     z=SearchInArray(Buf3,Раб.Свертка.Список_Синт[n]+"#"+tmp,True);
     if z=-1:
        z=InsertInArraySort(Buf3,Раб.Свертка.Список_Синт[n]+"#"+tmp);
        InsertInArray(BufSum,z,Раб.Свертка.Сум1[n]);
       else
        BufSum[z]=BufSum[z]+Раб.Свертка.Сум1[n];
     fi;
  fi;
 od;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 nn=LengthOfArray(Buf3);
 for n=1..nn do
  if Round(BufSum[n],2)<>0:
     z=InsertInArraySort(Buf2,Buf3[n]);
     InsertInArray(Buf,z,ExtractWord(1,Buf3[n],"#")+".560"+" {"+ExtractWord(2,Buf3[n],"#")+"} = "+Format("%.2N",BufSum[n]));
  fi;
 od;
 zz=LengthOfArray(Buf);
 if zz=0:
    Message("Остатка выданного аванса за выбранным подотчетном лицом "+Name_A(ПризнМОЛ)+" ("+ПризнМОЛ+"), по состоянию на "+DateToString(if(ДатаОпер=1.1.100,ДатаДок+1,ДатаОпер+1))+", не числится^MВызовите отчет для уточнения",mtWarning);
    Template.Object="btnОтчетСчета";
    ExecuteProc("btnОтчет_OnClick","btnОтчетСчета");
    ^False;
   else
    if zz>1:
       z=1; Сч_="";
       While z<=zz do
        tmp=Раб.Бюджет2005.ВзятьКодСчета(Trim(ExtractWord(1,Buf[z],"{")),"","Сч5",True);
        if not Сч_=tmp:
           InsertInArray(Buf,z,"--"+Раб.Бюджет.НаимКБК("СЧ",tmp));
           Сч_=tmp;
           z=z+1;
           zz=zz+1;
        fi;
        z=z+1;
       od;
       InsertInArray(Buf,1,"Выбрать все");
       zz=zz+1;
    fi;
    fsub=False;
    z=Alternate("Остаток аванса на счетах по "+ПризнМОЛ+" ("+Name_A(ПризнМОЛ)+")",Buf,-1,1,12);
    if Pos("--",Buf[z])=1: z=z+1; fsub=true; fi; --выбрана подгруппа
    if not z=0:
       if Buf[z]="Выбрать все" or fsub:
          i=if(fsub,z,2);
          ii=zz;
          n=999;
         else
          i=z;
          ii=z;
          n=0;
       fi;
       for z=i..ii do
        if Pos("--",Buf[z])=1:
           if fsub: Break; fi; --выбрана подгруппа
          else
           if z>i and n=999 or Позиции=0: Iter=InsertFrame(Позиции,Iter+1); fi;
           Позиции[Iter].СчКре=Раб.Бюджет2005.ВзятьКодСчета(Trim(ExtractWord(1,Buf[z],"{")),"","АН",True)+".660";
           if not Correspond(Позиции[Iter].СчДеб,Позиции[Iter].СчКре):
              Позиции[Iter].СчДеб="";
              Позиции[Iter].Призн=Раб.Бюджет2005.ПривестиВСоотвНаборСлов(Позиции[Iter].Призн," ",Раб.Бюджет2005.СписокСправ(Позиции[Iter].СчКре,0,ИсклПризн),"|");
           fi;
           tmp=ExtractWord(2,Buf[z],"{");
           if Substr(tmp,1,1)="}":
              tmp="";
           else
              tmp=ExtractWord(1,tmp,"}");
           fi;
           Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ",Раб.Бюджет2005.ПризнВСправ(tmp," ",".*")," ");
           Позиции[Iter].Призн=Раб.Бюджет2005.Объединить(Позиции[Iter].Призн,tmp," ");
           if not Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","П.*","")="": ПризнПодр=""; НаимПодр=""; fi;
           if Round(Позиции[Iter].Отч_Руб,2)=0 and Round(Позиции[Iter].Учт_Руб,2)=0:
              Позиции[Iter].Отч_Руб=Round(ExtractWord(2,Buf[z],"="),2);
              Позиции[Iter].Учт_Руб=Round(ExtractWord(2,Buf[z],"="),2);
           fi;
           if Позиции[Iter].СчДеб="":
              tmp=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"","АН",False);
              tmp=Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",tmp);
              if not (tmp="310" or tmp="320"  or tmp="330" or tmp="340" or tmp="520" or tmp="530"):
                 Позиции[Iter].СчДеб=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"","ВД",True)+".401.20."+tmp;
                 if not Correspond(Позиции[Iter].СчДеб,Позиции[Iter].СчКре): Позиции[Iter].СчДеб=""; fi;
              fi;
           fi;
        fi;
       od;
    fi;
 fi;
 ^True;
end;

Func КонвОКДП_Гр(flГр:S):S;
var Iter:I;
var tmp:S;
var Flag:L;
 Flag=False;
 for Iter=1..Позиции do
  tmp=Раб.Договор.ВзятьЗначОКДП(Позиции[Iter].ОКДП,flГр);
  if not Позиции[Iter].ОКДП_Гр=tmp: Позиции[Iter].ОКДП_Гр=tmp; Flag=True; fi;
  Позиции[Iter].ОКДП_Призн="";
 od;
 tmp="";
 if Flag: tmp="Внимание! Значения номенклатурных групп ОКДП приведены в соотвествие с прик. МЭР РФ от "+if(flГр="ГР273","07.06.2011 г. N 273","01.12.2010 г. N 601"); fi;
 ^tmp;
end;

Func ОбновВерсиюОКДП_Гр(fMsg:L):S;
var v:i;
var Msg:S;
 if ДатаДок>=1.1.2014 or ДатаОпер>=1.1.2014: ^""; fi;
 if not ДатаДок=1.1.100:
    v=if(ДатаДок>8.8.2011,273,0);
    if not verОКДП_Гр=v:
       msg=КонвОКДП_Гр(if(v=273,"ГР273","ГР"));
       verОКДП_Гр=v;
    fi;
    if not msg="" and fMsg: Message(msg,mtWarning); fi;
 fi;
 ^msg;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Proc Коды_OnExit(FieldName: String; Iter: Integer);
end;

Func ФИО_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Field,v1,v2:S;
var Rec:Record;
 Field=AsString(Template.Field);
 Template.HideEditor(False);
 Rec=OpenCardFile("Сотрудники");
 if Rec=nil: ^Cur; fi;
 v1=GetCardFieldS("Сотрудники",rec,"ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники",rec,"ИНИЦИАЛЫ");
 v2=GetCardFieldS("Сотрудники",rec,"ДОЛЖНОСТЬ.Долж");
 if Field="ФИОРук": ФИОРук=v1;
   |Field="ФИОРукПодр": ФИОРукПодр=v1;
   |Field="ФИОБух": ФИОБух=v1;
   |Field="Должн" or Field="ФИО": ФИО=v1; Должн=v2;
   |Field="ФИОБух2": ФИОБух2=v1;
 fi;
 ^Cur;
end;

Proc НомерБум_onExit(FieldName: String; Iter: Integer);
var tmp:i;
 tmp=Int(НомерБум);
 if tmp=0: tmp=РАБ.ОБЛ.СледСУчетомГодаФ(SelfCrd,"Номер","ДатаДок","UKey<>"+RecordToString(Current)); fi;
 if Номер<>tmp: 
    Номер=tmp;
    if Раб.Бюджет2005.Сетевая: EditorApply; fi;
 fi;
end;

Func НомерБум_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 ^Str(Раб.Обл.СледСУчетомГодаФ(SelfCrd,"Номер","ДатаДок","UKey<>"+RecordToString(Current)));
end;

Proc ДатаДок_OnExit(FieldName: String; Iter: Integer);
 Оформление;
 ОбновВерсиюОКДП_Гр(True);
end;

Func Дата_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:d;
var Field:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 PutVariableD(Field,tmp);
 if Field="ДатаДок": ДатаДок_OnExit(Field,1); fi;
 ^Cur;
end;

Func ПризнАванс_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp,crd:S;
var Rec:Record;
 crd="РПО_ЗАЯВЛ_АВАНС";
 if FieldName="ПризнАванс":
    tmp=AnaElection("АВ.*",False,False,hПризнАванс);
    if tmp="": ^False; fi;
    ПризнАванс=tmp;
    if SignCardFile(ПризнАванс)=crd:
       Rec=SignToRecord(ПризнАванс);
    fi;
   else
    Rec=OpenCardFile(crd,"");
    if Rec=nil: ^False; fi;
    ПризнАванс=CardFileRecSign(crd,"Признак","АВ",Rec);
 fi;
 hПризнАванс=ПризнАванс;
 if not Rec=nil:
    Рекв=GetCardFieldR(crd,Rec,"Рекв");
    ПризнПодр=GetCardFieldS(crd,Rec,"ПризнПодр");
    НаимПодр=Name_A(ПризнПодр);
    if НаимПодр="" or НаимПодр=" ":
       НаимПодр=ПризнПодр;
    fi;
    ПризнМОЛ=GetCardFieldS(crd,Rec,"ПризнМОЛ");
    ФИОМОЛ=GetCardFieldS(crd,Rec,"ФИОМОЛ");
    ТабНом=GetCardFieldS(crd,Rec,"ТабНом");
    ДолжнМОЛ=GetCardFieldS(crd,Rec,"ДолжнМОЛ");
    НазначАванас=GetCardFieldS(crd,Rec,"НазначАванс");
    Валюта=GetCardFieldS(crd,Rec,"Валюта");
    ExecuteProc("btnРасчет_OnClick","");
    if not ПризнПодр="":
       for Iter=1..Позиции do
        Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","П.*","");
       od;
    fi;
 fi;
 Return False;
end;

Proc ПризнАванс_OnExit(FieldName: String; Iter: Integer);
 ПризнАванс="";
end;

Func РеквКорИмя_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
 Rec=OpenCardFile("Контрагент","Наше",Рекв,crdRecordOnly);
 if rec=nil: ^False; fi;
 Рекв=Rec;
 ФИОРук=Рекв.ФИОРук;
 ФИОБух=Рекв.ФИОБух;
 ^False;
end;

Func НаимПодр_onEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("П.*");
 if tmp="": ^False; fi;
 ПризнПодр=tmp;
 НаимПодр=Name_A(ПризнПодр);
 if НаимПодр="" or НаимПодр=" ": 
    НаимПодр=ПризнПодр;
 fi;
 for Iter=1..Позиции do
  Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Позиции[Iter].Призн," ","П.*","");
 od;
 ^False;
end;

Proc НаимПодр_OnExit(FieldName: String; Iter: Integer);
 ПризнПодр=НаимПодр;
end;

Proc ЗаполнитьМол(ЗапПодраз:L);
var Rec: Record;

 ФИОМОЛ=Name_A(ПризнМОЛ);
 if ФИОМОЛ="" or ФИОМОЛ=" ": ФИОМОЛ=ПризнМОЛ; fi;
 Rec=SignToRecord(ПризнМОЛ);
 if Rec<>nil:
    ДолжнМОЛ=GetCardFieldS("Сотрудники",rec,"ДОЛЖНОСТЬ.Долж");
    ФИОРукПодр=GetCardFieldS("Сотрудники",rec,"ПОДРАЗДЕЛЕНИЕ.ОТВ.ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники",rec,"ПОДРАЗДЕЛЕНИЕ.ОТВ.ИНИЦИАЛЫ");
    if ПризнПодр="" and ЗапПодраз:
       Rec=GetCardFieldR("Сотрудники",rec,"ПОДРАЗДЕЛЕНИЕ");
       if Rec<>nil: 
          ПризнПодр=CardFileRecSign("ПОДРАЗДЕЛЕНИЯ","КОД","П",Rec);
          НаимПодр=Name_A(ПризнПодр);
          if НаимПодр="" or НаимПодр=" ": НаимПодр=ПризнПодр; fi;
       fi;
    fi;
 fi;
end;


Func ФИОМОЛ_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Iter=-1:
    ПризнМОЛ=FieldName;
   else
    tmp=AnaElection("МОЛ.*",False,False,ПризнМОЛ);
    if tmp="": ^False; fi;
    ПризнМОЛ=tmp;
 fi;
 ЗаполнитьМол(true);
 if EnqOkCancel("Заполнить таблицу на основе данных об остатке аванса ?")=cmOk:
    if Позиции=0 or not Позиции[1].СчКре="": Iter=InsertFrame(Позиции,1); else Iter=1; fi;
    if ЗаполнитьИзОтчета(Iter):
       Template.Field="СчКре";
       Template.Frame=Позиции;
    fi;
 fi;
 ^False;
end;

Func ФИОМОЛ_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Mask,tmp:S;
var n:I;
 Template.HideEditor(False);
 if Input(Mask,"Поиск. Введите фамилию или код признака...")=cmOk:
    if Mask="" or Mask="*":
       ФИОМОЛ_OnEnter("ФИОМОЛ",1);
      else
       ClearVariable(Buf);
       Mask="*"+Mask+"*";
       for Sign tmp="МОЛ.*", sort do
        if Match(Name_A(tmp),Mask) or Match(tmp,Mask):
           AddInArray(Buf,True,False,tmp+"  --"+Name_A(tmp));
        fi;
       od;
       if LengthOfArray(Buf)=0:
          Message("Не найдено ни одно вхождение по критерию поиска: "+Mask);
         else
          n=Alternate("Выберите подотчетное лицо",Buf,-1,1,12);
          if not n=0:
             ФИОМОЛ_OnEnter(Trim(ExtractWord(1,Buf[n],"--")),-1);
          fi;
       fi;
    fi;
 fi;
 Return Cur;
end;


Func Валюта_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
var Cur:S;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 n=0;
 for Currencies Cur="*&~"+BaseCurrency do
  n=n+1;
  Buf[n]=Up(Cur);
  Buf2[n]=Buf[n]+" --"+Name_C(Cur);
 od;
 if n=0: Message("Список валют пуст",mtWarning); ^False; fi;
 n=Alternate("Валюта",Buf2,-1,SearchInArray(Buf,Валюта),12);
 if n=0: ^False; fi;
 Валюта=Buf[n];
 Return False;
end;

Proc Валюта_OnExit(FieldName: String; Iter: Integer);
 Валюта=BaseCurrency;
end;

Func СумВал_onEnter(FieldName: String; Iter: Integer): logical;
 if Валюта=BaseCurrency or Валюта="":
    Message("Укажите валюту",mtError);
    Template.Field="Валюта_";
    ^False;
   else
    ^True;
 fi;
end;

Func РасчетВОВП_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 if Проводить: ^False; fi;
 if EnqOkCancel("Значения остатка (перерасхода) будет рассчитано заново, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 РасчетОст;
 РасчетБухИтогов;
 СумОрд=Max(Ост_Руб,ПрРасх_Руб);
 if Остаток=0 and ПереРасход=0: 
    Message("Остаток (перерасход) не найден",mtError);
    Template.Name="Секц10";
    Template.Field="Учт_Руб";
    Template.Frame=1;
 fi;
 ClearVariable(Сведения);
 for n=1..Остаток do
  if not Остаток[n].Учт_Руб=0:
     Iter=InsertFrame(Сведения,Сведения+1);
     Сведения[Iter].Сч=Раб.Бюджет2005.ВзятьКодСчета(Остаток[n].СчДеб,"","АН",True)+".660";
     Сведения[Iter].Внесен_Ост_Руб=Остаток[n].Учт_Руб;
     Сведения[Iter].Внесен_Ост_Вал=Остаток[n].Учт_Вал;
  fi;
 od;
 for n=1..ПереРасход do
  if not ПереРасход[n].Учт_Руб=0:
     Iter=InsertFrame(Сведения,Сведения+1);
     Сведения[Iter].Сч=Раб.Бюджет2005.ВзятьКодСчета(ПереРасход[n].СчКре,"","АН",True)+".560";
     Сведения[Iter].Выдан_ПрРасх_Руб=ПереРасход[n].Учт_Руб;
     Сведения[Iter].Выдан_ПрРасх_Вал=ПереРасход[n].Учт_Вал;
  fi;
 od;
 Return False;
end;

Func СоздатьКО_OnEnter(FieldName: String; Iter: Integer): logical;
var OWA,OA,n,nn,z,zz,i,ii,w,ww,y:i;
var Сч_,Ан_,Тип,Гл,Бюдж,Ист,tmp,S1,S2,Цель_:S;
var Rec,ПКО,РКО:Record;
var Flag:L;
 --if Проводить: ^False; fi;
 Refresh;
 ClearVariable(Buf);
 ClearVariable(Buf2);
 ClearVariable(Buf3);
 ClearVariable(BufN);
 Раб.Свертка.РазрешитьПрогресс=False;
 Раб.Свертка.ВыполнитьОбновление=False;
 Раб.Свертка.РазрешитьАналитику=True;
 Раб.Свертка.РазрешитьСинтетику=True;
 Раб.Свертка.ДН=1.1.1900;
 Раб.Свертка.ДК=if(ПризнАванс="",if(ДатаОпер=1.1.100,ДатаДок+1,ДатаОпер+1),ToDay+1);
 Раб.Свертка.УслСч="*.?.208.??.*";
 Раб.Свертка.УслАн=Раб.Бюджет2005.Объединить(ПризнМОЛ,ПризнАванс,"&");
 Раб.Свертка.Расщепление=TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna;
 Раб.Свертка.МаскаСправ=Раб.Бюджет2005.СписокСправ("*.?.208.??.*",0,ИсклПризн);
 Раб.Свертка.ПолнСоотвМаскеСправ=False;
 Раб.Свертка.spМаскаСправ="|";
 Раб.Свертка.СжатиеСправ=ИсклПризн;
 Раб.Свертка.ПорядокПоМаскеСправ=False;
 Раб.Свертка.ТипСинтетики="КБК+СЧ6";
 nn=Раб.Свертка.Расчет;
 --Микшируем с позициями
 if not Проводить:
    for n=1..Позиции do
     Сч_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[n].СчКре,"","АН",True);
     Ан_=Раб.Бюджет2005.СортироватьНаборСлов(Позиции[n].Призн," ",True);
     z=SearchInArray(Раб.Свертка.Ключ,Сч_+" "+Ан_,True);
     if z=-1:
        z=InsertInArraySort(Раб.Свертка.Ключ,Сч_+" "+Ан_);
        InsertInArray(Раб.Свертка.Список_Ан,z,Ан_);
        InsertInArray(Раб.Свертка.Список_Синт,z,Сч_);
        InsertInArray(Раб.Свертка.Сум1,z,-Позиции[n].Учт_Руб);
        InsertInArray(Раб.Свертка.Сум2,z,-Позиции[n].Учт_Вал);
       else
        Раб.Свертка.Сум1[z]=Раб.Свертка.Сум1[z]+(-Позиции[n].Учт_Руб);
        Раб.Свертка.Сум2[z]=Раб.Свертка.Сум2[z]+(-Позиции[n].Учт_Вал);
     fi;
    od;
 fi;
 nn=LengthOfArray(Раб.Свертка.Ключ);
 --Нормализиция по аналитике
 for n=1..nn do
  z=SearchInArray(Buf,Раб.Свертка.Список_Синт[n],True);
  if z=-1:
     z=InsertInArraySort(Buf,Раб.Свертка.Список_Синт[n]);
     ClearVariable(Buf3);
     ClearVariable(BufI);
     ii=0;
     i=n;
     While not i=-1 do
      ii=ii+1;
      ww=WordsCount(Раб.Свертка.Список_Ан[i]," ");
      for w=1..ww do
       tmp=ExtractWord(w,Раб.Свертка.Список_Ан[i]," ");
       tmp=ExtractWord(1,tmp,".")+".*";
       y=SearchInArray(Buf3,tmp,True);
       if y=-1:
          y=InsertInArraySort(Buf3,tmp);
          InsertInArray(BufI,y,1);
         else
          BufI[y]=BufI[y]+1;
       fi;
      od;
      i=SearchInArray(Раб.Свертка.Список_Синт,Buf[z],True,i+1);
     od;
     tmp="";
     ww=LengthOfArray(Buf3);
     for w=1..ww do
      if ii=BufI[w]:
         tmp=tmp+" "+Buf3[w];
      fi;
     od;
     InsertInArray(Buf2,z,Trim(tmp));
  fi;
 od;
 --Дополнительная досвертка
 ClearVariable(Buf3);
 for n=1..nn do
  if Round(Раб.Свертка.Сум1[n],2)<>0:
     z=SearchInArray(Buf,Раб.Свертка.Список_Синт[n],True);
     tmp=Раб.Бюджет2005.ПривестиВСоотвНаборСлов(Раб.Свертка.Список_Ан[n]," ",Buf2[z]," ");
     z=SearchInArray(Buf3,Раб.Свертка.Список_Синт[n]+"#"+tmp,True);
     if z=-1:
        z=InsertInArraySort(Buf3,Раб.Свертка.Список_Синт[n]+"#"+tmp);
        InsertInArray(BufN,z,Раб.Свертка.Сум1[n]);
       else
        BufN[z]=BufN[z]+Раб.Свертка.Сум1[n];
     fi;
  fi;
 od;
 --
 ClearVariable(Buf);
 ClearVariable(Buf2);
 ClearVariable(BufSum);
 ClearVariable(BufSum2);
 nn=LengthOfArray(Buf3);
 ww=0;
 ii=0;
 for n=1..nn do
  if Round(BufN[n],2)<0:
     ww=ww+1;
     Buf[ww]=Buf3[n];
     BufSum[ww]=BufSum[ww]-BufN[n];
    |Round(BufN[n],2)>0:
     ii=ii+1;
     Buf2[ii]=Buf3[n];
     BufSum2[ii]=BufSum2[ii]+BufN[n];
  fi;
 od;
 if ww=0 and ii=0:
    Message("Остатка / перерасхода не обнаружено");
    ^False;
 fi;
 for n=1..Сведения do
  Сведения[n].НомОрд="";
  Сведения[n].ДатаОрд=1.1.100;
 od;
 --ПКО
 if not ii=0:
    Сч_=ExtractWord(1,Buf2[1],"#");
    Ан_=ExtractWord(2,Buf2[1],"#");
    Номер=Раб.Обл.СледСУчетомГода("ПРИХОРД","Номер","Д");
    OWA=OpenWorkArea("ПРИХОРД","","1=0");
    Try
     BeginChanging(OWA,False);
     Try
      n=InsertRecord(OWA);
      n=PutFieldI(OWA,n,"Номер",Номер);
      n=PutFieldS(OWA,n,"НомерБум",Str(Номер));
      n=PutFieldD(OWA,n,"Д",ToDay);
      n=PutFieldS(OWA,n,"ПО",ПризнПодр);
      n=PutFieldN(OWA,n,"Сумма",if(Валюта=BaseCurrency,SumOfArray(BufSum2,ii),SumOfArray(BufSum2,ii)));
      n=PutFieldS(OWA,n,"Валюта",Валюта);
      Тип=Раб.Бюджет2005.ТипКБКСчета(Сч_);
      Ист=Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"Ист",False);
      Гл=Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"ППП",False);
      Бюдж="01";
      n=PutFieldS(OWA,n,"Де",Гл+".01.05.02.01."+Бюдж+".0000."+Ист+".201.34.510");
      n=PutFieldS(OWA,n,"Счет",Сч_+".660");
      n=PutFieldS(OWA,n,"Осн","Внесение остатка по авансовому отчету №"+НомерБум+" от "+DateTOString(ДатаДок));
      n=PutFieldR(OWA,n,"Рекв",Рекв);
      n=PutFieldS(OWA,n,"РПО_ФиоБух",ФиоБух);
      n=PutFieldS(OWA,n,"РПО_ФиоКасс",Рекв.ФиоКасс);
      Rec=SignToRecord(ПризнМол);
      if Rec=nil:
         n=PutFieldS(OWA,n,"ФИО",ФИОМОЛ);
        else
         s1=GetCardFieldS("Сотрудники",Rec,"ФОТКОГО");
         s2=GetCardFieldS("Сотрудники",Rec,"ИОТКОГО");
         if s1="" or s2="":
            n=PutFieldS(OWA,n,"ФИО",ФИОМОЛ);
           else
            n=PutFieldS(OWA,n,"ФИО",s1+" "+s2);
         fi;
      fi;
      if ii>1:
         OA=OpenArray(OWA,1,"РПО_Позиции","");
         n=PutFieldL(OWA,n,"РПО_PacketMode",True);
         for i=1..ii do
          Сч_=ExtractWord(1,Buf2[i],"#");
          Ан_=ExtractWord(2,Buf2[i],"#");
          z=InsertRecord(OA,i);
          Тип=Раб.Бюджет2005.ТипКБКСчета(Сч_);
          Ист=Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"Ист",False);
          Гл=Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"ППП",False);
          Бюдж="01";
          Ан_=Раб.Бюджет2005.Объединить(Ан_,ПризнАванс," ");
          Ан_=Раб.Бюджет2005.Объединить(Ан_,ПризнМол," ");
          z=PutFieldS(OA,z,"ТДСчет",Гл+".01.05.02.01."+Бюдж+".0000."+Ист+".201.34.510");
          z=PutFieldS(OA,z,"ТСчет",Сч_+".660");
          if not Match(Ан_,"*ФКР.*"): Ан_=Раб.Бюджет.ДобавитьПризнак(Ан_,"ФКР."+Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"КБК",False)); fi;
          if not Match(Ан_,"*КОСГУ.*"): Ан_=Раб.Бюджет.ДобавитьПризнак(Ан_,"КОСГУ."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"АН",False))); fi;
          Ан_=Раб.Бюджет.МухиОтКотлет(Ан_,Раб.Бюджет.НаборПризнаков(GetFieldS(OA,z,"ТСчет"),GetFieldS(OA,z,"ТДСчет"),""));
          z=PutFieldS(OA,z,"ТПризн",Ан_);
          z=PutFieldN(OA,z,"ТСумма",if(Валюта=BaseCurrency,BufSum2[i],BufSum2[i]));
          z=PutFieldS(OA,z,"ТПримеч","");
         od;
         zz=Records(OA);
         tmp=GetFieldS(OA,1,"ТСчет");
         Flag=True;
         ClearVariable(Buf3);
         for z=1..zz do
          AddInArray(Buf3,True,False,Раб.Бюджет2005.ВзятьКодСчета(GetFieldS(OA,z,"ТСчет"),Тип,"СЧ9",False));
          if not tmp=GetFieldS(OA,z,"ТСчет"): Flag=False; fi;
         od;
         if not Flag:
            tmp="";
            zz=LengthOfArray(Buf3);
            for z=1..zz do
             tmp=Раб.Бюджет2005.Объединить(tmp,Buf3[z],"; ");
            od;
            n=PutFieldS(OWA,n,"Счет",tmp);
         fi;
        else
         Ан_=Раб.Бюджет2005.Объединить(Ан_,ПризнАванс," ");
         Ан_=Раб.Бюджет2005.Объединить(Ан_,ПризнМол," ");
         if not Match(Ан_,"*ФКР.*"): Ан_=Раб.Бюджет.ДобавитьПризнак(Ан_,"ФКР."+Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"КБК",False)); fi;
         if not Match(Ан_,"*КОСГУ.*"): Ан_=Раб.Бюджет.ДобавитьПризнак(Ан_,"КОСГУ."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"АН",False))); fi;
         Ан_=Раб.Бюджет.МухиОтКотлет(Ан_,Раб.Бюджет.НаборПризнаков(GetFieldS(OWA,n,"Де"),GetFieldS(OWA,n,"Счет"),""));
         Цель_=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Ан_," ","ФКР.*|КОСГУ.*","|");
         Ан_=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Ан_," ","ФКР.*|КОСГУ.*","|");
         n=PutFieldS(OWA,n,"Призн",Ан_);
         n=PutFieldS(OWA,n,"Цель",Цель_);
      fi;
      ПКО=GetRecordKey(OWA,n);
      EndChanging(OWA);
     Except
      CancelChanging(OWA);
      Raise;
     end;
    Finally
     CloseWorkArea(OWA);
    end;
    Trace("ПКО №"+Str(Номер)+" от "+DateToString(ToDay)+" успешно сформирован");
    if not Проводить:
       for n=1..Сведения do
        if not Сведения[n].Внесен_Ост_Руб=0 or not Сведения[n].Внесен_Ост_Вал=0:
           for w=1..ww do
            Сч_=ExtractWord(1,Buf2[w],"#");
            if Сведения[n].Сч=Сч_+".660":
               Сведения[n].НомОрд=Str(Номер);
               Сведения[n].ДатаОрд=ToDay;
               Break;
            fi;
           od;
        fi;
       od;
    fi;
 fi;
 --РКО
 if not ww=0:
    Сч_=ExtractWord(1,Buf[1],"#");
    Ан_=ExtractWord(2,Buf[1],"#");
    Номер=Раб.Обл.СледСУчетомГода("РАСХОРД","Номер","Д");
    OWA=OpenWorkArea("РАСХОРД","","1=0");
    Try
     BeginChanging(OWA,False);
     Try
      n=InsertRecord(OWA);
      n=PutFieldI(OWA,n,"Номер",Номер);
      n=PutFieldS(OWA,n,"НомерБум",Str(Номер));
      n=PutFieldD(OWA,n,"Д",ToDay);
      n=PutFieldS(OWA,n,"ПО",ПризнПодр);
      n=PutFieldN(OWA,n,"Сумма",if(Валюта=BaseCurrency,SumOfArray(BufSum,ww),SumOfArray(BufSum,ww)));
      n=PutFieldS(OWA,n,"Валюта",Валюта);
      Тип=Раб.Бюджет2005.ТипКБКСчета(Сч_);
      Ист=Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"Ист",False);
      Гл=Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"ППП",False);
      Бюдж="01";
      n=PutFieldS(OWA,n,"Кр",Гл+".01.05.02.01."+Бюдж+".0000."+Ист+".201.34.610");
      n=PutFieldS(OWA,n,"Счет",Сч_+".560");
      n=PutFieldS(OWA,n,"Осн","Выдача перерасхода по авансовому отчету №"+НомерБум+" от "+DateTOString(ДатаДок));
      n=PutFieldR(OWA,n,"Рекв",Рекв);
      n=PutFieldS(OWA,n,"РПО_ДолжнРук","");
      n=PutFieldS(OWA,n,"РПО_ФиоРук",ФиоРук);
      n=PutFieldS(OWA,n,"РПО_ДолжнБух","");
      n=PutFieldS(OWA,n,"РПО_ФиоБух",ФиоБух);
      n=PutFieldS(OWA,n,"РПО_ФиоКасс",Рекв.ФиоКасс);
      Rec=SignToRecord(ПризнМол);
      if Rec=nil:
         n=PutFieldS(OWA,n,"ФИО",ФИОМОЛ);
        else
         s1=GetCardFieldS("Сотрудники",Rec,"ФКОМУ");
         s2=GetCardFieldS("Сотрудники",Rec,"ИОКОМУ");
         if s1="" or s2="":
            n=PutFieldS(OWA,n,"ФИО",ФИОМОЛ);
           else
            n=PutFieldS(OWA,n,"ФИО",s1+" "+s2);
            n=PutFieldS(OWA,n,"Паспорт",GetCardFieldS("Сотрудники",Rec,"Паспорт"));
         fi;
      fi;
      if ww>1:
         OA=OpenArray(OWA,1,"РПО_Позиции","");
         n=PutFieldL(OWA,n,"РПО_PacketMode",True);
         for w=1..ww do
          Сч_=ExtractWord(1,Buf[w],"#");
          Ан_=ExtractWord(2,Buf[w],"#");
          z=InsertRecord(OA,w);
          Тип=Раб.Бюджет2005.ТипКБКСчета(Сч_);
          Ист=Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"Ист",False);
          Гл=Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"ППП",False);
          Бюдж="01";
          Ан_=Раб.Бюджет2005.Объединить(Ан_,ПризнАванс," ");
          Ан_=Раб.Бюджет2005.Объединить(Ан_,ПризнМол," ");
          z=PutFieldS(OA,z,"ТКСчет",Гл+".01.05.02.01."+Бюдж+".0000."+Ист+".201.34.610");
          z=PutFieldS(OA,z,"ТСчет",Сч_+".560");
          if not Match(Ан_,"*ФКР.*"): Ан_=Раб.Бюджет.ДобавитьПризнак(Ан_,"ФКР."+Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"КБК",False)); fi;
          if not Match(Ан_,"*КОСГУ.*"): Ан_=Раб.Бюджет.ДобавитьПризнак(Ан_,"КОСГУ."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"АН",False))); fi;
          Ан_=Раб.Бюджет.МухиОтКотлет(Ан_,Раб.Бюджет.НаборПризнаков(GetFieldS(OA,z,"ТСчет"),GetFieldS(OA,z,"ТКСчет"),""));
          z=PutFieldS(OA,z,"ТПризн",Ан_);
          z=PutFieldN(OA,z,"ТСумма",if(Валюта=BaseCurrency,BufSum[w],BufSum[w]));
          z=PutFieldS(OA,z,"ТПримеч","");
         od;
         zz=Records(OA);
         tmp=GetFieldS(OA,1,"ТСчет");
         Flag=True;
         ClearVariable(Buf3);
         for z=1..zz do
          AddInArray(Buf3,True,False,Раб.Бюджет2005.ВзятьКодСчета(GetFieldS(OA,z,"ТСчет"),Тип,"СЧ9",False));
          if not tmp=GetFieldS(OA,z,"ТСчет"): Flag=False; fi;
         od;
         if not Flag:
            tmp="";
            zz=LengthOfArray(Buf3);
            for z=1..zz do
             tmp=Раб.Бюджет2005.Объединить(tmp,Buf3[z],"; ");
            od;
            n=PutFieldS(OWA,n,"Счет",tmp);
         fi;
        else
         Ан_=Раб.Бюджет2005.Объединить(Ан_,ПризнАванс," ");
         Ан_=Раб.Бюджет2005.Объединить(Ан_,ПризнМол," ");
         if not Match(Ан_,"*ФКР.*"): Ан_=Раб.Бюджет.ДобавитьПризнак(Ан_,"ФКР."+Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"КБК",False)); fi;
         if not Match(Ан_,"*КОСГУ.*"): Ан_=Раб.Бюджет.ДобавитьПризнак(Ан_,"КОСГУ."+Раб.Бюджет2005.Соотв_Ан_КОСГУ("208",Раб.Бюджет2005.ВзятьКодСчета(Сч_,Тип,"АН",False))); fi;
         Ан_=Раб.Бюджет.МухиОтКотлет(Ан_,Раб.Бюджет.НаборПризнаков(GetFieldS(OWA,n,"Счет"),GetFieldS(OWA,n,"Кр"),""));
         Цель_=Раб.Бюджет2005.ВзятьСловаИзНабораПоМаске(Ан_," ","ФКР.*|КОСГУ.*","|");
         Ан_=Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Ан_," ","ФКР.*|КОСГУ.*","|");
         n=PutFieldS(OWA,n,"Призн",Ан_);
         n=PutFieldS(OWA,n,"Цель",Цель_);
      fi;
      РКО=GetRecordKey(OWA,n);
      EndChanging(OWA);
     Except
      CancelChanging(OWA);
      Raise;
     end;
    Finally
     CloseWorkArea(OWA);
    end;
    Trace("РКО №"+Str(Номер)+" от "+DateToString(ToDay)+" успешно сформирован");
    if not Проводить:
       for n=1..Сведения do
        if not Сведения[n].Выдан_ПрРасх_Руб=0 or not Сведения[n].Выдан_ПрРасх_Вал=0:
           for w=1..ww do
            Сч_=ExtractWord(1,Buf[w],"#");
            if Сведения[n].Сч=Сч_+".560":
               Сведения[n].НомОрд=Str(Номер);
               Сведения[n].ДатаОрд=ToDay;
               Break;
            fi;
           od;
        fi;
       od;
    fi;
 fi;
 if not Проводить:
    for n=1..Сведения do
     if not Сведения[n].Внесен_Ост_Руб=0 or not Сведения[n].Внесен_Ост_Вал=0 or not Сведения[n].Выдан_ПрРасх_Руб=0 or not Сведения[n].Выдан_ПрРасх_Вал=0:
        if Сведения[n].НомОрд="":
           Message("Что-то пошло не так",mtWarning);
           Break;
        fi;
     fi;
    od;
 fi;
 if not ПКО=nil:
    OpenBlank("ДОКУМЕНТЫ.КАССА.ПРИХОРД",True,ПКО);
 fi;
 if not РКО=nil:
    OpenBlank("ДОКУМЕНТЫ.КАССА.РАСХОРД",True,РКО);
 fi;
 if Проводить:
    EditorCancel;
 fi;
 Return False;
end;

Func СведВОВП_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if Проводить: ^False; fi;
 if EnqOkCancel("Таблица сведений будет очищена, продолжить ?",mtWarning)=cmOk:
    tmp=ExecuteFuncS("НомОрд_OnLookup","",-1,-1,"");
 fi;
 Return False;
end;

Func Clr_OnEnter(FieldName: String; Iter: Integer): logical;
var Name:S;
 if Проводить: ^False; fi;
 if EnqOkCancel("Таблица будет очищена, продолжить ?",mtWarning)=cmCancel: ^False; fi;
 Template.Row=AsInteger(Template.Row)+1;
 Name=AsString(Template.Name);
 if Name="Секц6" : ClearVariable(Сведения);
   |Name="Секц9" : ClearVariable(Позиции); Очистить;
   |Name="Секц10": ClearVariable(Остаток);
   |Name="Секц11": ClearVariable(Перерасход);
   |Name="Секц14": ClearVariable(РЗ);
 fi;
 Return False;
end;

Func A_onEnter(Field:S; Iter:I) :L;
var i:i;
var Name:S;
 if Проводить: ^False; fi;
 i=Iter;
 Name=AsString(Template.Name);
 if Name="Секц6" : Iter=InsertFrame(Сведения,Iter+1);
   |Name="Секц9" : Iter=InsertFrame(Позиции,Iter+1);
   |Name="Секц10": Iter=InsertFrame(Остаток,Iter+1);
   |Name="Секц11": Iter=InsertFrame(Перерасход,Iter+1);
   |Name="Секц14": Iter=InsertFrame(РЗ,Iter+1);
 fi;
 if Field="AA":
    if Name="Секц6":
       Сведения[Iter].Сч=Сведения[i].Сч;
       Сведения[Iter].Внесен_Ост_Руб=Сведения[i].Внесен_Ост_Руб;
       Сведения[Iter].Внесен_Ост_Вал=Сведения[i].Внесен_Ост_Вал;
       Сведения[Iter].Выдан_ПрРасх_Руб=Сведения[i].Выдан_ПрРасх_Руб;
       Сведения[Iter].Выдан_ПрРасх_Вал=Сведения[i].Выдан_ПрРасх_Вал;
       Сведения[Iter].НомОрд=Сведения[i].НомОрд;
       Сведения[Iter].ДатаОрд=Сведения[i].ДатаОрд;
      |Name="Секц9":
       Позиции[Iter].ДДок=Позиции[i].ДДок;
       Позиции[Iter].НДок=Позиции[i].НДок;
       Позиции[Iter].Содерж=Позиции[i].Содерж;
       Позиции[Iter].Предм=Позиции[i].Предм;
       Позиции[Iter].ОКДП_Гр=Позиции[i].ОКДП_Гр;
       Позиции[Iter].ОКДП=Позиции[i].ОКДП;
       Позиции[Iter].Цена=Позиции[i].Цена;
       Позиции[Iter].Кол=Позиции[i].Кол;
       Позиции[Iter].ЕдИзм=Позиции[i].ЕдИзм;
       Позиции[Iter].Контр=Позиции[i].Контр;
       Позиции[Iter].Отч_Руб=Позиции[i].Отч_Руб;
       Позиции[Iter].Отч_Вал=Позиции[i].Отч_Вал;
       Позиции[Iter].Учт_Руб=Позиции[i].Учт_Руб;
       Позиции[Iter].Учт_Вал=Позиции[i].Учт_Вал;
       Позиции[Iter].СчДеб=Позиции[i].СчДеб;
       Позиции[Iter].СчКре=Позиции[i].СчКре;
       Позиции[Iter].Призн=Позиции[i].Призн;
      |Name="Секц10":
       Остаток[Iter].Отч_Руб=Остаток[i].Отч_Руб;
       Остаток[Iter].Отч_Вал=Остаток[i].Отч_Вал;
       Остаток[Iter].Учт_Руб=Остаток[i].Учт_Руб;
       Остаток[Iter].Учт_Вал=Остаток[i].Учт_Вал;
       Остаток[Iter].СчДеб=Остаток[i].СчДеб;
       Остаток[Iter].СчКре=Остаток[i].СчКре;
      |Name="Секц11":
       Перерасход[Iter].Отч_Руб=Перерасход[i].Отч_Руб;
       Перерасход[Iter].Отч_Вал=Перерасход[i].Отч_Вал;
       Перерасход[Iter].Учт_Руб=Перерасход[i].Учт_Руб;
       Перерасход[Iter].Учт_Вал=Перерасход[i].Учт_Вал;
       Перерасход[Iter].СчДеб=Перерасход[i].СчДеб;
       Перерасход[Iter].СчКре=Перерасход[i].СчКре;
    fi;
 fi;
 ^False;
end;

Func D_onEnter(Field:S; Iter:I) :L;
var Name:S;
 if Проводить: ^False; fi;
 Name=AsString(Template.Name);
 if Name="Секц6" : DeleteFrame(Сведения,Iter);
   |Name="Секц9" : DeleteFrame(Позиции,Iter); Очистить;
   |Name="Секц10": DeleteFrame(Остаток,Iter);
   |Name="Секц11": DeleteFrame(Перерасход,Iter);
   |Name="Секц14": DeleteFrame(РЗ,Iter);
 fi;
 НеПустаяСтрока;
 ^False;
end;

Func Сч_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:s;
 tmp=AccountElection(МаскаСч2);
 if tmp="": ^False; fi;
 Сведения[Iter].Сч=tmp;
 if Match(tmp,"*.?.???.??.660"): Template.Field="Выдан_ПрРасх_Руб"; Template.Frame=Iter;
   |Match(tmp,"*.?.???.??.560"): Template.Field="Внесен_Ост_Руб"; Template.Frame=Iter;
 fi;
 Return False;
end;

Func НомОрд_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Rec:Record;
var n,Iter,OWA,OA,n2,nr2,z:i;
var Crd,F1,F2:S;
 Template.HideEditor(False);
 if ПризнМОЛ="": Message("Введите подотчетное лицо",mtError); Template.Field="ФИОМОЛ"; ^Cur; fi;
 if Row=-1:
    Iter=1;
   else
    Iter=AsInteger(Template.Frame);
 fi;
 ClearVariable(Buf);
 n=0;
-- if Ост_Руб<>0: n=1; fi;
-- if ПрРасх_Руб<>0: n=2; fi;
 if n=0:
    Buf[1]="Приходный ордер";
    Buf[2]="Расходный ордер";
    Buf[3]="Ведомость на выдачу в подотчет";
    n=Alternate("Выбор ордера",Buf,-1,1,12);
    if n=0: ^Cur; fi;
   |n=2:
    Buf[1]="Расходный ордер";
    Buf[2]="Ведомость на выдачу в подотчет";
    n=Alternate("Выбор ордера",Buf,-1,1,12);
    if n=0: ^Cur; fi;
    n=n+1;
 fi;
 if n=1: Crd="ПРИХОРД";
   |n=2: Crd="РАСХОРД";
   |n=3: Crd="РПО_ВЕДПОДОТЧЕТ";
   |True:  ^Cur;
 fi;
 ClearVariable(Buf);
 ClearVariable(BufSum);
 Rec=OpenCardFile(Crd);
 if Rec=nil: ^Cur; fi;
 OWA=OpenWorkArea(Crd,"","UKey="+RecordToString(Rec));
 Try
  if n=1 or n=2:
     if GetFieldL(OWA,1,"РПО_PACKETMODE"):
        OA=OpenArray(OWA,1,"РПО_ПОЗИЦИИ","ТСЧЕТ","not Pos('"+ПризнМОЛ+"',ТПРИЗН)=0");
        nr2=Records(OA);
        if nr2=0: Message("Признак подотчетного лица "+ПризнМОЛ+" не найден в ордере",mtError); ^Cur; fi;
        for n2=1..nr2 do
         z=SearchInArray(Buf,GetFieldS(OA,n2,"ТСЧЕТ"),True);
         if z=-1:
            z=InsertInArraySort(Buf,GetFieldS(OA,n2,"ТСЧЕТ"));
            InsertInArray(BufSum,z,0);
         fi;
         BufSum[z]=BufSum[z]+GetFieldN(OA,n2,"ТСУММА");
        od;
        CloseWorkArea(OA);
        --
        if Row=-1:
           ClearVariable(Сведения);
           InsertFrame(Сведения,1);
        fi;
        for z=1..LengthOfArray(Buf) do
         if not z-1=0: InsertFrame(Сведения,Iter+z-1); fi;
         Сведения[Iter+z-1].Сч=Buf[z];
         if n=1:
            Сведения[Iter+z-1].Внесен_Ост_Руб=BufSum[z];
            Сведения[Iter+z-1].Внесен_Ост_Вал=0;
           else
            Сведения[Iter+z-1].Выдан_ПрРасх_Руб=BufSum[z];
            Сведения[Iter+z-1].Выдан_ПрРасх_Вал=0;
         fi;
         Сведения[Iter+z-1].НомОрд=GetFieldS(OWA,1,"НомерБум");
         Сведения[Iter+z-1].ДатаОрд=GetFieldD(OWA,1,"Д");
        od;
       else
        F1=GetFieldS(OWA,1,"ПРИЗН");
        F2=GetFieldS(OWA,1,"ЦЕЛЬ");
        if Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(F1," ","МОЛ.*","")=ПризнМОЛ or Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(F2," ","МОЛ.*","")=ПризнМОЛ:
           if Row=-1:
              ClearVariable(Сведения);
              InsertFrame(Сведения,1);
           fi;
           Сведения[Iter].НомОрд=GetFieldS(OWA,1,"НомерБум");
           Сведения[Iter].ДатаОрд=GetFieldD(OWA,1,"Д");
           Сведения[Iter].Сч=GetFieldS(OWA,1,"СЧЕТ");
           Сведения[Iter].Внесен_Ост_Вал=0;
           Сведения[Iter].Выдан_ПрРасх_Вал=0;
           if n=1: 
              Сведения[Iter].Внесен_Ост_Руб=GetFieldN(OWA,1,"СУММА");
             else
              Сведения[Iter].Выдан_ПрРасх_Руб=GetFieldN(OWA,1,"СУММА");
           fi;
          else
           Message("Признак подотчетного лица "+ПризнМОЛ+" не найден в ордере",mtError); 
           ^Cur;
        fi;
     fi;
    else
     OA=OpenArray(OWA,1,"ПОЗИЦИИ","СЧДЕБ","not ИСКЛ and ПРИЗНМОЛ='"+ПризнМОЛ+"'");
     nr2=Records(OA);
     if nr2=0: Message("Признак подотчетного лица "+ПризнМОЛ+" не найден в ведомости",mtError); ^Cur; fi;
     for n2=1..nr2 do
      z=SearchInArray(Buf,GetFieldS(OA,n2,"СЧДЕБ"),True);
      if z=-1:
         z=InsertInArraySort(Buf,GetFieldS(OA,n2,"СЧДЕБ"));
         InsertInArray(BufSum,z,0);
      fi;
      BufSum[z]=BufSum[z]+GetFieldN(OA,n2,"СУММА");
     od;
     CloseWorkArea(OA);
     --
     if Row=-1:
        ClearVariable(Сведения);
        InsertFrame(Сведения,1);
     fi;
     for z=1..LengthOfArray(Buf) do
      if not z-1=0: InsertFrame(Сведения,Iter+z-1); fi;
      Сведения[Iter+z-1].Сч=Buf[z];
      Сведения[Iter+z-1].Внесен_Ост_Руб=0;
      Сведения[Iter+z-1].Внесен_Ост_Вал=0;
      Сведения[Iter+z-1].Выдан_ПрРасх_Руб=BufSum[z];
      Сведения[Iter+z-1].Выдан_ПрРасх_Вал=0;
      Сведения[Iter+z-1].НомОрд=GetFieldS(OWA,1,"НОМЕРРКО");
      Сведения[Iter+z-1].ДатаОрд=GetFieldD(OWA,1,"ДАТАРКО");
     od;
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^Cur;
end;

Func ПризнБО_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 tmp=AnaElection("БО.*");
 if not tmp="":
    ПризнБО=tmp;
 fi;
 Return False;
end;

Func Гр_OnEnter(FieldName: String; Iter: Integer): logical;
 ^not Проводить;
end;

Func Гр_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Field:S;
var n:i;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 if Field="Гр7": for n=1..Позиции do Позиции[n].Учт_Руб=Позиции[n].Отч_Руб; od;
   |Field="Гр8": for n=1..Позиции do Позиции[n].Учт_Вал=Позиции[n].Отч_Вал; od;
 fi;
 ^Cur;
end;

Proc onExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func verОКДП_Гр_OnEnter(FieldName: String; Iter: Integer): logical;
var i,v:i;
var msg:s;
 if ДатаДок=1.1.1: Message("Введите дату",mtError); Template.Field="ДатаДок"; ^False; fi;
 ClearVariable(Buf);
 Buf[1]="Приказ Минэкономразвития РФ от 1 декабря 2010 г. N 601";
 Buf[2]="Приказ Минэкономразвития РФ от 7 июня 2011 г. N 273";
 i=Alternate("Выберите редакцию номеклатуры",Buf,-1,if(verОКДП_Гр=273,2,1),12);
 if i=1: v=601;
   |i=2: v=273;
   |true: ^False;
 fi;
 if not v=verОКДП_Гр:
    if (v=273 and ДатаДок<9.8.2011) or (v=601 and ДатаДок>8.8.2011):
       if EnqOkCancel("Внимание! На дату документа "+DateToString(ДатаДок)+" выбранная редакция ("+Str(v)+") не действует^MИгнорировать ?",mtWarning)=cmCancel: ^False; fi;
    fi;
    msg=КонвОКДП_Гр(if(v=273,"ГР273","ГР"));
    verОКДП_Гр=if(v=601,0,v);
    if not msg="": Message(msg,mtWarning); fi;
 fi;
 Return False;
end;

Func ОКДП_Гр_OnEnter(FieldName: String; Iter: Integer): logical;
 if ДатаДок=1.1.1: Message("Введите дату",mtError); Template.Field="ДатаДок"; ^False; fi;
 Return True;
end;

Func ОКДП_Гр_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
 ОКДП_=Позиции[Iter].ОКДП;
 Return Раб.Договор.ОКДП_Гр_Verify(selfbln+".ОКДП_",Value,verОКДП_Гр);
end;

Proc ОКДП_Гр_OnExit(FieldName: String; Iter: Integer);
 ОКДП_Гр_=Позиции[Iter].ОКДП_Гр;
 Раб.Договор.ОКДП_Гр_Exit(selfbln+".ОКДП_Гр_");
 Позиции[Iter].ОКДП_Гр=ОКДП_Гр_;
end;

Func ОКДП_Гр_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var rec: Record;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 ОКДП_Гр_=Позиции[Iter].ОКДП_Гр;
 ОКДП_=Позиции[Iter].ОКДП;
 rec=Раб.Договор.ОКДП_Гр_Lookup(selfbln+".ОКДП_Гр_",selfbln+".ОКДП_",verОКДП_Гр);
 if not rec=nil:
    Позиции[Iter].ОКДП_Гр=ОКДП_Гр_;
    Позиции[Iter].ОКДП=ОКДП_;
 fi;
 Return Cur;
end;

Func ОКДП_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var rec: Record;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if ДатаДок>=1.1.2014 or ДатаОпер>=1.1.2014:
    ОКДП_=Позиции[Iter].ОКДП;
    rec=Раб.Договор.ОКПД_Lookup(selfbln+".ОКДП_",selfbln+".fОКДП","");
    if not rec=nil:
       if Length(ОКДП_)=12:
          Позиции[Iter].ОКДП=ОКДП_;
         else
          Message("Уточните значение категории и подкатегории");
          rec=OpenCardFile("РПО_ОКПД","(Length(Код)=12 and Match(Код,'"+ОКДП_+"*')) or Код='"+ОКДП_+"'",Rec);
          if not Rec=nil:
             ОКДП_=GetCardFieldS("РПО_ОКПД",Rec,"Код");
             if not Length(ОКДП_)=12:
                Message("Допустимо выбирать код XX.XX.XX.XXX");
                ^Cur;
               else
                Позиции[Iter].ОКДП=ОКДП_;
             fi;
          fi;
       fi;
    fi;
   else
    ОКДП_Гр_=Позиции[Iter].ОКДП_Гр;
    ОКДП_=Позиции[Iter].ОКДП;
    rec=Раб.Договор.ОКДП_Lookup(selfbln+".ОКДП_Гр_",selfbln+".ОКДП_",selfbln+".fОКДП",verОКДП_Гр);
    if not rec=nil:
       Позиции[Iter].ОКДП_Гр=ОКДП_Гр_;
       Позиции[Iter].ОКДП=ОКДП_;
    fi;
 fi;
 Return Cur;
end;

Func ОКДП_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
 if ДатаДок>=1.1.2014 or ДатаОпер>=1.1.2014:
    ^Раб.Договор.ОКПД_Verify(Value,"Length(Код)=12");
   else
    ОКДП_Гр_=Позиции[Iter].ОКДП_Гр;
    if Раб.Договор.ОКДП_Verify(selfbln+".ОКДП_Гр_",Value,verОКДП_Гр):
       Позиции[Iter].ОКДП_Гр=ОКДП_Гр_;
       ^True;
      else
       ^False;
    fi;
 fi;
end;

Proc ОКДП_OnClick(Row: Integer; Col: Integer; Double: Logical);
var Field,Name,tmp:s;
var Iter:I;
var Obj: Object;
 Iter=AsInteger(Template.Frame);
 Name=AsString(Template.Name);
 if FindObject(Name,Obj):
    Field=AsString(Obj.Cell(Row,Col-1,CellContents,"",False));
    tmp=GetVariableS(Trim("Позиции["+Str(Iter)+"]."+Field));
    if tmp="": Message("Введите код "+if(Field="ОКДП ":"ОКПД"|Field="ОКДП":"ОКДП"|True:"номенклатурной группы"),mtError); Template.Field=Field; Template.Frame=Iter; Exit; fi;
    if Field="ОКДП ":  tmp=Раб.Договор.ВзятьЗначОКПД(tmp,"Наим");
      |Field="ОКДП":  tmp=Раб.Договор.ВзятьЗначОКДП(tmp,"Наим");
      |Field="ОКДП_Гр": tmp=Раб.Бюджет.НаимКБК(if(verОКДП_Гр=273,"ОКДП_ГР273","ОКДП_ГР"),tmp);
      |true: tmp="";
    fi;
    if not tmp="":
       Message(tmp);
    fi;
 fi;
end;

Func СчДеб_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:s;
 tmp=PickCorrAccount(Позиции[Iter].СчКре,True);
 if tmp="": ^False; fi;
 Позиции[Iter].СчДеб=tmp;
 if Позиции[Iter].СчДеб<>"":
    tmp=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,ИсклПризн+if(ПризнПодр="","","|П.*"));
    if Позиции[Iter].Контр<>nil and Раб.Бюджет.ВзятьПризнакИзНабораПоМаске(Позиции[Iter].Призн,"К.*","")="":
       Позиции[Iter].Призн=Раб.Бюджет.ДобавитьПризнак(Позиции[Iter].Призн,"К."+GetCardFieldS("КОНТРАГЕНТ",Позиции[Iter].Контр,"ПРИЗНАК"));
    fi;
    Позиции[Iter].Призн=Раб.Бюджет.МухиОтКотлет(Позиции[Iter].Призн,tmp);
 fi;
 Очистить;
 ^False;
end;

Func СчКре_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:s;
 tmp=AccountElection(МаскаСч1);
 if tmp="": ^False; fi;
 Позиции[Iter].СчКре=tmp;
 if Позиции[Iter].СчДеб<>"":
    if Correspond(Позиции[Iter].СчДеб,Позиции[Iter].СчКре)=False: Message("Счета '"+Позиции[Iter].СчДеб+"/"+Позиции[Iter].СчКре+"' не могут корреспондировать",mtError); Позиции[Iter].СчДеб=""; ^False; fi;
    tmp=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,ИсклПризн+if(ПризнПодр="","","|П.*"));
    if Позиции[Iter].Контр<>nil and Раб.Бюджет.ВзятьПризнакИзНабораПоМаске(Позиции[Iter].Призн,"К.*","")="":
       Позиции[Iter].Призн=Раб.Бюджет.ДобавитьПризнак(Позиции[Iter].Призн,"К."+GetCardFieldS("КОНТРАГЕНТ",Позиции[Iter].Контр,"ПРИЗНАК"));
    fi;

    Позиции[Iter].Призн=Раб.Бюджет.МухиОтКотлет(Позиции[Iter].Призн,tmp);
 fi;
 Очистить;
 ^False;
end;

Func Призн_OnEnter(FieldName: String; Iter: Integer): logical;
var Mask,tmp,БК_,ВД_,КОСГУ_,СчД_,СчК_:S;
 if Позиции[Iter].СчКре="": Message("Введите счет кредита",mtError); Template.Field="СчКре"; Template.Frame=Iter; ^False; fi;
 if Позиции[Iter].СчДеб="": Message("Введите счет дебета",mtError); Template.Field="СчДеб"; Template.Frame=Iter; ^False; fi;
 Mask=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,ИсклПризн+if(ПризнПодр="","","|П.*"));
 if УчетБО:
    БК_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","БК",False);
    ВД_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","ВД",False);
    КОСГУ_=Раб.Бюджет2005.Соотв_Ан_КОСГУ(Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","СИНТ",False),Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","АН",False));
    if ВД_="1": СчД_=БК_+".1.501.13."+КОСГУ_; СчК_=БК_+".1.502.11."+КОСГУ_;
      |not ВД_="3": СчД_=БК_+"."+ВД_+".506.10."+КОСГУ_; СчК_=БК_+"."+ВД_+".502.11."+КОСГУ_;
    fi;
    if not СчД_="" and not СчК_="":
       tmp=Раб.Бюджет.НаборПризнаков(СчД_,СчК_,ИсклПризн+if(ПризнПодр="","","|П.*"));
       Mask=Раб.Бюджет2005.Объединить(Mask,tmp,"|");
    fi;
 fi;
 if not НеПровДО:
    БК_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","БК",False);
    ВД_=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","ВД",False);
    КОСГУ_=Раб.Бюджет2005.Соотв_Ан_КОСГУ(Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","СИНТ",False),Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"ФКР","АН",False));
    if ВД_<>"3":
       СчД_=БК_+"."+ВД_+".502.11."+КОСГУ_; СчК_=БК_+"."+ВД_+".502.12."+КОСГУ_;
    fi;
    if not СчД_="" and not СчК_="":
       tmp=Раб.Бюджет.НаборПризнаков(СчД_,СчК_,ИсклПризн+if(ПризнПодр="","","|П.*"));
       Mask=Раб.Бюджет2005.Объединить(Mask,tmp,"|");
    fi;
 fi;
 if Mask="": Message("Аналитические признаки не требуются"); ^False; fi;
 tmp=ВыборПризнака(Mask);
 if tmp="": ^False; fi;
 Позиции[Iter].Призн=Раб.Бюджет.ДобавитьПризнак(Позиции[Iter].Призн,tmp);
 ^False;
end;

Proc Призн_OnExit(FieldName: String; Iter: Integer);
 Позиции[Iter].Призн=Раб.Бюджет2005.УдалитьСловоИзНабора_Диалог2(Позиции[Iter].Призн," ","Name_A");
end;

Func ВыборИзОтч_OnEnter(FieldName: String; Iter: Integer): logical;
 if Проводить: ^False; fi;
 if ДатаДок=1.1.1: Message("Введите дату",mtError); Template.Field="ДатаДок"; ^False; fi;
 if ПризнМОЛ="": Message("Выберите подотчетное лицо",mtError); Template.Field="ФИОМОЛ"; ^False; fi;
 ЗаполнитьИзОтчета(Iter);
 Return False;
end;

Func СчДеб2_OnEnter(FieldName: String; Iter: Integer): logical;
var Секц,tmp:S;
 Секц=AsString(Template.Name);
 tmp=AccountElection("*.?.208.??.560");
 if tmp="": ^False; fi;
 if Секц="Секц10": Остаток[Iter].СчДеб=tmp;
   |Секц="Секц11": Перерасход[Iter].СчДеб=tmp;
 fi;
 Return False;
end;

Func СчКре2_OnEnter(FieldName: String; Iter: Integer): logical;
var Секц,tmp:S;
 Секц=AsString(Template.Name);
 tmp=AccountElection("*.?.208.??.660");
 if tmp="": ^False; fi;
 if Секц="Секц10": Остаток[Iter].СчКре=tmp;
   |Секц="Секц11": Перерасход[Iter].СчКре=tmp;
 fi;
 Return False;
end;

Proc Сум_onExit(FieldName: String; Iter: Integer);
 if AsString(Template.Name)="Секц9": ПересчетСум(FieldName,Iter);
   |AsString(Template.Name)="Секц14": ПересчетСумРЗ(FieldName,Iter);
 fi;
end;

Func НДС_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 if РЗ=0: InsertFrame(РЗ,1); fi;
 ClearVariable(Buf);
 Buf[1]="НДС=18 %";
 Buf[2]="НДС=10 %";
 Buf[3]="Без НДС";
 n=Alternate("Ставка НДС",Buf,20,1,12);
 if n=1: РЗ[Iter].НДС=18;
   |n=2: РЗ[Iter].НДС=10;
   |n=3: РЗ[Iter].НДС=0;
   |True: ^False;
 fi;
 ПересчетСум(FieldName,Iter);
 Return False;
end;

Func Контр_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
var tmp:S;
 if FieldName="Контр_":
    Rec=Позиции[Iter].Контр;
    if Позиции=0: Iter=InsertFrame(Позиции,Iter); fi;
   |FieldName="КонтрРЗ_":
    Rec=РЗ[Iter].Контр;
    if РЗ=0: Iter=InsertFrame(РЗ,Iter); fi;
 fi;
 if Rec=nil:
    Раб.Поиск.ТекЗап=hКонтр;
   else
    Раб.Поиск.ТекЗап=Rec;
 fi;
 rec=Раб.Поиск.ВыборИзКартотеки("Выбор контрагента","КОНТРАГЕНТ","ПРИЗНАК|ПОЛНИМЯ|КОРИМЯ|ИНН","Код|Полное имя|Краткое имя|ИНН","");
 if not rec=nil:
    if FieldName="Контр_": 
       Позиции[Iter].Контр=Rec;
       Позиции[Iter].Призн=Раб.Бюджет.ДобавитьПризнак(Позиции[Iter].Призн,"К."+GetCardFieldS("КОНТРАГЕНТ",rec,"ПРИЗНАК"));
       if Позиции[Iter].СчДеб<>"" and Позиции[Iter].СчКре<>"":
          tmp=Раб.Бюджет.НаборПризнаков(Позиции[Iter].СчДеб,Позиции[Iter].СчКре,ИсклПризн+if(ПризнПодр="","","|П.*"));
          Позиции[Iter].Призн=Раб.Бюджет.МухиОтКотлет(Позиции[Iter].Призн,tmp);
       fi;
      |FieldName="КонтрРЗ_": 
       РЗ[Iter].Контр=Rec;
    fi;
    hКонтр=Rec;
 fi;
 Return False;
end;

Proc Контр_OnExit(FieldName: String; Iter: Integer);
 if FieldName="Контр_": Позиции[Iter].Контр=nil;
   |FieldName="КонтрРЗ_": РЗ[Iter].Контр=nil;
 fi;
end;

Func ЕдИзм_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Rec: Record;
var Iter:I;
 Template.HideEditor(False);
 if fОКЕИ=0: fОКЕИ=Раб.Договор.ЗагрузСправ("РПО_ОКЕИ",PlanVar("Std_Rpo")+"\DBF\РПО_ОКЕИ",ieCRD,"Загрузить справочник единиц измерений ОКЕИ ?"); fi;
 if fОКЕИ=1:
    Iter=AsInteger(Template.Frame);
    Rec=Раб.Поиск.ВыборИзКартотеки("Выбор из классификатора ОКЕИ","РПО_ОКЕИ","ВИД|КОД|НАИМЕНОВАНИЕ|НУО|МУО|НКБО|МКБО","Группа (длина,площадь,объем,масса,техн,время,экон)|Код|Наименование|Нацинальное условное обозначение|Международное условное обозначение|Национальное кодовое буквенное обозначение|Международное кодовое буквенное обозначение","");
    if Rec=nil: ^Cur; fi;
    Позиции[Iter].ЕдИзм=Lo(GetCardFieldS("РПО_ОКЕИ",Rec,"НКБО"));
 fi;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--
--Обработчики событий объектов шаблона-----
Func SectionOnInsert(SectName: String): Logical;
 Return not Проводить;
end;

Func SectionOnDelete(SectName: String; Iter: Integer): Logical;
 if SectName="Секц9" and not Проводить: Очистить; fi;
 Return not Проводить;
end;

Proc cbПроводить_onChange(Obj:S);
 if Проводить=False:
    if EnqOkCancel("Вы уверены, что хотите исключить данный документ из обработки ?",mtWarning)=cmCancel: Проводить=True; fi;
   else
    Проводить=Проверить;
 fi;
 cbПроводить.State=Проводить;
 EditorApply;
 Оформление;
end;

Proc btnДата_OnClick(Sender: String);
var tmp:D;
 tmp=Calendar;
 if tmp=1.1.100: Exit; fi;
 if Sender="btnДатаОпер": ДатаОпер=tmp; fi;
 Оформление;
end;

Proc btnРасчет_OnClick(Sender: String);
 РасчетОст;
 РасчетБухИтогов;
 СумОрд=Max(Ост_Руб,ПрРасх_Руб);
end;

Proc btnПечать_OnClick(Sender: S);
 Раб.Настр_Печать.Prn("","","Rpo_0511601_000.cfg","",1);
end;

Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;

Proc cbРасписка_OnChange(Sender: String);
 Оформление;
end;

Proc cbУчетБО_OnChange(Sender: String);
 if УчетБО and Проводить:
    УчетБО=ПроверитьБО;
    cbУчетБО.State=УчетБО;
 fi;
 EditorApply;
end;

Proc btnОтчет_OnClick(Sender: String);
var ДК:D;
 if ДатаДок=1.1.100: Message("Заполните дату",mtError); Template.Field="ДатаДок"; Exit; fi;
 if ПризнМОЛ="": Message("Заполните подотчетное лицо",mtError); Template.Field="ФИОМОЛ"; Exit; fi;
 ДК=if(ДатаОпер=1.1.100,ДатаДок,ДатаОпер);
 Refresh;
 if Sender="btnОтчетПров":
    Report('"'+PlanVar("Std_Rpo")+'\Общие\Отчеты\Служебные отчеты.lst"."001_АВ"',1.1.2000,ДК+1,"*.208.??.*",Раб.Бюджет2005.Объединить(ПризнМОЛ,ПризнАванс,"&"));
   else
    Report('"'+PlanVar("Std_Rpo")+'\Общие\Отчеты\Служебные отчеты.lst"."010_АВ"',Dat(1,1,Year(ДК)),ДК+1,"*.208.??.*",Раб.Бюджет2005.Объединить(ПризнМОЛ,ПризнАванс,"&"));
 fi;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 First=True;
 Раб.Настр_Печать.Cfg("","Rpo_0511601_000.cfg");
 Инициализация;
end;

Proc AfterOpen(Destroy: Logical);
 SQLver=SQLЗапросыРазрешены;
 if First: Инициализация; Оформление; fi;
 First=False;
end;

Func InitRecord:S;
var msg:S;
    Ф0504049=True;
    Номер=Раб.Обл.СледСУчетомГода(SelfCrd,"Номер","ДатаДок");
    НомерБум=Str(Номер);
    if Рекв=nil:
       Рекв=Раб.Бюджет2005.НашРекв;
       if not Рекв=Nil: ФИОРук=Рекв.ФИОРук; ФИОБух=Рекв.ФИОБух; fi;
    fi;
    Проводить=False;
    Валюта=BaseCurrency;
    ver=2;
    msg=ОбновВерсиюОКДП_Гр(false);
    if Раб.Бюджет2005.Сетевая: EditorApply; fi;
    return msg;

end;

Proc OnRead;
var n:i;
var msg:s;
var Призн_:S;
var rec:Record;
 if НоваяЗапись:
    ДатаДок=ToDay;
    RECCRD=0;
    CRD="";
    BLNCRD="";
    msg = InitRecord;
   |(ДатаДок = 1.1.100 and Номер=0 and НомерБум = "" and CRD<>"" and RecCrd<>0):  --Запись создана из внешней системы
    rec = IntegerToRecord(Abs(RecCrd));
    if CRD="РПО_ОПЕРАЦИИДНФА":
       ДатаДок= GetCardFieldD(CRD, Rec,"ДатОпер");
    fi;
    ДатаОпер = ДатаДок;
    msg = InitRecord;
    Refresh(False, ДатаОпер+1);
    for Transaction n = '*.208.*|*.302.*', ДатаОпер, ДатаОпер+1 do
        if TransCardFile(n) = CRD and TransRecord(n) = rec:
           InsertFrame(Позиции,Позиции+1);
           Позиции[Позиции].СчДеб = TransDeb(n);
           Позиции[Позиции].СчКре = TransCre(n);
           Позиции[Позиции].Отч_Руб = TransSum(n);
           Позиции[Позиции].Содерж = TransComment(n);
           Призн_ = TransSigns(n);
           if ПризнМОЛ = "":
              ПризнМОЛ = Раб.Бюджет2005.ВзятьСловоИзНабораПоМаске(Призн_," ", "МОЛ.*","");
              ЗаполнитьМол(False);
           fi;
           Призн_ = Раб.Бюджет2005.УдалитьСловоИзНабораПоМаске(Призн_," ", "МОЛ.*","");
           Позиции[Позиции].Призн = Призн_;
        fi;
    od;

 fi;
 НеПустаяСтрока;
 РасчетБухИтогов;
 if НоваяЗапись:
    if Позиции=1: for n=1..10 do InsertFrame(Позиции,Позиции+1); od; fi;
    if Остаток=1: for n=1..5 do InsertFrame(Остаток,Остаток+1); od; fi;
    if Перерасход=1: for n=1..5 do InsertFrame(Перерасход,Перерасход+1); od; fi;
 fi;
 Конвертация;
 if not First: Оформление; fi;
 if not msg="": Message(msg,mtWarning); fi;
end;

Func OnVerify: Logical;
var Iter:I;
var Flag:L;
 СумОтч=ВсегоУчт_Руб;
 СумОтч_В=ВсегоУчт_Вал;
 if Валюта="": Валюта=BaseCurrency; fi;
 if Проводить: RefreshAna; fi;
 Flag=False;
 for Iter=1..Позиции do
  if ДатаДок>=1.1.2014 or ДатаОпер>=1.1.2014:
     if Позиции[Iter].ОКДП="":
        Позиции[Iter].ОКДП_Призн="";
       else
        Позиции[Iter].ОКДП_Призн=Раб.Договор.ОКДП_В_Признак("",Позиции[Iter].ОКДП,False,1);
        if not Позиции[Iter].ОКДП_Призн="": Flag=True; fi;
     fi;
     Позиции[Iter].ОКДП_Гр="";
    else
     if Позиции[Iter].ОКДП_Гр="" or Позиции[Iter].ОКДП="":
        Позиции[Iter].ОКДП_Призн="";
       else
        Позиции[Iter].ОКДП_Призн=Раб.Договор.ОКДП_В_Признак(Позиции[Iter].ОКДП_Гр,Позиции[Iter].ОКДП,False,verОКДП_Гр);
        if not Позиции[Iter].ОКДП_Призн="": Flag=True; fi;
     fi;
  fi;
 od;
 if Проводить:
    RefreshAna;
    for Iter=1..Позиции do
     if not Позиции[Iter].ОКДП_Гр="":
        if Name_A(Позиции[Iter].ОКДП_Призн)=" ": Message("Неизвестный аналитический признак номенклатурной группы '"+Позиции[Iter].ОКДП_Призн+"'",mtError); Template.Field="ОКДП_Гр"; Template.Frame=Iter; Проводить=False; ^False; fi;
     fi;
    od;
 fi;
 if Flag:
    if ver<2: ver=2; fi;
 fi;
 ^True;
end;
--Обработчики событий шаблона -----
--
var Номер_Н[]:N=Round(Позиции[$].НомерБум_Н);
var Номер_К[]:N=Round(Позиции[$].НомерБум_К);

Func СерияБум_onEnter (Field:S; Iter:I):L;
 if Позиции[Iter].FlagКол=True: Message("Для данного режима ввода задавать серию не требуется",mtWarning); Template.Field="FlagКол_"; Template.Frame=Iter; ^False; fi;
 ^True;
end;

Proc СерияБум_OnExit(FieldName: String; Iter: Integer);
 Позиции[Iter].СерияБум=Up(Позиции[Iter].СерияБум);
end;

Func РасхНомерБум_onEnter(FieldName: String; Iter: Integer): logical;
 --if Позиции[Iter].FlagКол=True: Message("Для данного режима ввода задавать номер не требуется",mtWarning); Template.Field="FlagКол_"; Template.Frame=Iter; ^False; fi;
 Return True;
end;

Func РасхНомерБум_onVerify(FieldName: String; Iter: Integer; Value: S): Logical;
-- if IsInteger(Value)=False: Message("Недопустимый формат числа",mtError); ^False; fi;
 Return True;
end;

Proc РасхНомерБум_onExit(FieldName: String; Iter: Integer);
 if not Позиции[Iter].FlagКол:
    if not Позиции[Iter].НомерБум_Н="" and not Позиции[Iter].НомерБум_К="":
       Позиции[Iter].КолДок=Int(Номер_К[Iter]-Номер_Н[Iter]+1);
      else
       Позиции[Iter].КолДок=0;
    fi;
    Позиции[Iter].Кол=Позиции[Iter].КолДок*Позиции[Iter].ДенДок_Вид.Номинал;
    Позиции[Iter].Отч_Руб=Позиции[Iter].Цена*Позиции[Iter].Кол;
    Позиции[Iter].Учт_Руб=Позиции[Iter].Отч_Руб;

 fi;
end;

Func ДенДокВидПризн_onEnter (Field:S; Iter:I):L;
var tmp:S;
 tmp=AnaElection("ДенДок.*");
 if tmp="": ^False; fi;
 Позиции[Iter].ДенДокВид_Призн=tmp;
 tmp=Name_A(tmp);
 if tmp="" or tmp=" ": tmp=Позиции[Iter].ДенДокВид_Призн; fi;
 Позиции[Iter].ДенДокВид_Наим=tmp;
 Позиции[Iter].ДенДок_Вид=SignToRecord(Позиции[Iter].ДенДокВид_Призн);
 РасхНомерБум_onExit(Field,Iter);
 ^False;
end;

Func По_Остаткам(out:S):S;
var nn,n,z,Iter:I;
var УслСч,УслАн:S;
var tmp:S;
var oldrow:L;
  Iter=AsInteger(Template.Frame);
  if Позиции[Iter].СчКре="": Message("Введите счет кредита",mtError); Template.Field="СчКре"; ^""; fi;
  УслСч=Раб.Бюджет2005.ВзятьКодСчета(Позиции[Iter].СчКре,"","АН",True);
  if УслСч="": УслСч=Позиции[Iter].СчКре; else УслСч=УслСч+"!"; fi;
  if УслСч="": УслСч="*"; fi;
  УслАн=Раб.Бюджет2005.Объединить(ПризнМОЛ,if(out="ПРИЗН","",Позиции[Iter].ДенДокВид_Призн),"|");
  Раб.Вспом.Дендок_ост.РасчетОст(УслСч,УслАн,ДатаОпер+1);
  --Удаление уже забитых данных из текущего документа
  for n=1..Позиции do
    if n<>Iter and (out="ПРИЗН" or Позиции[Iter].ДенДокВид_Призн="" or Позиции[Iter].ДенДокВид_Призн=Позиции[n].ДенДокВид_Призн):
       z = РАБ.ДИАПАЗОНЫ.КолД;
       РАБ.ДИАПАЗОНЫ.буфСер1 = Позиции[n].СерияБум;
       РАБ.ДИАПАЗОНЫ.буфНач1 = Номер_Н[n];
       РАБ.ДИАПАЗОНЫ.буфКон1 = Номер_К[n];
       РАБ.ДИАПАЗОНЫ.буфКол1 = int(-1*Позиции[n].ДенДок_Вид.Номинал);
       РАБ.ДИАПАЗОНЫ.буфРазм1 = Max(Length(Позиции[n].НомерБум_Н),Length(Позиции[n].НомерБум_К));
       РАБ.ДИАПАЗОНЫ.буфПризн1 = Позиции[n].ДенДокВид_Призн;
       РАБ.ДИАПАЗОНЫ.буфЦена1 = Round(Позиции[n].Цена/Позиции[n].ДенДок_Вид.Номинал,Accuracy);
       РАБ.ДИАПАЗОНЫ.Сохранить(z + 1, 1);
    fi;
  od;
  Раб.Вспом.Дендок_ост.КПоказу(3,if(out="ПРИЗН" or Позиции[Iter].ДенДокВид_Призн="","","#2#3#4#"),False);
  Раб.Вспом.Дендок_ост.Выбрать;
  nn=РАБ.ДИАПАЗОНЫ.КолД;
  oldrow=True;
  for n=1..nn do
    if not oldrow:
       Iter=InsertFrame(Позиции,Iter+1);
      else
       oldrow=False;
    fi;
    РАБ.ДИАПАЗОНЫ.Извлечь(n, 1);
    Позиции[Iter].ДенДокВид_Призн=РАБ.ДИАПАЗОНЫ.буфПризн1;
    tmp=Позиции[Iter].ДенДокВид_Призн;
    tmp=Name_A(tmp);
    if tmp="" or tmp=" ": tmp=Позиции[Iter].ДенДокВид_Призн; fi;
    Позиции[Iter].ДенДокВид_Наим=tmp;
    Позиции[Iter].ДенДок_Вид=SignToRecord(Позиции[Iter].ДенДокВид_Призн);
    Позиции[Iter].Цена=РАБ.ДИАПАЗОНЫ.буфЦена1/Позиции[Iter].ДенДок_Вид.Номинал;
    Позиции[Iter].СерияБум=РАБ.ДИАПАЗОНЫ.буфСер1;
    Позиции[Iter].НомерБум_Н=Раб.Вспом.Дендок_ост.NumToStr(РАБ.ДИАПАЗОНЫ.буфНач1,РАБ.ДИАПАЗОНЫ.буфРазм1);
    Позиции[Iter].НомерБум_К=Раб.Вспом.Дендок_ост.NumToStr(РАБ.ДИАПАЗОНЫ.буфКон1,РАБ.ДИАПАЗОНЫ.буфРазм1);
    Позиции[Iter].КолДок=Int(Номер_К[Iter]-Номер_Н[Iter]+1);
    Позиции[Iter].ЕдИзм=Позиции[Iter].ДенДок_Вид.ЕдИзм;
  od;


  РасхНомерБум_onExit(out,Iter);
  if out="ПРИЗН":
     ^Позиции[Iter].ДенДокВид_Призн;
    |out="НОМ_Н":
     ^Позиции[Iter].НомерБум_Н;
    |out="НОМ_К":
     ^Позиции[Iter].НомерБум_К;
  fi;
end;


Func НомерБум_Н_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
  Template.HideEditor(False);
  Return   По_Остаткам("НОМ_Н");
end;


Func НомерБум_К_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
  Template.HideEditor(False);
  Return   По_Остаткам("НОМ_К");
end;



Proc cbДенДок_OnChange(Sender: String);
  Оформление;
end;


Func ДенДокВид_Призн_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
  Template.HideEditor(False);
  Return   По_Остаткам("ПРИЗН");
end;


Proc Получ_OnExit(FieldName: String; Iter: Integer);
  СкрытиеПустТабл;
end;


Конец