БЛАНКСШАБЛОНОМ "Книга покупок",
Редактор КнигаПокуп;
uses Раб.Формат,
     Раб.Документы,
     Раб.Обл,
     Раб.Бух,
     Раб.Сис,
     Раб.Вспом.Печать2;

var selfBln:S="ДОКУМЕНТЫ.СЧЕТА.КНПОК_2014";
var SelfCfg:S="ДОКУМЕНТЫ.СЧЕТА.КНПОК.000.cfg";

var Add:S="+";
var Del:S="-";


КолСтрок:Integer= 12; -- Количество строк на листе
СчетПоДебету:String=''; -- Счет по дебету для проводок

S7:Section;
S1:Section;
S1a:Section;
S2:Section;
S3:Section;
S4:Section;
S5:Section;
S6:Section;
Шапка:Section; -- шапка таблицы
SНеПервый2:Section; -- шапка таблицы
SНеПервый_:Section; -- шапка таблицы

Позиции:Section; -- позиции с с.ф.
SIt:Section;
SSub:Section;
SSub1:Section;
SSub2:Section;
Сек[]:S;
var nS:I=16;
Proc СекЗап;
var i:I;
  for i=1..7 do
    Сек[i]="S"+Str(i);
  od;
  Сек[8]="S1a";
  Сек[9]="Шапка";
  Сек[10]="SНеПервый2";
  Сек[11]="SНеПервый_";
  Сек[12]="Позиции";
  Сек[13]="SIt";
  Сек[14]="SSub";
  Сек[15]="SSub1";
  Сек[16]="SSub2";
end;

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

-- Из бланка Сервис
ПоПринятию:Logical; -- Учитывать в книге с.ф. только по принятию на учет (оплаты не учитывать)
УчитыватьОплату:Logical; -- т.е. учитывать что больше оплата или 1/6 (1/2).
ИмяИзПодразделения_:Logical; -- Имя покупателя брать из подразделения;
БезПодразделений:Logical; -- Учитывать с.ф. без подразделений
ИмяПродавца:Logical; -- В авансовых с.ф. вместо имени продавца имя нашего предприятия
Пост914:Logical=False; -- Учитывать оплаты
-- Из бланка Сервис Конец


var Page:I=Nстр;

ИмяИзПодразделения:String=if(НашеПодразд<>nil,НашеПодразд.Подраз,Рекв.ПолнИмя);

ИмяПокупателя:String=if(ИМЯИЗПОДРАЗДЕЛЕНИЯ_,ИмяИзПодразделения,Рекв.ПолнИмя);
КПППокупателя:String=if(НАШЕПОДРАЗД=nil,Рекв.КПП,НАШЕПОДРАЗД.Реквизиты.КПП);

--НПП[]:Integer=$+if(NОтсчСтр=0,if(ДополнительныйЛист,0,NСтр*КолСтрок-КолСтрок),NОтсчСтр-1);
НПП[]:Integer=$;

кнСФ:String='';
var Пост451:Logical=True;

var D0_[] :String;

Sum8_[]:N=КнПок[$].Sum8;

D8o   :Numeric = Окр(СуммаМассива(КнПок[].D8,КнПок)  +D8Вх,2);
Func Sum8o_:N;
 ^Окр(СуммаМассива(КнПок[].Sum8,КнПок)+Sum8Вх,2);
end;
Sum8o:Numeric = Sum8o_;

--Перенапраление для корректной работы аккумуляторов
Capa[]:N=if($=1:Sum8o|
            $=10:Sum8ВХ);

ШапкаКнигаПокупок:Integer=if(ДополнительныйЛист,0,1);
ШапкаДОПКнигаПокупок:Integer=if(ДополнительныйЛист,1,0);
ТекстДатаПринятия:String='Дата при- нятия на учет това- ров (ра- бот, услуг), имущест- венных прав';
--if(Форма110506_,'Дата при- нятия на учет това- ров (ра- бот, услуг), имущест- венных прав','Дата при- нятия на учет това- ров (ра- бот, услуг)');
ТекстСтрана:String='Страна происхож-дения товара. Номер таможен- ной декла- рации';
--if(Форма110506_,'Страна происхож-дения товара. Номер таможен- ной декла- рации','Страна происхож-дения товара. Номер ГТД');
ШапкаДоп:Integer=if(ДополнительныйЛист,1,0);
ШапкаПокупкаЗаПериод:Integer=if(ДополнительныйЛист,0,1);

ТекстПредыдущимСумм:String=if(ДополнительныйЛист,'Итого','Перенесено с предыдущего листа');



ВыбраннаяКартотека:Integer;

кнЗаполнение:Object;
флФорма110506:Object;
флДопЛист:Object;
флПост451:Object;

--РПО
--Замена картотеке
СтрУпр:I;
var  КлючК1[]     :String;
var  КлючК2[]     :String;
var  D0К[]        :DATE; --дата счета фактуры
var  ДНП0К[]      :STRING; --номер

var  ДНП0ИК[]     :STRING; --номер/дата изменения
var  ДНП0КорК[]   :STRING; --номер/дата корр.
var  ДНП0КИК[]    :STRING; --номер/дата изменения корр.

var  D1К[]        :DATE; --дата поступления счета фактуры
var  D3К[]        :DATE; --дата оприход. по счету фактуры
var  D8К[]        :N; --сумма счета
var  SUM8К[]      :N; --сумма НДС Всего
var  РЕКВПК[]     :record; --ЮРЛИЦО; --Реквизиты контрагента
var  ПОСТК[]      :STRING; --Название контрагента
var  ИННК[]       :STRING; --ИНН контрагента
var  СТР_ГТДК[]   :STRING; --Страна происхождения и номер ГТД
var  КОММЕНТК[]   :STRING; --комментарий к уменьшаемым суммам
var  КОРСЧЕТК[]   :STRING; --Корреспондирующий счет
var  АНКОДПОСТК[] :STRING; --Аналитика поставщика
var  АВАНСК[]     :L; --Авансовая с.ф.


-- Это нужно, что бы при указании даты первого дня месяца считалось по этот день не включительно, а
-- при указании последнего дня месяца считалось включительно. Нужно только для отбора с.ф.
ДатаКФильтр:Date=if(Mon(ДатаК+1)<>Mon(ДатаК),ДатаК+1,ДатаК);
--------
var D8ДИзм:Numeric;
var Sum8ДИзм:Numeric;

--КартФильтр:Logical;

ПокупТекст:Logical;

ТекстШапки1:String=if(ДополнительныйЛист,"Утвержден постановлением Правительства Российской Федерации","Приложение N 4 к постановлению Правительства Российской Федерации");
--                      "Приложение № 4 к Правилам ведения журналов учета полученных и выставленных",
--                      "Приложение № 2 к Правилам ведения журналов учета полученных и выставленных");
ТекстШапки2:String="от 26 декабря 2011 г. N 1137";
--if(ДополнительныйЛист,
--                      "счетов-фактур, книг покупок и книг продаж при расчетах по налогу на добавленную стоимость (в ред. Постановления Правительства РФ от 11.05.2006 № 283)",
--                      "счетов-фактур, книг покупок и книг продаж при расчетах по налогу на добавленную стоимость,утвержденным Постановлением Правительства РФ от 02.12.2000 № 914 (в ред. Постановлений Правительства РФ от 16.02.2004 № 84, от 11.05.2006 № 283, от 26.05.2009 № 451)");


