БЛАНКСШАБЛОНОМ "Книга продаж 2014",
Редактор КнигаПрод;
Uses Раб.Бюджет2005,
     Раб.Вспом.Печать2,
     Раб.Документы,
     Раб.Период;
--РПО
--Замена картотеке
var СтрУпр:I;
var  КлючК[]     :String;
var  КодК[]        :String; --Код вида операции
var  D0К[]        :DATE; --дата счета фактуры
var  ДНП0К[]      :STRING; --номер
var  ДНП0ИК[]     :STRING; --номер/дата изменения
var  ДНП0КорК[]   :STRING; --номер/дата корр.
var  ДНП0КИК[]    :STRING; --номер/дата изменения корр.

var  D2К[]        :DATE; --дата оплаты счета фактуры
var  D8К[]        :N; --сумма счета
var  РЕКВПК[]     :record; --ЮРЛИЦО; --Реквизиты контрагента
var  ПОКУПК[]      :STRING; --Название контрагента
var  ТИПСТРК[]   :Integer;
var  STO1К[]      :N; --сумма НДС 20%
var  STO18К[]     :N; --сумма НДС 18%
var  STO2К[]      :N; --сумма НДС 10%
var  SUM1К[]      :N; --сумма НДС 20%
var  SUM18К[]     :N; --сумма НДС 18%
var  SUM2К[]      :N; --сумма НДС 10%
var  STO3К[]      :N; --сумма по ставке 0 процентов
var  SUM3К[]      :N; --сумма при ставке НДС 0%
var  КОММЕНТК[]   :STRING; --комментарий к уменьшаемым суммам
var  СЧЕТК[]   :STRING; --Корреспондирующий счет
var  АНПОКК[] :STRING; --Аналитика
var  АВАНСК[]     :L; --Авансовая с.ф.

var D0_[] :String;

СчетДляПроводок:String='';
СчетДляПроводокАванс:String='';

кнСФ:String='';

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

ИМЯИЗПОДРАЗДЕЛЕНИЯ_:L;
БезПодразделений_:L;

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

ВСум[]:Numeric=if(КНПро[$].Аванс,0,КнПро[$].У-КнПро[$].Сто1-КнПро[$].Сто18-КнПро[$].Сум1-КнПро[$].Сум18-КнПро[$].Сто2-КнПро[$].Сум2-КнПро[$].Сум3);
У_[]:Numeric=КНПро[$].У;
Сум18_[]:Numeric=КНПро[$].Сум18;
Сум2_[]:Numeric=КНПро[$].Сум2;
Сум3_[]:Numeric=КНПро[$].Сум3;
Сто1_[]:Numeric=КНПро[$].Сто1;
Сум1_[]:Numeric=КНПро[$].Сум1;

ВСумВх:Numeric=Днп8Вх-Сто1Вх-Ст18Вх-Сум1Вх-Сум18Вх-Ст2Вх-Сум2Вх-Сум3Вх;
ВСумо:Numeric=СуммаМассива(ВСум,КнПро)+ВСумВх;

Днп8о :Numeric = СуммаМассива(КнПро[].У,КнПро)   +Днп8Вх;
Сто1о :Numeric = СуммаМассива(КнПро[].Сто1,КнПро)+Сто1Вх;
Сто18о:Numeric = СуммаМассива(КНПро[].Сто18,КнПро)+Сто18Вх;
Сум1о :Numeric = СуммаМассива(КнПро[].Сум1,КнПро)+Сум1Вх;
Сум18о:Numeric = СуммаМассива(КнПро[].Сум18,КнПро)+Сум18Вх;
Сто2о :Numeric = СуммаМассива(КНПро[].Сто2,КнПро)+Сто2Вх;
Сум2о :Numeric = СуммаМассива(КнПро[].Сум2,КнПро)+Сум2Вх;
Сум3о :Numeric = СуммаМассива(КнПро[].Сум3,КнПро)+Сум3Вх;
Capa[]:N=if($=1:Днп8о|$=2:Сто18о|$=3:Сум18о|$=4:Сто2о|$=5:Сум2о|$=6:Сум3о|$=7:Сто1о|$=8:Сум1о|$=9:ВСумо|
            $=10:Днп8Вх|$=11:Сто18Вх|$=12:Сум18Вх|$=13:Сто2Вх|$=14:Сум2Вх|$=15:Сум3Вх|$=16:Сто1Вх|$=17:Сум1Вх|$=18:ВСумВх);