func Рендер:I;
var res:I;
  Раб.Вспом.Печать2.SelfCfg=SelfCfg;
  Раб.Вспом.Печать2.Инициализация(SelfBln,"S7@S1@S1a@S2@S3@S4@S5@S6@Шапка@SНеПервый2@SНеПервый_@Позиции@SIt@SSub@SSub1@SSub2");

  Раб.Вспом.Печать2.ВывестиСекцию(SelfBln,"S7");
  if ДополнительныйЛист:
     Раб.Вспом.Печать2.ВывестиСекцию(SelfBln,"S1a");
    else
     Раб.Вспом.Печать2.ВывестиСекцию(SelfBln,"S1");
  fi;
  Раб.Вспом.Печать2.ВывестиСекцию(SelfBln,"S2");
  Раб.Вспом.Печать2.ВывестиСекцию(SelfBln,"S3");
  if ДополнительныйЛист:
     Раб.Вспом.Печать2.ВывестиСекцию(SelfBln,"S5");
     Раб.Вспом.Печать2.ВывестиСекцию(SelfBln,"S6");
  fi;
  res=Раб.Вспом.Печать2.ВывестиТаблицу(SelfBln,"S4#3@Шапка#3@"+if(ДополнительныйЛист,"SНеПервый_#2@","")+"SНеПервый2#1","Позиции","SIt#5","SSub@SSub1@SSub2",-1,"Sum8_@Sum8_@Sum8_@БезНДС10@Sum2_@Sum3_@Sto1_@Sum1_@BSum@Sum8_@БезНДС18");
  ^res;
end;

Proc Инициализация;
var Obj:Object;
var s,r,rr,c,cc,n,l,bgColor:i;
var Field:S;
 ClearVariable(BufField);
 ClearVariable(BufColorBg);
 ClearVariable(BufColorFo);
 СекЗап;
 for s=1..nS do
  if FindObject(Сек[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:
          Field=asString(Obj.Cell(r,c,CellContents,""));
          if SearchInArray(BufField,Field,True)=-1:
             n=InsertInArraySort(BufField,Field); 
             InsertInArray(BufColorBg,n,BgColor);
          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 НеПервый:Logical;
--  НеПервый= D8Вх <> 0 or D8Вх<>0 or Sto18Вх<>0 or Sum18Вх<>0 or Sto2Вх<>0 or Sum2Вх<>0 or Sum3Вх<>0 or Sto1Вх<>0 or Sum1Вх<>0 ;
--  SНепервый2.Visible=( and not ДополнительныйЛист);
var Obj:Object;
var s,r,rr,c,cc,n:i;
var Field:S;
  кнЗаполнение.Enabled=not проводить;
  S1.Visible=not ДополнительныйЛист;
  S1a.Visible=ДополнительныйЛист;
  S4.Visible=not ДополнительныйЛист;
  S5.Visible=ДополнительныйЛист;
  S6.Visible=ДополнительныйЛист;
  SНеПервый_.Visible=ДополнительныйЛист;
  SНеПервый2.Visible=Page>1 and not ДополнительныйЛист;
  for s=1..nS do
   if FindObject(Сек[s],Obj):
      rr=asInteger(Obj.RowsCount);
      cc=asInteger(Obj.ColsCount);
      for r=1 .. rr do
       for c=1 .. cc do
        Field=asString(Obj.Cell(r,c,CellContents,""));
        n=SearchInArray(BufField,Field,True);
        if not n=-1:
           if not asInteger(Obj.Cell(r,c,CellFieldType,""))=1:
              if Проводить:
                 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;
        fi;
       od;
      od;
   fi;
  od;


end;

Proc ИзменитьСтраницы(НСт:Integer;ДИзм:Numeric;ПИзм:Numeric;ДИзмНДС:Numeric;ПИзмНДС:Numeric);
var Robl:Integer;
var Delta,DeltaНДС,ИсхЧ,ИсхНДС:Numeric;
var КолСтр,i:Integer;
var Поле1,Поле2:String;
var tmpr:Integer;
 if КнПок>КолСтр:
  Delta=Окр(ПИзм-ДИзм,2);
  Robl=OpenWorkArea("КнигаПокуп","NСтр","ДатаН="+DateToString(ДатаН)+" and ДатаК="+DateToString(ДатаК)+" and Nстр>="+Стр(Nстр+1)
                    +if(ДополнительныйЛист,' and ДополнительныйЛист',' and not ДополнительныйЛист')
                    +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),''));

  КолСтр=Records(Robl);
  Try
  if НСт=6 or НСт=77 or НСт=78 or НСт=88 or НСт=99:
      if НСт=6: Поле1="D8Вх";
        |НСт=77:Поле1="Sum1Вх";
        |НСт=78:Поле1="Sum18Вх";
        |НСт=88:Поле1="Sum2Вх";
        |НСт=99:Поле1="Sum3Вх";
      fi;
       for i=1..КолСтр do
        ИсхЧ=GetFieldN(Robl,i,Поле1);
        НачатьИзменения(Robl);
        Try
         tmpr=PutFieldN(Robl,i,Поле1,ИсхЧ+Delta);
        Finally
         ЗакончитьИзменения(Robl);
        End;
       od;
  |НСт=7 or НСт=8 or НСт=9:
     if Нст=7: Поле1="Sto1Вх";Поле2="Sum1Вх";
       |Нст=8: Поле1="Sto2Вх";Поле2="Sum2Вх";
       |Нст=9: Поле1="Sto18Вх";Поле2="Sum18Вх";
     fi;
     DeltaНДС=Окр(ПИзмНДС-ДИзмНДС,2);
     for i=1..КолСтр do
      ИсхЧ=GetFieldN(Robl,i,Поле1);
      ИсхНДС=GetFieldN(Robl,i,Поле2);
      НачатьИзменения(Robl);
      Try
       tmpr=PutFieldN(Robl,i,Поле1,ИсхЧ+Delta);
       tmpr=PutFieldN(Robl,i,Поле2,ИсхНДС+DeltaНДС);
      Finally
       ЗакончитьИзменения(Robl);
      End;
     od;
   fi;
  Finally
    Раб.Обл.Close(Robl);
  End;
  fi;
End;

Func ДоИзменений(Об:String;Итер:Integer):Logical;
  D8ДИзм=КнПок[Итер].D8;
  Sum8ДИзм=КнПок[Итер].Sum8;
 ^True;
End;


Proc ПослеИзменений(Об:String;Итер:Integer);
-- if Not НеПересчитывать:
   if об="D8" :ИзменитьСтраницы(6,D8ДИзм,КнПок[Итер].D8,0,0);
     |об="Sum8":ИзменитьСтраницы(78,sum8ДИзм,КнПок[Итер].sum18,0,0);
   fi;
-- fi;
End;

Func ПровСущСтраниц:Logical;
var Robl:Integer;
 Robl=OpenWorkArea("КнигаПокуп","NСтр","ДатаН="+DateToString(ДатаН)+" and ДатаК="+DateToString(ДатаК)+" and Nстр>="+Стр(Nстр+1)
                   +if(ДополнительныйЛист,' and ДополнительныйЛист',' and not ДополнительныйЛист')
                   +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),''));

  Try
   if Records(Robl)>0:
     ^True;
   else ^False;
   fi;
  Finally
   CloseWorkArea(Robl);
  End;