var Add:S=if(Проводить,"","+");
var Del:S=if(Проводить,"","-");
Оплата:Logical=False; -- Формировать по оплате
кнЗаполнение:Object;
флСортПоОплате:Object;
флДопЛист:Object;

--ТекстПредыдущимСумм:String=if(ДополнительныйЛист,'Итого','Перенесено с предыдущего листа');
--ШапкаПродажаЗаПериод:Integer=if(ДополнительныйЛист,0,1);
--ШапкаКнигаПродаж:Integer=if(ДополнительныйЛист,0,1);
--ШапкаДОПКнигаПродаж:Integer=if(ДополнительныйЛист,1,0);
--ШапкаДоп:Integer=if(ДополнительныйЛист,1,0);

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


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

var D8ДИзм    :Numeric;
var Сто1ДИзм  :Numeric;
var Сто18ДИзм :Numeric;
var Сум1ДИзм  :Numeric;
var Сум18ДИзм :Numeric;
var Сто2ДИзм  :Numeric;
var Сум2ДИзм  :Numeric;
var Сум3ДИзм  :Numeric;

--ПокупТекст:Logical;
var Page:I=Nстр;
ПП[]:Integer=$;
var ИНН_[]:S = КНПро[$].РеквП.ИНН + if(КНПро[$].РеквП.КПП<>'',' / ' + КНПро[$].РеквП.КПП,'');
var Покуп_[]:S=КНПро[$].РеквП.полнИмя;
S1:Section;
S1a:Section;
S2:Section;
S3:Section;
S4:Section;
S5:Section;
S6:Section;
S7:Section;
Шапка:Section; -- шапка таблицы
SНеПервый2:Section; -- шапка таблицы
SНеПервый_:Section; -- шапка таблицы
var Сек[]: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;

Позиции:Section; -- позиции с с.ф.
SIt:Section;
SSub:Section;
SSub1:Section;
SSub2:Section;

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

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

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,"У_@БезНДС18@Сум18_@БезНДС10@Сум2_@Сум3_@Сто1_@Сум1_@ВСум@У_@БезНДС18@Сум18_@БезНДС10@Сум2_@Сум3_@Сто1_@Сум1_@ВСум");
  ^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 Отмена(Об:String);
  EditorCancel;
  Close;
end;

proc Ok(Об:String);
  EditorApply;
  Close;
end;

НеПервый:Logical = Днп8Вх<>0 or Сто18Вх<>0 or Сум18Вх <>0 or Сто2Вх <>0 or Сум2Вх<>0 or Сум3Вх<>0 or Сто1Вх<>0 or Сум1Вх <>0 or ДополнительныйЛист;

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

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

Func TMSEL(Об:String;Итер:Integer):Logical;
Var TmRec:Record;
  If КнПро = 0 : ВставитьРамку(КнПро,КнПро+1); Fi;
--  if not ПокупТекст:
    if КартФильтр:
       TmRec=Раб.Документы.ВыборСФильтром('КонтрАгент','КорИмя','');
     else
       TmRec=ОткрытьКартотеку("КонтрАгент","");
    fi;
     if TmRec<>nil:
         КнПро[Итер].покуп=GetCardFieldS("КонтрАгент",TmRec,'КорИмя');
         КнПро[Итер].ИНН=GetCardFieldS("КонтрАгент",TmRec,"ИНН") + " / " +GetCardFieldS("КонтрАгент",TmRec,"КПП");
         --КнПро[Итер].КПП=GetCardFieldS("КонтрАгент",TmRec,"КПП");
         КнПро[Итер].АнПок=CARDFILERECSIGN('КОНТРАГЕНТ','ПРИЗНАК','К',TmRec);
         КнПро[Итер].РеквП=TmRec;
     fi;
    ^False;
--   else ^True;
--  fi;
  КнПро[Итер].ТипСтр=3;
end; -- TMSEL