End;

var D8ВхПер:Numeric;
var Sto1ВхПер:Numeric;
var Sto18ВхПер:Numeric;
var Sum1ВхПер:Numeric;
var Sum18ВхПер:Numeric;
var Sto2ВхПер:Numeric;
var Sum2ВхПер:Numeric;
var Sum3ВхПер:Numeric;

Proc ПодсчетДляНовойСтраницы(НомСтр:Integer);
var Rob,RSubOb,i,КолЗап:Integer;
  D8ВхПер=0;
  Sto1ВхПер=0;
  Sto18ВхПер=0;
  Sum1ВхПер=0;
  Sum18ВхПер=0;
  Sto2ВхПер=0;
  Sum2ВхПер=0;
  Sum3ВхПер=0;
  Rob=OpenWorkArea("КнигаПокуп","NСтр","ДатаН="+DateToString(ДатаН)+" and ДатаК="+DateToString(ДатаК)+" and Nстр="+Стр(НомСтр)
--                   +if(ДополнительныйЛист,' and ДополнительныйЛист',' and not ДополнительныйЛист')
                   +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),''));

  Try
   RSubOb=OpenArray(Rob,1,"КнПок","");
   Try
     КолЗап=Records(RSubob);
     for i=1..КолЗап do
      D8ВхПер=D8ВхПер+GetFieldN(RSubOb,i,"D8");
      Sto1ВхПер=Sto1ВхПер+GetFieldN(RSubOb,i,"Sto1");
      Sto18ВхПер=Sto18ВхПер+GetFieldN(RSubOb,i,"Sto18");
      Sum1ВхПер=Sum1ВхПер+GetFieldN(RSubOb,i,"Sum1");
      Sum18ВхПер=Sum18ВхПер+GetFieldN(RSubOb,i,"Sum18");
      Sto2ВхПер=Sto2ВхПер+GetFieldN(RSubOb,i,"Sto2");
      Sum2ВхПер=Sum2ВхПер+GetFieldN(RSubOb,i,"Sum2");
      Sum3ВхПер=Sum3ВхПер+GetFieldN(RSubOb,i,"Sum3");
     od;
      D8ВхПер=D8ВхПер+GetFieldN(ROb,1,"D8Вх");
      Sto1ВхПер=Sto1ВхПер+GetFieldN(ROb,1,"Sto1Вх");
      Sto18ВхПер=Sto18ВхПер+GetFieldN(ROb,1,"Sto18Вх");
      Sum1ВхПер=Sum1ВхПер+GetFieldN(ROb,1,"Sum1Вх");
      Sum18ВхПер=Sum1ВхПер+GetFieldN(ROb,1,"Sum18Вх");
      Sto2ВхПер=Sto2ВхПер+GetFieldN(ROb,1,"Sto2Вх");
      Sum2ВхПер=Sum2ВхПер+GetFieldN(ROb,1,"Sum2Вх");
      Sum3ВхПер=Sum3ВхПер+GetFieldN(ROb,1,"Sum3Вх");
   Finally
    CloseWorkArea(RSubOb);
   End;
  Finally
   CloseWorkArea(Rob);
  End;
End;

--РПО
var flagRPO:L=True;
var КонтрКн[]:String;
var ДатСфКн[]:Date;
var НомСфКн[]:String;
var КлючКн[]:String;
var D8Кн[]:Numeric;
var Sum8Кн[]:Numeric;

Proc Поисквкниге;
var OWA,OA,n1,nn1,n2,nn2,i:I;
var D8К_:Numeric;
var Sum8К_:Numeric;

  --Очистка буфера книг
  ClearVariable(КонтрКн);
  ClearVariable(ДатСфКн);
  ClearVariable(НомСфКн);
  ClearVariable(КлючКн );
  ClearVariable(D8Кн);
  ClearVariable(Sum8Кн );
  --Заполнение буфера книг
  OWA=OpenWorkArea("Книгапокуп","NСТР","ДатаН="+DateToString(ДатаН)+" and ДатаК="+DateToString(ДатаК)+" and Проводить");
  try
    nn1=records(Owa);
    for n1=1 to nn1 do
      Oa=OpenArray(OWA,n1,"КнПок","");
      try
        nn2=Records(OA);
        for n2=1 to nn2 do
          i=InsertInArraySort(КлючКн,DateToString(GetFieldD(OA,n2,"D0"))+GetFieldS(OA,n2,"ДНП0")+GetFieldS(OA,n2,"АНКОДПОСТ"));
          InsertInArray(КонтрКн,i,GetFieldS(OA,n2,"АНКОДПОСТ"));
          InsertInArray(ДатСфКн,i,GetFieldD(OA,n2,"D0"));
          InsertInArray(НомСфКн,i,GetFieldS(OA,n2,"ДНП0"));
          InsertInArray(D8Кн   ,i,GetFieldN(OA,n2,"D8"));
          if GetFieldL(OWA, n1, "ПОСТ735"):
             InsertInArray(Sum8Кн,i,GetFieldN(OA,n2,"Sum8"));
          else
             InsertInArray(Sum8Кн,i,GetFieldN(OA,n2,"Sum1") + GetFieldN(OA,n2,"Sum18") + GetFieldN(OA,n2,"Sum2"));
          fi;
        od;
        if n1=nn1 then
           NСТР=getfieldI(OWA,n1,"NСТР")+getfieldI(OWA,n1,"NСТРаниц");
           ПодсчетДляНовойСтраницы(getfieldI(OWA,n1,"NСТР"));
           D8Вх=D8ВхПер;
           Sto1Вх=Sto1ВхПер;
           Sto18Вх=Sto18ВхПер;
           Sum1Вх=Sum1ВхПер;
           Sum18Вх=Sum18ВхПер;
           Sto2Вх=Sto2ВхПер;
           Sum2Вх=Sum2ВхПер;
           Sum3Вх=Sum3ВхПер;
           if nn1<>0 then ДополнительныйЛист=True; fi;
        fi;
      finally
        CloseWorkarea(OA);
      end;
    od;
  finally
    CloseWorkArea(OWA);
  end;
  --Корректировка текущего набора
    nn1=LengthOfArray(КлючКн);
    for n1 = 1 to nn1 do
      i=SearchInArray(КлючК2,trim(КонтрКн[n1])+DateToString(ДатСфКн[n1])+НомСфКн[n1]);
      If i<>-1 then
           D8К_ =D8К[i] - D8Кн[n1];
           Sum8К_=Sum8К[i] - Sum8Кн[n1];
           if Abs(D8К_)+Abs(Sum8К_)=0 then
               DeleteFrame(СтрУпр,i);
             else
              D8К[i] = D8К_;
              Sum8К[i] = Sum8К_;
           fi;
      fi;
    od;
end;

func РасчетНомераДопЛиста:Integer;
var Рез:Integer;
var РО,КолЗап:Integer;
  Рез=0;
  РО=OpenWorkArea('КНИГАПОКУП','Nстр','ДополнительныйЛист and ДатаН='+DateToString(ДатаН)+' and ДатаК='+DateToString(ДатаК)+' and UKEY<>'+RecordToString(Current)
                  +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),''));

  Try
    КолЗап=Records(РО);
    if КолЗап>0:
      Рез=GetFieldI(РО,КолЗап,'Nстр')+1;
    fi;
  Finally
    CloseWorkArea(РО);
  end;

  if Рез=0: -- Если небыло доп листов
    РО=OpenWorkArea("КНИГАПОКУП","Nстр","Not ДополнительныйЛист and ДатаН="+DateToString(ДатаН)+" and ДатаК="+DateToString(ДатаК)+" and UKEY<>"+RecordToString(Current)
                    +if(НашеПодразд<>nil," and НашеПодразд="+RecordToString(НашеПодразд),""));
    Try
      КолЗап=Records(РО);
      if КолЗап>0:
        Рез=GetFieldI(РО,КолЗап,'Nстр')+1;
      else
        Рез=1;
      fi;
    Finally
      CloseWorkArea(РО);
    end;
  fi;

  ^Рез;
end;

-- Переносит итоги из предыдущих периодов книги покупок
proc ПереносИтогов;
var РО,РОП,КолЗап,i:Integer;
  D8Вх=0;Sto18Вх=0;Sum18Вх=0;Sto2Вх=0;Sum2Вх=0;Sum3Вх=0;Sto1Вх=0;Sum1Вх=0;

  -- Считаем доп.листы
  РО=OpenWorkArea('КнигаПокуп','Nстр','ДополнительныйЛист and ДатаН='+DateToString(ДатаН)+' and ДатаК='+DateToString(ДатаК)+' and UKEY<>'+RecordToString(Current)
                  +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),''));

  Try
    КолЗап=Records(РО);
    if КолЗап>0:
      D8Вх=GetFieldN(РО,КолЗап,'D8Вх');
      Sto18Вх=GetFieldN(РО,КолЗап,'Sto18Вх');
      Sum18Вх=GetFieldN(РО,КолЗап,'Sum18Вх');
      Sto2Вх=GetFieldN(РО,КолЗап,'Sto2Вх');
      Sum2Вх=GetFieldN(РО,КолЗап,'Sum2Вх');
      Sum3Вх=GetFieldN(РО,КолЗап,'Sum3Вх');
      Sto1Вх=GetFieldN(РО,КолЗап,'Sto1Вх');
      Sum1Вх=GetFieldN(РО,КолЗап,'Sum1Вх');

      РОП=OpenArray(РО,КолЗап,'КнПок','D0');
      Try
        for i=1..records(РОП) do
          D8Вх=D8Вх+GetFieldN(РОП,i,'D8');
          Sto18Вх=Sto18Вх+GetFieldN(РОП,i,'Sto18');
          Sum18Вх=Sum18Вх+GetFieldN(РОП,i,'Sum18');
          Sto2Вх=Sto2Вх+GetFieldN(РОП,i,'Sto2');
          Sum2Вх=Sum2Вх+GetFieldN(РОП,i,'Sum2');
          Sum3Вх=Sum3Вх+GetFieldN(РОП,i,'Sum3');
          Sto1Вх=Sto1Вх+GetFieldN(РОП,i,'Sto1');
          Sum1Вх=Sum1Вх+GetFieldN(РОП,i,'Sum1');
        end;
      Finally
        CloseWorkArea(РОП);
      End;
    fi;
  Finally
    CloseWorkArea(РО);
  End;

  if D8Вх=0: -- Если небыло доплистов, то считаем листы книги
    РО=OpenWorkArea('КнигаПокуп','NСтр','Not ДополнительныйЛист and ДатаН='+DateToString(ДатаН)+' and ДатаК='+DateToString(ДатаК)+' and UKEY<>'+RecordToString(Current)
                    +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),''));

    Try
      КолЗап=Records(РО);
      if КолЗап>0:
        D8Вх=GetFieldN(РО,КолЗап,'D8Вх');
        Sto18Вх=GetFieldN(РО,КолЗап,'Sto18Вх');
        Sum18Вх=GetFieldN(РО,КолЗап,'Sum18Вх');
        Sto2Вх=GetFieldN(РО,КолЗап,'Sto2Вх');
        Sum2Вх=GetFieldN(РО,КолЗап,'Sum2Вх');
        Sum3Вх=GetFieldN(РО,КолЗап,'Sum3Вх');
        Sto1Вх=GetFieldN(РО,КолЗап,'Sto1Вх');
        Sum1Вх=GetFieldN(РО,КолЗап,'Sum1Вх');

        РОП=OpenArray(РО,КолЗап,'КнПок','D0');
        Try
          for i=1..records(РОП) do
            D8Вх=D8Вх+GetFieldN(РОП,i,'D8');
            Sto18Вх=Sto18Вх+GetFieldN(РОП,i,'Sto18');
            Sum18Вх=Sum18Вх+GetFieldN(РОП,i,'Sum18');
            Sto2Вх=Sto2Вх+GetFieldN(РОП,i,'Sto2');
            Sum2Вх=Sum2Вх+GetFieldN(РОП,i,'Sum2');
            Sum3Вх=Sum3Вх+GetFieldN(РОП,i,'Sum3');
            Sto1Вх=Sto1Вх+GetFieldN(РОП,i,'Sto1');
            Sum1Вх=Sum1Вх+GetFieldN(РОП,i,'Sum1');
          end;
        Finally
          CloseWorkArea(РОП);
        End;
      fi;
    Finally
      CloseWorkArea(РО);
    End;
  fi;
end;

proc ДопЛист_ПриИзменении(Флаг:String);
  if ДополнительныйЛист:
    if ДатаН<>1.1.100:
          Дата=ДатаОформления;
          NСтр=РасчетНомераДопЛиста;
          if EnqOKCancel('Перенести итоговые суммы?')=cmOK:
            ПереносИтогов;
          fi;
      if ДатаН<ДатаК:
      else
         message('Выберите правильный период формирования книги покупок');
         ДополнительныйЛист=false;
         флДопЛист.state=false;
      fi;
    else
       message('Перевыберите период книги покупок.');
       ДополнительныйЛист=false;
       флДопЛист.state=false;
    fi;
  else
    NСтр=1;
    D8Вх=0;Sto18Вх=0;Sum18Вх=0;Sto2Вх=0;Sum2Вх=0;Sum3Вх=0;Sto1Вх=0;Sum1Вх=0;
    Дата=ДатаКФильтр-1;
  fi;
  Оформление;
end;

proc ПриСчитывании;
  var i:I;
  If ДАТАН = 1.1.100 and ДАТАК = 1.1.100:
      --Период_ПриНажатии("");
      ДатаОформления=today;
      Nстр=1;
      NОтсчСтр=1;
      Рекв=РАБ.Обл.ПервЗапись("КонтрАгент","","Наше");
      while КнПок<КолСтрок do
        ВставитьРамку(КнПок,КнПок+1);
      end;
  | True :
     If Рекв = Nil :
      Рекв=РАБ.Обл.ПервЗапись("КонтрАгент","","Наше");
     Fi;

  Fi;
  if CurrentState=crdusInserted:
     Пост735 = True;
  fi;
  if not FlagInit: Оформление; fi;
  for i=1..КНпок do
--    D0_[i]=DateToString(КНпок[i].D0)+" N"+КНпок[i].ДНП0;
    D0_[i]=КНпок[i].ДНП0 + " от " + DateToString(КНпок[i].D0);
  od;