var НомерЗаписи:Integer; -- Номер последней записи
var НомерСтр   :Integer; -- Номер текущей страницы
var НомерЗСтр  :Integer; -- Номер записи страницы
var КолСтр     :Integer; -- Количество страниц
var уз   :Numeric;      --
var Сто1з:Numeric;      -- -
var Сто18з:Numeric;      -- -
var Сто2з:Numeric;      -- - - Подсчитанные итоги
var Ст18з:Numeric;
var Ст2з :Numeric;
var Сум1з:Numeric;      -- -
var Сум18з:Numeric;      -- -
var Сум2з:Numeric;      --
var Сум3з:Numeric;      --
var RSub :Integer;      -- Текущая рабочая область подтаблицы

-- Пересчитывает валютную сумму в рублевую по курсу на дату
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 ВСтр(Дата:Date;Номер:String;НомерИ:String;НомерКор:String;НомерКИ:String;Покуп:String;АНПОК:String;
          Реквп:Record;Датах:DATE;У:Numeric;STO1:Numeric;STO18:Numeric;STO2:Numeric;SUM1:Numeric;SUM18:Numeric;
          SUM2:Numeric;SUM3:Numeric;Счет:String;КОММЕНТ:String;Аванс:Logical;ТИПСТР:Integer; КодОп:String);
var Зап:Integer;
var Ключ_:String;
  if РеквП<>nil:
     Ключ_=RecordToString(РеквП)+DateToString(Дата)+Номер+"###"+НомерКор+"#"+КодОп;
    else
     Ключ_=ПОКУП+DateToString(Дата)+Номер+"###"+НомерКор+"#"+КодОп;
  fi;
  Зап=SearchInArray(КлючК,Ключ_);
  if Зап=-1:
     InsertFrame(СтрУпр,if(СтрУпр=0,1,СтрУпр+1));
     Зап=стрУпр;
     КлючК[Зап]=Ключ_;
     D8К[Зап]=У;
     STO1К[Зап]=STO1;
     STO18К[Зап]=STO18;
     STO2К[Зап]=STO2;
     SUM1К[Зап]=SUM1;
     SUM18К[Зап]=SUM18;
     SUM2К[Зап]=SUM2;
     SUM3К[Зап]=SUM3;
  else
     D8К[Зап]=D8К[Зап]+У;
     STO1К[Зап]=STO1К[Зап]+STO1;
     STO18К[Зап]=STO18К[Зап]+STO18;
     STO2К[Зап]=STO2К[Зап]+STO2;
     SUM1К[Зап]=SUM1К[Зап]+SUM1;
     SUM18К[Зап]=SUM18К[Зап]+SUM18;
     SUM2К[Зап]=SUM2К[Зап]+SUM2;
     SUM3К[Зап]=SUM3К[Зап]+SUM3;
  fi;
  --Эти элементы должны либо совпадать, либо браться по последнему
  РеквПК[Зап]=РеквП;
  КодК[Зап]=КодОп;
  D0К[Зап]=Дата;
  D2К[Зап]=ДатаХ;
  ДНП0К[Зап]=Номер;
  ДНП0ИК[Зап]=НомерИ;
  ДНП0КорК[Зап]=НомерКор;
  ДНП0КИК[Зап]=НомерКИ;
  ПОКУПК[Зап]=ПОКУП;
  АНПОКК[Зап]=АНПОК;
  КомментК[Зап]=Коммент;
  СчетК[Зап]=Счет;
  АвансК[Зап]=Аванс;
  ТИПСТРК[Зап]=ТИПСТР;
  --Если полная сумма равна нулю - удаляем
  if D8К[Зап]+STO1К[Зап]+STO18К[Зап]+STO2К[Зап]+SUM1К[Зап]+SUM18К[Зап]+SUM2К[Зап]+SUM3К[Зап]=0:
     DeleteFrame(СтрУпр,Зап);
  fi;
End;

-- Переносит итоги из предыдущих периодов книги продаж
Proc ПодсчетДляНовойСтраницы(НомСтр:Integer);
var Rob,RSubOb,i,КолЗап:Integer;
  D8ВхПер=0;
  Sto1ВхПер=0;
  Sto18ВхПер=0;
  Sum1ВхПер=0;
  Sum18ВхПер=0;
  Sto2ВхПер=0;
  Sum2ВхПер=0;
  Sum3ВхПер=0;