end;


--var КолВст:Integer; -- Количество вставленных строк в вспомогательную картотеку

Proc ВСтр(D0:Date;ДНП0:String;ДНП0И:String;ДНП0Кор:String;ДНП0КИ:String;D2:Date;D3:Date;РеквП:Record;Пост:String;
          ИНН:String;КПП:String;Стр_ГТД:String;D8:Numeric;Sum8:Numeric;КОММЕНТ:String;Аванс:Logical;КОРСЧЕТ:String;АНКОДПост:String);
var Зап:Integer;
--  КолВст=КолВст+1;
  InsertFrame(СтрУпр,if(СтрУпр =0,1,СтрУпр+1));
  Зап=стрУпр;
  InsertInArray(КлючК1,Зап,if(True,"",Раб.формат.DateToSQLStr(D2))+Раб.формат.DateToSQLStr(D3));
  InsertInArray(КлючК2,Зап,Trim(АНКОДПОСТ)+DatetoString(D0)+ДНП0);
  InsertInArray(D0К,Зап,D0);
  InsertInArray(ДНП0К,Зап,ДНП0);
  InsertInArray(ДНП0ИК,Зап,ДНП0И);
  InsertInArray(ДНП0КорК,Зап,ДНП0Кор);
  InsertInArray(ДНП0КИК,Зап,ДНП0КИ);
  --InsertInArray(D2К,Зап,D2);
  InsertInArray(D3К,Зап,D3);
  InsertInArray(D8К,Зап,D8);
  InsertInArray(SUM8К,Зап,SUM8);

  InsertInArray(РеквПК,Зап,РеквП);
  InsertInArray(ПОСТК,Зап,ПОСТ);
  InsertInArray(ИННК,Зап,ИНН + " / " + КПП);
  --InsertInArray(КППК,Зап,КПП);
  InsertInArray(Стр_ГТДК,Зап,Стр_ГТД);
  InsertInArray(КомментК,Зап,Коммент);
  InsertInArray(КорСчетК,Зап,КорСчет);
  InsertInArray(АНКОДПОСТК,Зап,АНКОДПОСТ);
  InsertInArray(АвансК,Зап,Аванс);
End;

-- Пересчитывает валютную сумму в рублевую по курсу на дату
func ПересчетВРуб(СуммаВВалюте:Numeric;Валюта:String;ДКурса:Date):Numeric;
var res:Numeric;
  if Up(Валюта)<>'РУБ' and Валюта<>'':
    res=СуммаВВалюте*Com_Var("Курс."+Валюта,ДКурса);
  else
    res=СуммаВВалюте;
  fi;
  ^res;
end;

-- Пересчитывает рублевую сумму в валютную по курсу на дату
func ПересчетВВалюту(СуммаВРублях:Numeric;Валюта:String;ДКурса:Date):Numeric;
var res:Numeric;
  if Up(Валюта)<>'РУБ' and Валюта<>'':
    res=СуммаВРублях/Com_Var("Курс."+Валюта,ДКурса);
  else
    res=СуммаВРублях;
  fi;
  ^res;
end;

Proc ПоискВхСФ;
var Robl,i,:Integer;
var ВСЕГОПОК,СУМ8:Numeric; -- Общая сумма счета
var ДОприх:Date;     -- Дата оприходования
var ДПолуч:Date;    -- Дата получения
var КолОплат:Integer;-- Количество оплат
var ДПоп:Date; -- Дата попадания с.ф.
var Аванс :Logical; -- Авансовая с.ф.
var РеквПСчит:record; -- Ссылка на РеквП считанная
var РеквПолнИмя, РеквПИНН,РеквПКПП:String; -- полное имя;
var ВалСФ:String; -- валюта с.ф. и валюта оплаты
var ДатаСФ:Date; -- дата с.ф
var ТипУчета:Integer; -- настройка из сервиса
var Коэф:Integer; -- коэффициент долей

  ТипУчета=0;--Раб.ВспомБланки.СервисКнПок.ТипУчета;
  Коэф= if(ТипУчета=0:0|ТипУчета=1:2|ТипУчета=2:6);

  ClearVariable (КлючК1    );
  ClearVariable (КлючК2    );
  ClearVariable (D0К       );
  ClearVariable (ДНП0К     );
  ClearVariable (ДНП0ИК    );
  ClearVariable (ДНП0КорК  );
  ClearVariable (ДНП0КИК   );
  ClearVariable (D1К       );
  ClearVariable (D3К       );
  ClearVariable (D8К       );
  ClearVariable (SUM8К     );
  ClearVariable (РЕКВПК    );
  ClearVariable (ПОСТК     );
  ClearVariable (ИННК      );
  ClearVariable (СТР_ГТДК  );
  ClearVariable (КОММЕНТК  );
  ClearVariable (КОРСЧЕТК  );
  ClearVariable (АНКОДПОСТК);
  ClearVariable (АВАНСК    );
  ClearVariable (СтрУпр);

--  КолВст=0;
  hint('Поиск с.ф. поставщиков');
  Robl=OpenWorkArea('СчетФактПост','ДатаП','Проводить and ДатаОприх<>1.1.100'
                    +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),if(БезПодразделений,' and НАШЕПОДРАЗД=nil','')));
  try
    for i=1..records(Robl) do
      ВалСФ   =GetFieldS(Robl,i,"Валюта");
      ДатаСФ  =GetFieldD(Robl,i,"Дата");
      ДПолуч  =GetFieldD(Robl,i,"ДатаП");
      ВСЕГОПОК=GetFieldN(Robl,i,"ВсегоПок");
      --ВАЛСФ!!!!!
      СУМ8 = ПересчетВРуб(GetFieldN(Robl,i,"Сум1"),ВалСф,ДатаСФ) +
      ПересчетВРуб(GetFieldN(Robl,i,"Сум18"),ВалСф,ДатаСФ) + ПересчетВРуб(GetFieldN(Robl,i,"Сум2"),ВалСф,ДатаСФ);
      ДОприх=GetFieldD(Robl,i,"ДатаОприх");
      РеквпСчит=GetFieldR(Robl,i,'РЕКВП');
      Аванс=GetFieldL(Robl,i,"Аванс");
      if РеквПСчит<>nil:
        РеквПолнИмя=GetFieldS(Robl,i,'РЕКВП.ПолнИмя');
        РеквПИНН=GetFieldS(Robl,i,'РЕКВП.ИНН');
        РеквПКПП=GetFieldS(Robl,i,'РЕКВП.КПП');
      else
        РеквПолнИмя=Наим_П(GetFieldS(Robl,i,"АнкодПост"));
        РеквПИНН='';
        РеквПКПП='';
      fi;

      ДПоп=(if(ДОприх>ДатаСФ,ДОприх,ДатаСФ));
      Дпоп=if(Дполуч>ДПоп,ДПолуч,ДПоп); -- Если дата получения больше, то берем ее

      if ВсегоПок<0 and ДПоп>=ДатаН and ДПоп<ДатаКФильтр: -- Для отрицательных с.ф.
        ВСтр(GetFieldD(Robl,i,'Дата'),GetFieldS(Robl,i,'НомерБум'),'','','',ДОприх,ДОприх,
             РеквПСчит,РеквПолнИмя,РеквПИНН,РеквПКПП,
             GetFieldS(Robl,i,'СТР_ГТД'),ВСЕГОПОК,СУМ8,'',GetFieldL(Robl,i,'Аванс'),
             GetFieldS(Robl,i,'КРЕ'),GetFieldS(Robl,i,"АнкодПост")+' СФП.'+GetFieldS(Robl,i,"АнКод") + ' ' + GetFieldS(Robl,i,"ДопАналитика"));
      fi;

      КолОплат=GetFieldI(Robl,i,"КолОплат");

      if not Пост914:--по принятию
        if КолОплат>=0: -- Если небыло оплат и по принятию
          if true and ДПоп>=ДатаН and ДПоп<ДатаКФильтр and ВсегоПок>0: -- Если новые с.ф.
            ВСтр(GetFieldD(Robl,i,'Дата'),GetFieldS(Robl,i,'НомерБум'),'','','',1.1.100,ДОприх,
                 РеквПСчит,РеквПолнИмя,РеквПИНН,РеквПКПП,
                 GetFieldS(Robl,i,'СТР_ГТД'),ВСЕГОПОК,СУМ8,"",GetFieldL(Robl,i,'Аванс'),
                 GetFieldS(Robl,i,'КРЕ'),GetFieldS(Robl,i,"АнкодПост")+' СФП.'+GetFieldS(Robl,i,"АнКод") + ' ' + GetFieldS(Robl,i,"ДопАналитика"));

          fi;
        fi;
      fi;
    end;
  Finally
    CloseWorkArea(Robl);
  End;
End;

var НомерЗаписи:Integer; -- Номер последней записи
var НомерСтр   :Integer; -- Номер текущей страницы
var НомерЗСтр  :Integer; -- Номер записи страницы
var КолСтр     :Integer; -- Количество страниц
--var КолВст     :Integer; -- Количество вставленных строк
var D8з  :Numeric;       --
var Sum8з:Numeric;       --
var RSub :Integer;       -- Текущая рабочая область подтаблицы
var NewR:Integer;        -- Номер последней записи в страницу


Proc УдалениеСтраниц;
var Robl:Integer;
  Robl=OpenWorkArea("КнигаПокуп","NСтр","ДатаН="+DateToString(ДатаН)+" and ДатаК="+DateToString(ДатаК)+" and Nстр<>"+Стр(Nстр)--+" and Nстр>="+Стр(Nстр+1)
                    +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),'')
                    +" and not Проводить and UKEY<>"+RecordToString(Current));

  Try
    DeleteAllRecords(Robl);
  Finally
   CloseWorkArea(Robl);
  End;
End;

Proc ФормированиеСтраниц; -- формирование страниц книги покупок
var i,Koll:Integer;
var Фильтр:String;
  NewR=0;
  D8з   =D8Вх;
  Sum8з =Sum8Вх;
  НомерСтр=0;
--  КолВст=0;
  колстр=0;
  koll=0;
  НомерСтр=NСтр;
  ClearVariable(КнПок);
  УдалениеСтраниц;
  Фильтр=if(True,"D3","D2;D3");
  ShowProgress(СтрУпр,'Сохранение книги покупок');
  Try
     for i=1..СтрУпр do
        ProgressPos(i);
        ВставитьРамку(КнПок,КнПок+1);
        КнПок[КнПок].D0=D0К[i];
        КнПок[КнПок].Днп0=ДНП0К[i];
        --D0_[КнПок]=DateToString(D0К[i])+" N"+ДНП0К[i];
        D0_[КнПок]=ДНП0К[i] + " от " + DateToString(D0К[i]);
        КнПок[КнПок].Днп0И=ДНП0ИК[i];
        КнПок[КнПок].Днп0Кор=ДНП0КорК[i];
        КнПок[КнПок].Днп0КИ=ДНП0КИК[i];

        КнПок[КнПок].D1=1.1.100;
        КнПок[КнПок].D3=D3К[i];
        КнПок[КнПок].Пост=ПостК[i];
        КнПок[КнПок].АнКодПост=АнКодПостК[i];
        КнПок[КнПок].ИНН=ИННК[i];
        КнПок[КнПок].СТР_ГТД=СТР_ГТДК[i];
        КнПок[КнПок].D8=D8К[i];
        КнПок[КнПок].Sum8=Sum8К[i];
        КнПок[КнПок].КорСчет=КОРСЧЕТК[i];
        КнПок[КнПок].СчетД=СчетПоДебету;
        КнПок[КнПок].Коммент=КомментК[i];
        КнПок[КнПок].Аванс=АвансК[i];
        D8з=D8з+D8К[i];
        Sum8з=Sum8з+Sum8К[i];
     end;
  Finally
    CloseProgress;
  End;
End;

Proc ПоискАвансов;
var Robl,i:Integer;
var КПП:String;
  hint('Поиск авансов с.ф. покупателей');
  Robl=OpenWorkArea('СТОРНО_СФ','ДАТАВ','ДАТАВ>='+DateToString(ДатаН)+' and ДАТАВ<'+DateToString(ДатаК)
                    +if(НашеПодразд<>nil,' and НашеПодразд='+RecordToString(НашеПодразд),if(БезПодразделений,' and НАШЕПОДРАЗД=nil','')));

  Try
      for i=1..records(Robl) do
        КПП=if(GetFieldR(Robl,i,'НашеПодразд')=nil,
               if(ИмяПродавца,Рекв.КПП,GetFieldS(Robl,i,'КПП')),
               if(GetFieldR(Robl,i,'НАШЕПОДРАЗД.Реквизиты')<>nil,GetFieldS(Robl,i,'НАШЕПОДРАЗД.Реквизиты.КПП'),''));

        ВСтр(GetFieldD(Robl,i,'D0'),GetFieldS(Robl,i,'ДНП0'),'','','',GetFieldD(Robl,i,'D2'),
             GetFieldD(Robl,i,'D3'),GetFieldR(Robl,i,'РеквП'),if(ИмяПродавца,Рекв.КорИмя,GetFieldS(Robl,i,'Пост')),
             if(ИмяПродавца,Рекв.ИНН,GetFieldS(Robl,i,'ИНН')),КПП,GetFieldS(Robl,i,'Стр_ГТД'),GetFieldN(Robl,i,'D8'),
             GetFieldN(Robl,i,'SUM1') + GetFieldN(Robl,i,'SUM2') + GetFieldN(Robl,i,'SUM18'),
             GetFieldS(Robl,i,'Коммент'),true,GetFieldS(Robl,i,'КорСчет'),GetFieldS(Robl,i,'АНКОДПОСТ'));
      end;

  Finally
    CloseWorkArea(Robl);
  End;
End;

proc Заполнение_ПриНажатии(Кнопка:String);
 if ДатаН<>1.1.100:
   if ДатаН<ДатаК:
     EditorApply;
     ПоискВхСФ;    -- Ищет входящие счета фактуры
     ПоискАвансов; -- Ищет авансы в картотеке со сторно
     Поисквкниге;
     ФормированиеСтраниц; -- Формирует страницы книги
     if КНпок=0:
       message('За этот период информация для книги покупок не найдена');
     else
       EditorApply;
       NСтраниц=Рендер;
       Close("Раб.Вспом.Печать2");
       message('Книга покупок сформирована.');
     fi;
   else 
     message('Выберите правильный период формирования книги покупок');
   fi;
 else 
   message('Перевыберите период книги покупок.');
 fi;