--  Днп8Вх=0;Сто18Вх=0;Сум18Вх=0;Сто2Вх=0;Сум2Вх=0;Сум3Вх=0;Сто1Вх=0;Сум1Вх=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,      "У");
      Sto1ВхПер=Sto1ВхПер+GetFieldN(RSubOb,i,  "Сто1");
      Sto18ВхПер=Sto18ВхПер+GetFieldN(RSubOb,i,"Сто18");
      Sum1ВхПер=Sum1ВхПер+GetFieldN(RSubOb,i,  "Сум1");
      Sum18ВхПер=Sum18ВхПер+GetFieldN(RSubOb,i,"Сум18");
      Sto2ВхПер=Sto2ВхПер+GetFieldN(RSubOb,i,  "Сто2");
      Sum2ВхПер=Sum2ВхПер+GetFieldN(RSubOb,i,  "Сум2");
      Sum3ВхПер=Sum3ВхПер+GetFieldN(RSubOb,i,  "Сум3");
     od;
      D8ВхПер=D8ВхПер+GetFieldN(ROb,1,      "Днп8Вх");
      Sto1ВхПер=Sto1ВхПер+GetFieldN(ROb,1,  "Сто1Вх");
      Sto18ВхПер=Sto18ВхПер+GetFieldN(ROb,1,"Сто18Вх");
      Sum1ВхПер=Sum1ВхПер+GetFieldN(ROb,1,  "Сум1Вх");
      Sum18ВхПер=Sum1ВхПер+GetFieldN(ROb,1, "Сум18Вх");
      Sto2ВхПер=Sto2ВхПер+GetFieldN(ROb,1,  "Сто2Вх");
      Sum2ВхПер=Sum2ВхПер+GetFieldN(ROb,1,  "Сум2Вх");
      Sum3ВхПер=Sum3ВхПер+GetFieldN(ROb,1,  "Сум3Вх");
   Finally
    CloseWorkArea(RSubOb);
   End;
  Finally
   CloseWorkArea(Rob);
  End;
End;


Proc Поисквкниге;
var OWA,OA,n1,nn1,n2,nn2:I;
  --Выгребаем из книг
  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);
        if nn2<>0 then ДополнительныйЛист=True; fi;
        for n2=1 to nn2 do
            ВСтр(GetFieldD(OA,n2,"Дата"),GetFieldS(OA,n2,"Номер"),GetFieldS(OA,n2,"ДНП0И"),GetFieldS(OA,n2,"ДНП0КОР"),GetFieldS(OA,n2,"ДНП0КИ"),
                GetFieldS(OA,n2,"Покуп"),GetFieldS(OA,n2,"АнПок"),GetFieldR(OA,n2,"РеквП"),GetFieldD(OA,n2,"ДатаХ"),
                -1*GetFieldN(OA,n2,"У"),-1*GetFieldN(OA,n2,"СТО1"),-1*GetFieldN(OA,n2,"СТО18"),-1*GetFieldN(OA,n2,"СТО2"),
                -1*GetFieldN(OA,n2,"СУМ1"),-1*GetFieldN(OA,n2,"СУМ18"),-1*GetFieldN(OA,n2,"СУМ2"),-1*GetFieldN(OA,n2,"СУМ3"),
                GetFieldS(OA,n2,"СЧЕТ"), GetFieldS(OA,n2,"Коммент"),GetFieldL(OA,n2,"Аванс"),GetFieldI(OA,n2,"ТИПСТР"), GetFieldS(OA,n2,"КодОп"));

        od;
      finally
        CloseWorkarea(OA);
      end;
      if n1=nn1 then
         NСТР=getfieldI(OWA,n1,"NСТР")+getfieldI(OWA,n1,"NСТРаниц");
         ПодсчетДляНовойСтраницы(NСТР-1);
         Днп8Вх=D8ВхПер;
         Сто1Вх=Sto1ВхПер;
         Сто18Вх=Sto18ВхПер;
         Сум1Вх=Sum1ВхПер;
         Сум18Вх=Sum18ВхПер;
         Сто2Вх=Sto2ВхПер;
         Сум2Вх=Sum2ВхПер;
         Сум3Вх=Sum3ВхПер;
      fi;

    od;
  finally
    CloseWorkArea(OWA);
  end;
end;


var СФPrefix:S="";--"01/";

-- Формирует по отгрузке в вспомогательную картотеку (за место процедуры СформироватьПоОтгрузке)
proc СформироватьПоОтгрузкеВКартотеку;
var Robl:Integer;
var Аванс,НДС0:Logical;
var СФКор:L;
var У,Сто1,Сто18,Сум1,Сум18,Сто2,Сум2,Сум3:Numeric;
var ПокупП,ИННП,КППП,НомерП,НомерПИ,НомерПКор,НомерПИК,Аналит:String;
var ДатаП,ДатаХП:Date;
var tmps:String;
var ВалСФ:String; -- Валюта с.ф.
var СчетСФ:String;-- счет из счет-фактуры
var КолСФ,i:Integer;
var Фильтр:String;
var КодОп_: String;
var OA:I;
var j,jj:I;
var Tmp1,Tmp2,Tmp3,Tmp4,Tmp5,Tmp6,Tmp7:Numeric;

  hint('Поиск с.ф. по отгрузке.');
  Фильтр="Проводить and Дата>="2+0DateToString(ДатаН)+" and  Дата<"2+0DateToString(ДатаКФильтр)
         +if(ФильтрАналитики<>""," and Pos('"+ФильтрАналитики+"',ДопАналит)>0","")
         +if(НАШЕПОДРАЗД<>nil,' and НАШЕПОДРАЗД='+RecordToString(НашеПодразд),if(БезПодразделений_,' and НАШЕПОДРАЗД=nil',''));

  Robl=OpenWorkArea("СЧЕТФАКТ","Дата;Номер",Фильтр);
  Try
    КолСФ=Records(Robl);
    for i=1..КолСФ do
      ДатаП =GetFieldD(Robl,i,'Дата');
      tmps=GetFieldS(Robl,i,'АнКод');
      Аналит=GetFieldS(Robl,i,'Аналит')+if(tmps<>'':' СФН.'+tmps,'')+' '+GetFieldS(Robl,i,'ДопАналит');
      НомерП=СФPrefix + GetFieldS(Robl,i,'НомерБум');
      НомерПИ=GetFieldS(Robl,i,'НОМЕРИСПР');
      НомерПКор=GetFieldS(Robl,i,'НОМЕРБУМК');
      НомерПИК=GetFieldS(Robl,i,'НОМЕРИСПРК');
      СФКор=НомерПКор<>"";
      ДатаХП=GetFieldD(Robl,i,'ДатаХ');
      ПокупП=GetFieldS(Robl,i,'Покуп');
      ИННП  =GetFieldS(Robl,i,'ИНН');
      КППП  =GetFieldS(Robl,i,'КПП');
      НДС0  =GetFieldL(Robl,i,'НДС0');
      СчетСФ=GetFieldS(Robl,i,'Счет');
      Аванс =GetFieldL(Robl,i,'Аванс');
      ВалСФ =GetFieldS(Robl,i,'Валюта');
      if Аванс:
         КодОп_ = "02";
        |ИННП="":
         КодОп_ = "26";  --Расчеты с физ.лицами
        else
         КодОп_ = "01";
      fi;
      У     =ПересчетВРуб(GetFieldN(Robl,i,'ВсегоДок'),ВалСФ,ДатаП);
      СТО1  =ПересчетВРуб(GetFieldN(Robl,i,'Сто1'),ВалСФ,ДатаП);
      СТО18 =ПересчетВРуб(GetFieldN(Robl,i,'Сум18'),ВалСФ,ДатаП);
      Сум1  =ПересчетВРуб(GetFieldN(Robl,i,'Сум1'),ВалСФ,ДатаП);
      Сум18 =ПересчетВРуб(GetFieldN(Robl,i,'Сто18'),ВалСФ,ДатаП);
      Сто2  =ПересчетВРуб(GetFieldN(Robl,i,'Сум2'),ВалСФ,ДатаП);
      Сум2  =ПересчетВРуб(GetFieldN(Robl,i,'Сто2'),ВалСФ,ДатаП);
      Сум3  =if(GetFieldL(Robl,i,'НДС0'),У-(СТО1+Сум1+Сто2+Сум2),0);
      ВСтр(ДатаП,НомерП,НомерПИ,НомерПКор,НомерПИК,ПокупП,Аналит,GetFieldR(Robl,i,'РЕКВП'),ДатаХП,
           У,СТО1,СТО18,СТО2,СУМ1,СУМ18,СУМ2,СУМ3,
           if(Аванс,if(счетсф='',СчетДляПроводокАванс,СчетСФ),if(СчетСФ='',СчетДляПроводок,СчетСФ)),
           '',GetFieldL(Robl,i,'Аванс'),if(Аванс,1,3), КодОп_);

      if СФКор:
         OA=OpenArray(Robl,i,"КолНаим","");
         try
            Tmp1=0;
            Tmp2=0;
            Tmp3=0;
            Tmp4=0;
            Tmp5=0;
            Tmp6=0;
            Tmp7=0;
            jj=Records(OA);
            For j=1..jj Do
              Tmp1=Tmp1+GetFieldN(OA,j,"ВсегоДО");
              if Round(GetFieldN(OA,j,"НДС")) = 18:
                 Tmp6    =Tmp6+GetFieldN(OA,j,"СуммаНДСДО");
                 Tmp7    =Tmp7+if(not GetFieldL(Robl,i,'Аванс'),GetFieldN(OA,j,"СуммаДО"),GetFieldN(OA,j,"ВсегоДО")-GetFieldN(OA,j,"СуммаНДСДО"));
              |Round(GetFieldN(OA,j,"НДСДО")) <> 10 and  GetFieldN(OA,j,"НДСДО") <> 0 and GetFieldN(OA,j,"НДСДО") <> 9.09:
                Tmp2    =Tmp2+GetFieldN(OA,j,"СуммаНДСДО");
                Tmp4    =Tmp4+if(not GetFieldL(Robl,i,'Аванс'),GetFieldN(OA,j,"СуммаДО"),GetFieldN(OA,j,"ВсегоДО")-GetFieldN(OA,j,"СуммаНДСДО"));
              |Round(GetFieldN(OA,j,"НДСДО")) = 10 or GetFieldN(OA,j,"НДСДО") = 9.09:
                Tmp3    =Tmp3+GetFieldN(OA,j,"СуммаНДСДО");
                Tmp5    =Tmp5+if(not GetFieldL(Robl,i,'Аванс'),GetFieldN(OA,j,"СуммаДО"),GetFieldN(OA,j,"ВсегоДО")-GetFieldN(OA,j,"СуммаНДСДО"));
              Fi;
            Od;
            У  =ПересчетВРуб(Tmp1,ВалСФ,ДатаП);
            СТО1  =ПересчетВРуб(Tmp2,ВалСФ,ДатаП);
            СТО18 =ПересчетВРуб(Tmp7,ВалСФ,ДатаП);
            Сум1  =ПересчетВРуб(Tmp4,ВалСФ,ДатаП);
            Сум18 =ПересчетВРуб(Tmp6,ВалСФ,ДатаП);
            Сто2  =ПересчетВРуб(Tmp3,ВалСФ,ДатаП);
            Сум2  =ПересчетВРуб(Tmp5,ВалСФ,ДатаП);
            Сум3  =if(GetFieldL(Robl,i,'НДС0'),У-(СТО1+Сум1+Сто2+Сум2),0);
            ВСтр(ДатаП,НомерП,НомерПИ,"","",ПокупП,Аналит,GetFieldR(Robl,i,'РЕКВП'),ДатаХП,
                 -1*У,-1*СТО1,-1*СТО18,-1*СТО2,-1*СУМ1,-1*СУМ18,-1*СУМ2,-1*СУМ3,
                 if(Аванс,if(счетсф='',СчетДляПроводокАванс,СчетСФ),if(СчетСФ='',СчетДляПроводок,СчетСФ)),
                 '',GetFieldL(Robl,i,'Аванс'),if(Аванс,1,3), КодОп_);
         finally
           CloseWorkArea(OA);
         end;
      fi;

    end;
   hint('Сохранение найденных с.ф.');
  Finally
    CloseWorkArea(Robl);
  End;