end;

func КПППокупателя_ПриВходе(Поле:String; Итер:Integer):Logical;
  НашеПодразд=OpenCardFile('Подразделения','',НашеПодразд);
  ^false;
end;

func ИмяПокупателя_ПриВходе(Поле:String; Итер:Integer):Logical;
var tmp:Record;
  tmp=OpenCardFile('Контрагент','',Рекв);
  if tmp<>nil:
    Рекв=tmp;
  fi;
  ^false;
end;

func кнСФ_ПриВходе(Поле:String;Итер:Integer):Logical;
var Robl:Integer;
var СФОткрывали:Logical;
  СФОткрывали=false;
  if КнПок[Итер].Днп0<>"" and КнПок[Итер].D0<>1.1.100:
      Robl=OpenWorkArea("СчетфактПост","Дата","Дата="+Раб.Формат.ДатаСтр(КнПок[Итер].D0,4)+" and НомерБум='"+КнПок[Итер].Днп0+"'");-- and АнКодПост='"+Раб.Формат.ExtractSig(КнПок[Итер].АнКодПост,'К')+"'");
      Try
        if records(Robl)>0:
         СФОткрывали=true;
         ОткрытьБланкРедактор("Документы.Счета.СчетФактПост",Robl,1);
        End;
      Finally
        CloseWorkArea(Robl);
      End;
    if Not СФОткрывали:
        Robl=OpenWorkArea("Счетфакт","Дата","Дата="+Раб.Формат.ДатаСтр(КнПок[Итер].D0,4)+" and НомерБум='"+КнПок[Итер].Днп0+"'");
        Try
          if records(Robl)>0:
           СФОткрывали=true;
           ОткрытьБланкРедактор("Документы.Счета.СФ",Robl,1);
          End;
        Finally
          CloseWorkArea(Robl);
        End;
    fi;
    if Not СФОткрывали:
      message("Не удается найти выбранную счет-фактуру. Возможно она была удалена");
    fi;
   else сообщение("Строка пустая");
  fi;
  ^false;
end;

proc Отмена_ПриНажатии(Кнопка:String);
  EditorCancel;
  Close;
end;

proc OK_ПриНажатии(Кнопка:String);
  EditorApply;
  Close;
end;

proc ПриОткрытии(Создать:Logical);
  FlagInit=True;
  Раб.Настр_Печать.Cfg("","Документы.счета.кнпок.cfg");
end;


proc ДатаОформления_ПриВыходе(Поле:String;Итер:Integer);
  Дата=ДатаОформления;
end;

func АнКодПост_ПриВходе(Клетка:String; Итер: Integer): Logical;
var tmp:String;

  tmp = AnaElection("*");
  if tmp<>"":
    КНпок[Итер].АнКодПост = КНпок[Итер].АнКодПост + if(length(КНпок[Итер].АнКодПост)>0," ","")  + tmp;
  end;

  ^false;
end;

func Аванс_ПриВходе(Поле: String; Итер: Integer): Logical;
   КнПок[Итер].Аванс = Not КнПок[Итер].Аванс;
   Return(False);
end;

Proc btnPrint_OnClick(Sender: String);
-- var t:I;
-- t=time;
 Рендер;
-- t=time-t;
-- Trace(str(t));
 if Sender="btnPrint":
    Раб.Настр_Печать.Prn("Раб.Вспом.Печать2","",Раб.Вспом.Печать2.SelfCfg,"",1);
    Close("Раб.Вспом.Печать2");
   |Sender="btnPreview":
    OpenBlank("Раб.Вспом.Печать2");
 fi;
end;

Func Add_OnEnter(FieldName: String; Iter: Integer): logical;
  InsertFrame(КНпок,Iter);
  Return False ;
end;


Func Del_OnEnter(FieldName: String; Iter: Integer): logical;
  if КНпок>1:
     DeleteFrame(КНпок,Iter);
  fi;
  Return False;
end;


Func Пост_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var TmRec:Record;
var Iter:I;
  Iter=AsInteger(template.Frame);
  TmRec=Раб.Документы.ВыборСФильтром('КонтрАгент','КорИмя',"Поставщик");
  If TmRec <> Nil :
      КНПок[Iter].пост=GetCardFieldS('КонтрАгент',TmRec,'КорИмя');
      КНПок[Iter].ИНН=GetCardFieldS('КонтрАгент',TmRec,"ИНН") + " / " + GetCardFieldS('КонтрАгент',TmRec,"КПП");
      КнПок[Iter].АНКОДПост=CARDFILERECSIGN('КОНТРАГЕНТ','ПРИЗНАК','К',TmRec);
  Fi;

  Return КНПок[Iter].пост ;
end;


Proc CheckBox1_OnChange(Sender: String);
 Оформление;
end;


Proc AfterOpen(Destroy: Logical);
 Инициализация;
 Оформление;
 FlagInit=False;
end;


Proc D0_OnExit(FieldName: String; Iter: Integer);
var tmp, tmp2:S;
var tmpD:D;
var N:I;
  N=Pos("N",D0_[Iter]);
  if N>0:
     tmp=Substr(D0_[Iter],1,N-1);
     tmp=Trim(tmp);
     tmp2=Substr(D0_[Iter],N+1,255);
    else
     tmp="";
  fi;

  N=Pos("от",D0_[Iter]);
  if N>0:
     tmp=Substr(D0_[Iter],N+2,255);
     tmp=Trim(tmp);
     tmp2=Trim(Substr(D0_[Iter],1,N-1));
    else
     tmp="";
  fi;

  try
    tmpD=StringToDate(tmp);
  except
    tmpD=1.1.100;
    tmp="";
  end;

  if tmp="":
     КнПок[Iter].Днп0=D0_[Iter];
    else
     КнПок[Iter].D0=tmpD;
     КнПок[Iter].Днп0=tmp2;
  fi;

end;

var КодНО:S;
var ПоМесту:S;
var FileID: S=["1"];

Func XMLId:S;
var tmp:S;
  --R_Т_A_K_О_GGGGMMDD_N, где:
  --R_Т - префикс;
  tmp = "NO_NDS.8";
  --A_K - идентификатор получателя информации, где: 
    --A - идентификатор получателя, которому направляется файл обмена,
    --K - идентификатор конечного получателя, для которого предназначена информация из данного файла обмена
    --Каждый из идентификаторов (A и K) имеет вид для налоговых органов - четырехразрядный код (код налогового органа в соответствии с классификатором(СОНО);
  tmp = tmp + "_" + if(КодНО="","0000",КодНО)+"_"+ if(ПоМесту="","0000",ПоМесту);
  --О - идентификатор отправителя информации, имеет вид:
    --для организаций - девятнадцатиразрядный код (идентификационный номер налогоплательщика (далее - ИНН) и код причины постановки на учет (далее - КПП) организации (обособленного подразделения);
  tmp = tmp + "_"+Рекв.ИНН+Рекв.КПП;
  --GGGG - год формирования передаваемого файла, MM - месяц, DD - день;
  tmp = tmp + "_" + Format("%.4d%.2d%.2d",Year(Today),Mon(Today), Day(Today));
  --N - идентификационный номер файла. (Длина - от 1 до 36 знаков. Идентификационный номер файла должен обеспечивать уникальность файла).
 ^tmp + "_" +FileID;
end;


--Func XMLId:S;
-- ^"NO_NDS.8"+"_"+"0000_0000"+"_"+Рекв.ИНН+"_" + Str(Year(Today))+Str(Mon(Today))+Str(Day(Today))+"_"+"1";

--end;

Proc СформироватьXML;
var i:I;
var ИНН_:S;
var КПП_:S;
  Раб.XML.ДобАттр("ИдФайл",XMLId);
  Раб.XML.ДобАттр("ВерсПрог","6.9");
  Раб.XML.ДобАттр("ВерсФорм","5.04");
  Раб.XML.ОТКРЫТЬТЭГBuf("Файл",False);
   Раб.XML.ДобАттр("Индекс","0000080");
   Раб.XML.ДобАттр("НомКорр","0");
   Раб.XML.ОТКРЫТЬТЭГBuf("Документ",False);
    Раб.XML.ДобАттр("СумНДСВсКПк",Str(Sum8o,2));
    Раб.XML.ОТКРЫТЬТЭГBuf("КнигаПокуп",False);
    for i = 1 .. КНпок do
     Раб.XML.ДобАттр("НомерПор",Str(i));
--   Номер счета-фактуры продавца НомСчФПрод A T(1-1000) О Может указываться перечень номеров таможенных деклараций. В случае указания более одного номера таможенной декларации разделителем между ними является точка с запятой
     Раб.XML.ДобАттр("НомСчФПрод",КНпок[i].ДНП0);
--   Дата счета-фактуры продавца ДатаСчФПрод A T(=10) Н Типовой элемент <ДатаТип>. Дата в формате ДД.ММ.ГГГГ
     Раб.XML.ДобАттр("ДатаСчФПрод",DateToString(КНпок[i].D0));
--     Номер исправления счета-фактуры продавца НомИспрСчФ A N(3) НУ Принимает значение от 1 и более. Элемент обязателен при наличии элемента <ДатаИспрСчФ>
--     Дата исправления счета-фактуры продавца ДатаИспрСчФ A T(=10) НУ Типовой элемент <ДатаТип>. Дата в формате ДД.ММ.ГГГГ. Элемент обязателен при наличии элемента <НомИспрСчФ>
--     Номер корректировочного счета-фактуры продавца НомКСчФПрод A T(1-256) НУ Элемент обязателен при наличии хотя бы одного из элементов: <ДатаКСчФПрод> | <НомИспрКСчФ> | <ДатаИспрКСчФ>
--     Дата корректировочного счета-фактуры продавца ДатаКСчФПрод A T(=10) НУ Типовой элемент <ДатаТип>. Дата в формате ДД.ММ.ГГГГ. Элемент обязателен при наличии хотя бы одного из элементов: <НомКСчФПрод> | <НомИспрКСчФ> | <ДатаИспрКСчФ>
--     Номер исправления корректировочного счета-фактуры продавца НомИспрКСчФ A N(3) НУ Принимает значение от 1 и более. Элемент обязателен при наличии элемента <ДатаИспрКСчФ>
--     Дата исправления корректировочного счета-фактуры продавца ДатаИспрКСчФ A T(=10) НУ Типовой элемент <ДатаТип>. Дата в формате ДД.ММ.ГГГГ. Элемент обязателен при наличии элемента <НомИспрКСчФ>

--   Номер таможенной декларации НомТД A T(1-1000) Н Может указываться перечень номеров таможенных деклараций. В случае указания более одного номера таможенной декларации разделителем между ними является точка с запятой
     Раб.XML.ДобАттрChk("НомСчФПрод",КНпок[i].СТР_ГТД);
--   Код валюты по ОКВ ОКВ A T(=3) НК Типовой элемент <ОКВТип>. Принимает значение в соответствии с Общероссийским классификатором валют
     Раб.XML.ДобАттрChk("ОКВ",КНпок[i].ОКВ);
--   Стоимость покупок по счету-фактуре, разница стоимости по корректировочному счету-фактуре (включая налог), в валюте счета-фактуры СтоимПокупВ A N(19.2) О
     Раб.XML.ДобАттр("СтоимПокупВ",Str(КНпок[i].D8,2));
--   Сумма налога по счету-фактуре, разница суммы налога по корректировочному счету-фактуре, принимаемая к вычету, в рублях и копейках СумНДСВыч A N(19.2) О
     Раб.XML.ДобАттр("СумНДСВыч",Str(КНпок[i].Sum8,2));
     Раб.XML.ОТКРЫТЬТЭГBuf("КнПокСтр",False);
      -- Код вида операции  КодВидОпер  П  T(=2) ОКМ Принимает значение в соответствии с приложением к приказу ФНС России от 14.02.2012 г. №ММВ-7-3/83@ «Коды видов операций по налогу на добавленную стоимость, необходимые для ведения журнала учета полученных и выставленных счетов-фактур»
      Раб.XML.СоздатьТэг("КодВидОпер",КНпок[i].КОДОП,False);  --TODO: SPLIT!
--     Сведения о документе, подтверждающем уплату налога ДокПдтвУпл С  НМ

      --Дата принятия на учет товаров (работ, услуг), имущественных прав ДатаУчТов П  T(=10)  НМ   Типовой элемент <ДатаТип>.  Дата в формате ДД.ММ.ГГГГ
      if КНпок[i].D3<>1.1.100:
        Раб.XML.СоздатьТэг("ДатаУчТов",dateToString(КНпок.D3),False);
      fi;

--     Сведения о продавце   СвПрод С  НМУ   Типовой элемент <СвУчСдТип>.  Элемент обязателен если элемент <КодВидОпер> примает хотя бы одно из значений диапазона: 01-05 | 07-13
      ИНН_ = Trim(КНпок[i].ИНН);
      КПП_='';
      if Length(ИНН_) > 0 and Инн_<>'-':
         if Pos('/', ИНН_)>0:
            ИНН_ = trim(ExtractWord(1, КНпок[i].ИНН, "/"));
            КПП_ = trim(ExtractWord(2, КНпок[i].ИНН, "/"));
         fi;
         Раб.XML.ОТКРЫТЬТЭГBuf("СвПрод",False);
          if Length(ИНН_) = 12:
            Раб.XML.ДобАттр("ИННФЛ",ИНН_);
            Раб.XML.СоздатьТэг("СведИП","",False);
          else
            Раб.XML.ДобАттр("ИННЮЛ",ИНН_);
            Раб.XML.ДобАттр("КПП",КПП_);
            Раб.XML.СоздатьТэг("СведЮЛ","",False);
          fi;
         Раб.XML.ЗакрытьТэг;
      fi;
--     Сведения о посреднике (комиссионере, агенте, экспедиторе, застройщике)   СвПос    С    Н    Типовой элемент <СвУчСдТип>.
     Раб.XML.ЗакрытьТэг;
    od;
    Раб.XML.ЗакрытьТэг;
   Раб.XML.ЗакрытьТэг;
  Раб.XML.ЗакрытьТэг;

end;

Proc Button2_OnClick(Sender: String);
var path:S;
 Раб.XML.Очистить;
 path = XMLId+".xml";
 if ChooseFile(path, "Выберите файл") = cmOk:
   СформироватьXML;
   Раб.XML.ЗаписьФайла(path,'');
 fi;
end;


КОНЕЦ