end;

Proc ФормированиеСтраниц; -- Формирует страницы книги
var Robl,i,Koll:Integer;
var Сортировать:String;
  koll=1;
  уз=0;
  Сто1з=0;
  Сто18з=0;
  Сто2з=0;
  Ст18з=0;
  Ст2з=0;
  Сум1з=0;
  Сум18з=0;
  Сум2з=0;
  Сум3з=0;
  колстр=0;
  НомерСтр=NСтр;
  Сортировать="Дата;Номер";
  hint('Формирование страниц книги продаж');
  Robl=OpenWorkArea('КнигаПрод','nстр','');
  Try
    BeginChanging(Robl);
    Try
      for i=1 .. СтрУпр do
        ВставитьРамку(КнПро,КнПро+1);
        D0_[i]=ДНП0К[i] + " от " + DateToString(D0К[i]);
        КнПро[КнПро].КодОп=КодК[i];
        КнПро[КнПро].Дата=D0К[i];
        КнПро[КнПро].ДНП0И=ДНП0ИК[i];
        КнПро[КнПро].ДНП0Кор=ДНП0КорК[i];
        КнПро[КнПро].ДНП0КИ=ДНП0КИК[i];
        КнПро[КнПро].АнПок=АнПокК[i];
        КнПро[КнПро].ДатаХ=D2К[i];
        КнПро[КнПро].Покуп=ПОКУПК[i];
        КнПро[КнПро].РеквП=РеквПК[i];
        КнПро[КнПро].Номер=ДНП0К[i];
        КнПро[Кнпро].Аванс=АвансК[i];
        КнПро[КнПро].у=if(КнПро[КнПро].Аванс,0,D8К[i]);
        КнПро[КнПро].Сто1=STO1К[i];
        КнПро[КнПро].Сто18=if(КнПро[КнПро].Аванс,0,STO18К[i]);
        КнПро[КнПро].Сто2=if(КнПро[КнПро].Аванс,0,STO2К[i]);
        КнПро[КнПро].Сум1=SUM1К[i];
        КнПро[КнПро].Сум18=SUM18К[i];
        КнПро[КнПро].Сум2=SUM2К[i];
        КнПро[КнПро].Сум3=SUM3К[i];
        КнПро[Кнпро].Коммент=КомментК[i];
        КнПро[Кнпро].Счет=СчетК[i];
        КнПро[КнПро].ТипСтр=ТИПСТРК[i];
        уз=уз+if(КнПро[КнПро].Аванс,0,D8К[i]);--+D8К[i];
        Сто1з=Сто1з+STO1К[i];
        Сто18з=Сто18з+if(КнПро[КнПро].Аванс,0,STO18К[i]);
        Сто2з=Сто2з+if(КнПро[КнПро].Аванс,0,STO2К[i]);
        Ст18з=Ст18з+STO18К[i];
        Ст2з=Ст2з+STO2К[i];
        Сум1з=Сум1з+SUM1К[i];
        Сум18з=Сум18з+SUM18К[i];
        Сум2з=Сум2з+SUM2К[i];
        Сум3з=Сум3з+SUM3К[i];
      end;
      EndChanging(Robl);
    Except
      CancelChanging(Robl);
      raise;
    End;
  Finally
    CloseWorkArea(Robl);
  End;
End;

Proc УдалениеВспСтрок;
  ClearVariable(СтрУпр);
  ClearVariable(КодК);
  ClearVariable(КлючК);
  ClearVariable(D0К);
  ClearVariable(ДНП0К);
  ClearVariable(ДНП0ИК);
  ClearVariable(ДНП0КорК);
  ClearVariable(ДНП0КИК);
  ClearVariable(D2К);
  ClearVariable(D8К);
  ClearVariable(РЕКВПК);
  ClearVariable(ПОКУПК);
  ClearVariable(ТИПСТРК);
  ClearVariable(STO1К);
  ClearVariable(STO18К);
  ClearVariable(STO2К);
  ClearVariable(SUM1К);
  ClearVariable(SUM18К);
  ClearVariable(SUM2К);
  ClearVariable(STO3К);
  ClearVariable(SUM3К);
  ClearVariable(КОММЕНТК);
  ClearVariable(СЧЕТК);
  ClearVariable(АНПОКК);
  ClearVariable(АВАНСК);
End;

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

func ПриПроверке:Logical;
var i:Integer;
  if Проводить:
    for i=1..КНПро do
      if КНПро[i].Счет<>"":
        if Not ValidSign(КНПро[i].Счет):
          Message("Ошибка в написании счета дебета.");
          ШАБЛОН.поле="Счет";
          шаблон.строка=If(ДополнительныйЛист,15,12+If(Непервый,1,0))+i;
          ^false;
        fi;
      fi;
    end;
  end;
  ^true;
end;

proc ВыводКнЗнаполнение;
  if НеПервый or ДополнительныйЛист:
    кнЗаполнение.Enabled=false;
  else кнЗаполнение.Enabled=true;
  fi;
end;

proc ДопЛист_ПриИзменении(Флаг:String);
  ВыводКнЗнаполнение;
  Оформление;
end;

proc ПриСчитывании;
   --Поиск контрагентов!!!
  If Nстр = 0:
      ДатаОформления=today;
      ДопЛист_ПриИзменении('');
      Nстр=1;
      Рекв=РАБ.Бюджет2005.НашРекв;
      while КнПро<10 do
           ВставитьРамку(КнПро,КнПро+1);
           КнПро[КнПро].ТипСтр=3;
      end;
   | True :
      If Рекв = Nil :
        Рекв=РАБ.Бюджет2005.НашРекв;
      Fi;
   Fi;
   ВыводКнЗнаполнение;
  if CurrentState=crdusInserted:
     Пост735 = True;
  fi;

   if not FlagInit: Оформление; fi;
end;

proc ВыборАналитики_ПриНажатии(Кнопка:String);
var tmp:String;
  tmp=AnaElection("*");
  if tmp<>'':
    ФильтрАналитики=tmp;
  fi;
end;

proc ПриОткрытии(Создать:Logical);
var i:I;
  FlagInit=True;

  Раб.Настр_Печать.Cfg("","Документы.счета.кнпро.cfg");
  for i=1..КНпро do
    --D0_[i]=DateToString(КНПро[i].Дата)+" N "+КНПро[i].Номер;
    D0_[i]=КНПро[i].Номер + " от " + DateToString(КНПро[i].Дата);
  od;

end;

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



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


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


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

end;


Func Add_OnEnter(FieldName: String; Iter: Integer): logical;
  if Проводить:  Return  False; fi;
  InsertFrame(КНПро,Iter+1);
  Return  False;
end;


Func Del_OnEnter(FieldName: String; Iter: Integer): logical;
  if Проводить:  Return  False; fi;
  DeleteFrame(КнПро,Iter);
  Return False ;
end;


Proc CheckBox2_OnChange(Sender: String);
  EditorApply;
  Оформление;
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].Номер=D0_[Iter];
    else
     КнПРо[Iter].Дата=tmpD;
     КнПРо[Iter].Номер=tmp2;
  fi;
  D0_[Iter]=КНПро[iter].Номер + " от " + DateToString(КНПро[iter].Дата);
end;

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

Func XMLId:S;
var tmp:S;
  --R_Т_A_K_О_GGGGMMDD_N, где:
  --R_Т - префикс;
  tmp = "NO_NDS.9";
  --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.9"+"_"+"0000_0000"+"_"+Рекв.ИНН+Рекв.КПП+"_" + Str(Year(Today))+Str(Mon(Today))+Str(Day(Today))+"_"+"1";

--end;

Proc СформироватьXML;
var i:I;
  Раб.XML.ДобАттр("ИдФайл",XMLId);
  Раб.XML.ДобАттр("ВерсПрог","6.9");
  Раб.XML.ДобАттр("ВерсФорм","5.04");
  Раб.XML.ОТКРЫТЬТЭГBuf("Файл",False);
   Раб.XML.ДобАттр("Индекс","0000090");
   Раб.XML.ДобАттр("НомКорр","0");
   Раб.XML.ОТКРЫТЬТЭГBuf("Документ",False);
    --Раб.XML.ОТКРЫТЬТЭГBuf("КнигаПрод",False);

    Раб.XML.ДобАттрNChk("СтПродБезНДС18",Сто18о,2);
    Раб.XML.ДобАттрNChk("СтПродБезНДС10",Сто2о,2);
    Раб.XML.ДобАттрNChk("СтПродБезНДС0",Сум3о,2);
    Раб.XML.ДобАттрNChk("СумНДСВсКПр18",Сум18о,2);
    Раб.XML.ДобАттрNChk("СумНДСВсКПр10",Сум2о,2);
    Раб.XML.ДобАттрNChk("СтПродОсвВсКПр",ВСумо,2);

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

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


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

Func Пер_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var sig: S;
  Template.HideEditor(False);
  sig = AnaElection("ПЕРИОД.*");
  if sig = "": return ""; fi;
  ДатаН = РАБ.Период.ДАТАНПЕРИОДА(sig);
  ДатаК = РАБ.Период.ДАТАКПЕРИОДА(sig);
  Return Name_A(sig);
end;


КОНЕЦ