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

var selfBln:S="ДОКУМЕНТЫ.СЧЕТА.КНПОК";
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; -- В авансовых с.ф. вместо имени продавца имя нашего предприятия
НеСторнировать     :Logical; -- Не сторнировать авансы при расчете книги покупок
Пост914:Logical; --=[true]; -- Учитывать оплаты
-- Из бланка Сервис Конец


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;
D3S[]     :String;
Страна[]  :String;
БезНДС18[]:Numeric;
БезНДС10[]:Numeric;

BSum[]:Numeric=Окр(КнПок[$].D8-КнПок[$].Sto1-КнПок[$].Sto18-КнПок[$].Sto2-КнПок[$].Sum1-КнПок[$].Sum18-КнПок[$].Sum2-КнПок[$].Sum3,2);
BSumВх:Numeric=Окр(D8Вх-Sto1Вх-St18Вх-St2Вх-Sum1Вх-Sum18Вх-Sum2Вх-Sum3Вх,2);
D8_[]:N=КнПок[$].D8;
Sum18_[]:N=КнПок[$].Sum18; 
Sum2_[]:N=КнПок[$].Sum2;
Sum3_[]:N=КнПок[$].Sum3;
Sto1_[]:N=КнПок[$].Sto1;
Sum1_[]:N=КнПок[$].Sum1;

D8o   :Numeric = Окр(СуммаМассива(КнПок[].D8,КнПок)  +D8Вх,2);
Sto18o:Numeric = Окр(if(Пост451,СуммаМассива(БезНДС18,КнПок),СуммаМассива(КнПок[].Sto18,КнПок))+Sto18Вх,2);
Sum18o:Numeric = Окр(СуммаМассива(КнПок[].Sum18,КнПок)+Sum18Вх,2);
Sto2o :Numeric = Окр(if(Пост451,СуммаМассива(БезНДС10,КнПок),СуммаМассива(КнПок[].Sto2,КнПок))+Sto2Вх,2);
Sum2o :Numeric = Окр(СуммаМассива(КнПок[].Sum2,КнПок)+Sum2Вх,2);
Sum3o :Numeric = Окр(СуммаМассива(КнПок[].Sum3,КнПок)+Sum3Вх,2);
Sto1o :Numeric = Окр(СуммаМассива(КнПок[].Sto1,КнПок)+Sto1Вх,2);
Sum1o :Numeric = Окр(СуммаМассива(КнПок[].Sum1,КнПок)+Sum1Вх,2);
BSumo :Numeric = Окр(СуммаМассива(BSum,КнПок) +BSumВх,2);

--Перенапраление для корректной работы аккумуляторов
Capa[]:N=if($=1:D8o|$=2:Sto18o|$=3:Sum18o|$=4:Sto2o|$=5:Sum2o|$=6:Sum3o|$=7:Sto1o|$=8:Sum1o|$=9:BSumo|
            $=10:D8Вх|$=11:St18Вх|$=12:Sum18Вх|$=13:St2Вх|$=14:Sum2Вх|$=15:Sum3Вх|$=16:Sto1Вх|$=17:Sum1Вх|$=18:BSumВх);

ШапкаКнигаПокупок: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  D2К[]        :DATE; --дата оплаты счета фактуры
var  D3К[]        :DATE; --дата оприход. по счету фактуры
var  D8К[]        :N; --сумма счета
var  РЕКВПК[]     :record; --ЮРЛИЦО; --Реквизиты контрагента
var  ПОСТК[]      :STRING; --Название контрагента
var  ИННК[]       :STRING; --ИНН контрагента
var  КППК[]       :STRING; --КПП контрагента
var  СТР_ГТДК[]   :STRING; --Страна происхождения и номер ГТД
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; --Авансовая с.ф.


-- Это нужно, что бы при указании даты первого дня месяца считалось по этот день не включительно, а
-- при указании последнего дня месяца считалось включительно. Нужно только для отбора с.ф.
ДатаКФильтр:Date=if(Mon(ДатаК+1)<>Mon(ДатаК),ДатаК+1,ДатаК);
--------
var D8ДИзм:Numeric;
var Sto1ДИзм:Numeric;
var Sto18ДИзм:Numeric;
var Sum1ДИзм:Numeric;
var Sum18ДИзм:Numeric;
var Sto2ДИзм:Numeric;
var Sum2ДИзм:Numeric;
var Sum3ДИзм: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 tmpL:L;
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,"D8_@БезНДС18@Sum18_@БезНДС10@Sum2_@Sum3_@Sto1_@Sum1_@BSum@D8_@БезНДС18@Sum18_@БезНДС10@Sum2_@Sum3_@Sto1_@Sum1_@BSum");
  ^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,l,bgColor: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;
  Sto1ДИзм=КнПок[Итер].Sto1;
  Sto18ДИзм=КнПок[Итер].Sto18;
  Sum1ДИзм=КнПок[Итер].Sum1;
  Sum18ДИзм=КнПок[Итер].Sum18;
  Sto2ДИзм=КнПок[Итер].Sto2;
  Sum2ДИзм=КнПок[Итер].Sum2;
  Sum3ДИзм=КнПок[Итер].Sum3;
 ^True;
End;


Proc ПослеИзменений(Об:String;Итер:Integer);
-- if Not НеПересчитывать:
   if об="D8" :ИзменитьСтраницы(6,D8ДИзм,КнПок[Итер].D8,0,0);
     |об="Sto1":КнПок[Итер].sum1=(20*КнПок[Итер].Sto1)/100;ИзменитьСтраницы(7,Sto1ДИзм,КнПок[Итер].Sto1,Sum1ДИзм,КнПок[Итер].sum1);
     |об="Sto18":КнПок[Итер].sum18=(18*КнПок[Итер].Sto18)/100;ИзменитьСтраницы(9,Sto18ДИзм,КнПок[Итер].Sto18,Sum18ДИзм,КнПок[Итер].sum18);
     |Об="Sto2":КнПок[Итер].sum2=(10*КнПок[Итер].Sto2)/100;ИзменитьСтраницы(8,Sto2ДИзм,КнПок[Итер].Sto2,Sum2ДИзм,КнПок[Итер].sum2);
     |об="Sum1":ИзменитьСтраницы(77,sum1ДИзм,КнПок[Итер].sum1,0,0);
     |об="Sum18":ИзменитьСтраницы(78,sum18ДИзм,КнПок[Итер].sum18,0,0);
     |Об="Sum2":ИзменитьСтраницы(88,sum2ДИзм,КнПок[Итер].sum2,0,0);
     |Об="Sum3":ИзменитьСтраницы(99,sum3ДИзм,КнПок[Итер].sum3,0,0);
   fi;
-- fi;
 if об="Sto1":if КнПок[Итер].КорСчет<" ":КнПок[Итер].КорСчет="";КнПок[Итер].СчетД=СчетПоДебету;fi;
   |об="Sto18":if КнПок[Итер].КорСчет<" ":КнПок[Итер].КорСчет="";КнПок[Итер].СчетД=СчетПоДебету;fi;
   |Об="Sto2":if КнПок[Итер].КорСчет<" ":КнПок[Итер].КорСчет="";КнПок[Итер].СчетД=СчетПоДебету;fi;
   |об="Sum1":if КнПок[Итер].КорСчет<" ":КнПок[Итер].КорСчет="";КнПок[Итер].СчетД=СчетПоДебету;fi;
   |Об="Sum2":if КнПок[Итер].КорСчет<" ":КнПок[Итер].КорСчет="";КнПок[Итер].СчетД=СчетПоДебету;fi;
 fi;
 if Об="БезНДС18":КнПок[Итер].Sto18=БезНДС18[Итер];
   |Об="БезНДС10":КнПок[Итер].Sto2=БезНДС10[Итер];
   |Об="Sto18"   :БезНДС18[Итер]=КнПок[Итер].Sto18;
   |Об="Sto2"    :БезНДС10[Итер]=КнПок[Итер].Sto2;
 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 Sto1Кн[]:Numeric;
var Sto18Кн[]:Numeric;
var Sum1Кн[]:Numeric;
var Sum18Кн[]:Numeric;
var Sto2Кн[]:Numeric;
var Sum2Кн[]:Numeric;
var Sum3Кн[]:Numeric;

Proc Поисквкниге;
var OWA,OA,n1,nn1,n2,nn2,i:I;
Var t,t1:N;
var D8К_:Numeric;
var Sto1К_:Numeric;
var Sto18К_:Numeric;
var Sum1К_:Numeric;
var Sum18К_:Numeric;
var Sto2К_:Numeric;
var Sum2К_:Numeric;
var Sum3К_:Numeric;

  --Очистка буфера книг
  ClearVariable(КонтрКн);
  ClearVariable(ДатСфКн);
  ClearVariable(НомСфКн);
  ClearVariable(КлючКн );
  ClearVariable(D8Кн);
  ClearVariable(Sto1Кн );
  ClearVariable(Sto18Кн);
  ClearVariable(Sum1Кн );
  ClearVariable(Sum18Кн);
  ClearVariable(Sto2Кн );
  ClearVariable(Sum2Кн );
  ClearVariable(Sum3Кн );
  --Заполнение буфера книг
  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"));
          InsertInArray(Sto1Кн ,i,GetFieldN(OA,n2,"Sto1"));
          InsertInArray(Sto18Кн,i,GetFieldN(OA,n2,"Sto18"));
          InsertInArray(Sum1Кн ,i,GetFieldN(OA,n2,"Sum1"));
          InsertInArray(Sum18Кн,i,GetFieldN(OA,n2,"Sum18"));
          InsertInArray(Sto2Кн ,i,GetFieldN(OA,n2,"Sto2"));
          InsertInArray(Sum2Кн ,i,GetFieldN(OA,n2,"Sum2"));
          InsertInArray(Sum3Кн ,i,GetFieldN(OA,n2,"Sum3"));
        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]   ;
           Sto1К_ =Sto1К[i] -Sto1Кн[n1] ;
           Sto18К_=Sto18К[i]-Sto18Кн[n1];
           Sum1К_ =Sum1К[i] -Sum1Кн[n1] ;
           Sum18К_=Sum18К[i]-Sum18Кн[n1];
           Sto2К_ =Sto2К[i] -Sto2Кн[n1] ;
           Sum2К_ =Sum2К[i] -Sum2Кн[n1] ;
           Sum3К_ =Sum3К[i] -Sum3Кн[n1] ;
           if Abs(D8К_)+Abs(Sto1К_)+Abs(Sto18К_)+Abs(Sum1К_)+Abs(Sum18К_)+Abs(Sto2К_)+Abs(Sum2К_)+Abs(Sum3К_)=0 then
               DeleteFrame(СтрУпр,i);
             else
              D8К[i]   =D8К_   ;
              Sto1К[i] =Sto1К_ ;
              Sto18К[i]=Sto18К_;
              Sum1К[i] =Sum1К_ ;
              Sum18К[i]=Sum18К_;
              Sto2К[i] =Sto2К_ ;
              Sum2К[i] =Sum2К_ ;
              Sum3К[i] =Sum3К_ ;
           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 ОтображениеПост451;
   var i, n:Integer;
   n=0;
   For i=1..КнПок do
      if КнПок[i].Аванс then
         n=n+1;

         D3S[i]      = "-";
         Страна[i]   = "-";
         БезНДС18[i] = 0;
         БезНДС10[i] = 0;
      else
        D3S[i]     =DateToString(КнПок[i].D3);
        Страна[i]  =КнПок[i].СТР_ГТД;
        БезНДС18[i]=КнПок[i].Sto18;
        БезНДС10[i]=КнПок[i].Sto2;
      end;
   end;
end;

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

  Fi;
  ОтображениеПост451;
  if not FlagInit: Оформление; fi;
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;STO1:Numeric;STO2:Numeric;STO18:Numeric;SUM1:Numeric;
          SUM2:Numeric;SUM18:Numeric;Sum3: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(РеквПК,Зап,РеквП);
  InsertInArray(ПОСТК,Зап,ПОСТ);
  InsertInArray(ИННК,Зап,ИНН);
  InsertInArray(КППК,Зап,КПП);
  InsertInArray(Стр_ГТДК,Зап,Стр_ГТД);
  InsertInArray(STO1К,Зап,STO1);
  InsertInArray(STO18К,Зап,STO18);
  InsertInArray(STO2К,Зап,STO2);
  InsertInArray(SUM1К,Зап,SUM1);
  InsertInArray(SUM18К,Зап,SUM18);
  InsertInArray(SUM2К,Зап,SUM2);
  InsertInArray(SUM3К,Зап,SUM3);
  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,RSub,i,n,k,m:Integer;
var ВСЕГОПОК,СТО2,СУМ2,СТО28,СУМ28,СТО1,СУМ1,СУМ3:Numeric; -- Общая сумма счета
var ПВСЕГОПОК,ПСТО2,ПСУМ2,ПСТО28,ПСУМ28,ПСТО1,ПСУМ1,ПСУМ3:Numeric;
var КВСЕГОПОК,КСТО2,КСУМ2,КСТО28,КСУМ28,КСТО1,КСУМ1,КСУМ3:Numeric;
var НВСЕГОПОК,НСТО2,НСУМ2,НСТО28,НСУМ28,НСТО1,НСУМ1,НСУМ3:Numeric;
var ОВСЕГОПОК,ОСТО2,ОСУМ2,ОСТО28,ОСУМ28,ОСТО1,ОСУМ1,ОСУМ3:Numeric;
var СВСЕГОПОК,ССТО2,ССУМ2,ССТО28,ССУМ28,ССТО1,ССУМ1,ССУМ3:Numeric; -- Сумма оплат за 2006 год
var ДОприх:Date;     -- Дата оприходования
var ДПолуч:Date;    -- Дата получения
var КолОплат:Integer;-- Количество оплат
var ДОплаты:Date; -- Дата оплаты
var СуммаОплаты:Numeric; -- Сумма оплаты
var ДПоп:Date; -- Дата попадания с.ф.
var Комент:String;-- Коментарий для строки
var Аванс :Logical; -- Авансовая с.ф.
var РеквПСчит:record; -- Ссылка на РеквП считанная
var РеквПолнИмя, РеквПИНН,РеквПКПП:String; -- полное имя;
var ВалСФ,ВалОпл:String; -- валюта с.ф. и валюта оплаты
var ДатаСФ:Date; -- дата с.ф
var ТипУчета:Integer; -- настройка из сервиса
var Коэф:Integer; -- коэффициент долей
var БылаОплата:Logical; -- была оплата за текущий период книги
var КолМес:Integer; -- количество месяцев, по которым брали оплату
var ДПредОплаты:Date; -- дата предыдущей оплаты
var БНДС1,БНДС2,БНДС28:Numeric;

  ТипУчета=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 (D2К        );
  ClearVariable (D3К        );
  ClearVariable (D8К        );
  ClearVariable (РЕКВПК     );
  ClearVariable (ПОСТК      );
  ClearVariable (ИННК       );
  ClearVariable (КППК       );
  ClearVariable (СТР_ГТДК   );
  ClearVariable (STO1К      );
  ClearVariable (STO18К     );
  ClearVariable (STO2К      );
  ClearVariable (SUM1К      );
  ClearVariable (SUM18К     );
  ClearVariable (SUM2К      );
  ClearVariable (STO3К      );
  ClearVariable (SUM3К      );
  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,"ВсегоПок"),ВалСф,ДатаСФ);
      СТО2    =ПересчетВРуб(GetFieldN(Robl,i,"Сто1"),ВалСф,ДатаСФ);
      СТО28   =ПересчетВРуб(GetFieldN(Robl,i,"Сто18"),ВалСф,ДатаСФ);
      СУМ2    =ПересчетВРуб(GetFieldN(Robl,i,"Сум1"),ВалСф,ДатаСФ);
      СУМ28   =ПересчетВРуб(GetFieldN(Robl,i,"Сум18"),ВалСф,ДатаСФ);
      СТО1    =ПересчетВРуб(GetFieldN(Robl,i,"Сто2"),ВалСф,ДатаСФ);
      СУМ1    =ПересчетВРуб(GetFieldN(Robl,i,"Сум2"),ВалСф,ДатаСФ);
      СУМ3    =ПересчетВРуб(GetFieldN(Robl,i,"Сум3"),ВалСф,ДатаСФ);
      ДОприх=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,'СТР_ГТД'),ВСЕГОПОК,СТО1,СТО2,СТО28,СУМ1,СУМ2,СУМ28,СУМ3,'',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,'СТР_ГТД'),ВСЕГОПОК,СТО1,СТО2,СТО28,СУМ1,СУМ2,СУМ28,СУМ3,"",GetFieldL(Robl,i,'Аванс'),
                 GetFieldS(Robl,i,'КРЕ'),GetFieldS(Robl,i,"АнкодПост")+' СФП.'+GetFieldS(Robl,i,"АнКод") + ' ' + GetFieldS(Robl,i,"ДопАналитика"));

          fi;
        fi;
      elsif Пост914:--по оплате
        if КолОплат=1: -- Одна оплата
            ДОплаты=GetFieldD(Robl,i,"ДатаПерв");
            ВалОпл=GetFieldS(Robl,i,"ВалютаОпл");

            -- Если новые с.ф. и по принятию
            if ДПоп>=ДатаН and ДПоп<ДатаКФильтр and ВсегоПок>0:
                СуммаОплаты=min(ПересчетВРуб(GetFieldN(Robl,i,"СуммаОплаты"),ВалОпл,ДОплаты),ВСЕГОПОК);
                if СуммаОплаты>0 and ДОплаты<ДатаКФильтр: -- Если была оплата, то ее надо вывести и уменьшить сумму вывода оставшейся суммы
                  ОВСЕГОПОК=СуммаОплаты;

                  ОСТО1=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО1,СТО1),2);
                  ОСУМ1=окр(min((СуммаОплаты/ВСЕГОПОК)*(СУМ1+СТО1)-ОСТО1,СУМ1),2);
                  ОСТО2=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО2,СТО2),2);
                  ОСТО28=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО28,СТО28),2);
                  ОСУМ2=окр(min((СуммаОплаты/ВСЕГОПОК)*(СУМ2+СТО2)-ОСТО2,СУМ2),2);
                  ОСУМ28=окр(min((СуммаОплаты/ВСЕГОПОК)*(СУМ28+СТО28)-ОСТО28,СУМ28),2);
                  ОСУМ3=окр(min((СуммаОплаты/ВСЕГОПОК)*СУМ3,СУМ3),2);

                  Комент=if(ОВСЕГОПОК<ВСЕГОПОК,'частичная оплата','');

                  ВСтр(GetFieldD(Robl,i,'Дата'),GetFieldS(Robl,i,'НомерБум'),'','','',ДОплаты,ДОприх,
                      РеквПСчит,РеквПолнИмя,РеквПИНН,РеквПКПП,
                      GetFieldS(Robl,i,'СТР_ГТД'),ОВСЕГОПОК,ОСТО1,ОСТО2,ОСТО28,ОСУМ1,ОСУМ2,ОСУМ28,ОСУМ3,Комент,GetFieldL(Robl,i,'Аванс'),
                      GetFieldS(Robl,i,'КРЕ'),GetFieldS(Robl,i,"АнкодПост")+' СФП.'+GetFieldS(Robl,i,"АнКод") + ' ' + GetFieldS(Robl,i,"ДопАналитика"));

                  ВСЕГОПОК=ВСЕГОПОК-ОВСЕГОПОК;
                  СТО1=СТО1-ОСТО1;
                  СУМ1=СУМ1-ОСУМ1;
                  СТО2=СТО2-ОСТО2;
                  СТО28=СТО28-ОСТО28;
                  СУМ2=СУМ2-ОСУМ2;
                  СУМ28=СУМ28-ОСУМ28;
                  СУМ3=СУМ3-ОСУМ3;
                fi;
                if ВСЕГОПОК>0:
                  ВСтр(GetFieldD(Robl,i,'Дата'),GetFieldS(Robl,i,'НомерБум'),'','','',1.1.100,ДОприх,
                      РеквПСчит,РеквПолнИмя,РеквПИНН,РеквПКПП,
                      GetFieldS(Robl,i,'СТР_ГТД'),ВСЕГОПОК,СТО1,СТО2,СТО28,СУМ1,СУМ2,СУМ28,СУМ3,"",GetFieldL(Robl,i,'Аванс'),
                      GetFieldS(Robl,i,'КРЕ'),GetFieldS(Robl,i,"АнкодПост")+' СФП.'+GetFieldS(Robl,i,"АнКод") + ' ' + GetFieldS(Robl,i,"ДопАналитика"));
                fi;
            fi;
            СуммаОплаты=min(ПересчетВРуб(GetFieldN(Robl,i,"СуммаОплаты"),ВалОпл,ДОплаты),ВСЕГОПОК);

            if СуммаОплаты>0:
              ОВСЕГОПОК=СуммаОплаты;
              БНДС1=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО1,СТО1),2);
              ОСТО1=БНДС1;
              ОСУМ1=БНДС1*20/100;
              БНДС2=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО2,СТО2),2);
              ОСТО2=БНДС2;
              ОСУМ2=БНДС2*10/100;
              БНДС28=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО28,СТО28),2);
              ОСТО28=БНДС28;
              ОСУМ28=БНДС28*18/100;
              ОСУМ3=окр(min((СуммаОплаты/ВСЕГОПОК)*СУМ3,СУМ3),2);
            fi;
            ПВСЕГОПОК=ВСЕГОПОК;
            ПСТО1=СТО1;
            ПСУМ1=СУМ1;
            ПСТО2=СТО2;
            ПСТО28=СТО28;
            ПСУМ2=СУМ2;
            ПСУМ28=СУМ28;
            ПСУМ3=СУМ3;
        else -- Несколько оплат
            if КолОплат>1:
               RSub=OpenArray(Robl,i,'ОПЛАТА','ДатаОплаты');
               Try
                -- Если новые с.ф. и по принятию
                if ДПоп>=ДатаН and ДПоп<ДатаКФильтр and ВсегоПок>0:

                  -- Считаем оплаты до даты попадания в книгу и уменьшаем оставшуюся сумму
                  for n=1..records(RSub) do
                    ДОплаты=GetFieldD(RSub,n,"ДатаОплаты");
                    ВалОпл =GetFieldS(RSub,n,"Валюта");
                    СуммаОплаты=min(ПересчетВРуб(GetFieldN(RSub,n,"СуммаОплаты"),ВалОпл,ДОплаты),ВСЕГОПОК);
                    if СуммаОплаты>0 and ДОплаты<ДатаКФильтр:
                      ОВСЕГОПОК=СуммаОплаты;

                      ОСТО1=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО1,СТО1),2);
                      ОСУМ1=окр(min((СуммаОплаты/ВСЕГОПОК)*(СУМ1+СТО1)-ОСТО1,СУМ1),2);
                      ОСТО2=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО2,СТО2),2);
                      ОСТО28=окр(min((СуммаОплаты/ВСЕГОПОК)*СТО28,СТО28),2);
                      ОСУМ2=окр(min((СуммаОплаты/ВСЕГОПОК)*(СУМ2+СТО2)-ОСТО2,СУМ2),2);
                      ОСУМ28=окр(min((СуммаОплаты/ВСЕГОПОК)*(СУМ28+СТО28)-ОСТО28,СУМ28),2);
                      ОСУМ3=окр(min((СуммаОплаты/ВСЕГОПОК)*СУМ3,СУМ3),2);

                      if ОВСЕГОПОК>0:
                        ВСтр(GetFieldD(Robl,i,'Дата'),GetFieldS(Robl,i,'НомерБум'),'','','',ДОплаты,ДОприх,
                           РеквпСчит,РеквПолнИмя,РеквПИНН,РеквПКПП,
                           GetFieldS(Robl,i,'СТР_ГТД'),ОВСЕГОПОК,ОСТО1,ОСТО2,ОСТО28,ОСУМ1,ОСУМ2,ОСУМ28,ОСУМ3,'частичная оплата',Аванс,
                           GetFieldS(Robl,i,'КРЕ'),GetFieldS(Robl,i,"АнкодПост")+' СФП.'+GetFieldS(Robl,i,"АнКод") + ' ' + GetFieldS(Robl,i,"ДопАналитика"));

                        ВСЕГОПОК=ВСЕГОПОК-ОВСЕГОПОК;
                        СТО1=СТО1-ОСТО1;
                        СУМ1=СУМ1-ОСУМ1;
                        СТО2=СТО2-ОСТО2;
                        СТО28=СТО28-ОСТО28;
                        СУМ2=СУМ2-ОСУМ2;
                        СУМ28=СУМ28-ОСУМ28;
                        СУМ3=СУМ3-ОСУМ3;
                      fi;
                    fi;
                  end;

                  if ВСЕГОПОК>0:
                    ВСтр(GetFieldD(Robl,i,'Дата'),GetFieldS(Robl,i,'НомерБум'),'','','',1.1.100,ДОприх,
                       РеквпСчит,РеквПолнИмя,РеквПИНН,РеквПКПП,
                       GetFieldS(Robl,i,'СТР_ГТД'),ВСЕГОПОК,СТО1,СТО2,СТО28,СУМ1,СУМ2,СУМ28,СУМ3,"",Аванс,
                       GetFieldS(Robl,i,'КРЕ'),GetFieldS(Robl,i,"АнкодПост")+' СФП.'+GetFieldS(Robl,i,"АнКод") + ' ' + GetFieldS(Robl,i,"ДопАналитика"));
                  fi;
                fi;

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

var НомерЗаписи:Integer; -- Номер последней записи
var НомерСтр   :Integer; -- Номер текущей страницы
var НомерЗСтр  :Integer; -- Номер записи страницы
var КолСтр     :Integer; -- Количество страниц
--var КолВст     :Integer; -- Количество вставленных строк
var D8з  :Numeric;       --
var Sto1з:Numeric;       -- -
var Sto18з:Numeric;      -- -
var St18з:Numeric;      -- -
var Sum1з:Numeric;       -- - - Подсчитанные итоги
var Sum18з:Numeric;      -- - -
var Sto2з:Numeric;       -- -
var St2з:Numeric;       -- -
var Sum2з:Numeric;       --
var Sum3з: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 Проводить");

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

Proc ФормированиеСтраниц; -- формирование страниц книги покупок
var i,Koll:Integer;
var Фильтр:String;
  NewR=0;
  D8з   =D8Вх;
  Sto1з =Sto1Вх;
  Sto18з=Sto18Вх;
  St18з =St18Вх;
  Sum1з =Sto2Вх;
  Sum18з=St2Вх;
  Sto2з =Sum1Вх;
  St2з  =Sum18Вх;
  Sum2з =Sum2Вх;
  Sum3з =Sum3Вх;
  НомерСтр=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];
        КнПок[КнПок].Днп0И=ДНП0ИК[i];
        КнПок[КнПок].Днп0Кор=ДНП0КорК[i];
        КнПок[КнПок].Днп0КИ=ДНП0КИК[i];

        КнПок[КнПок].D1=1.1.100;
        КнПок[КнПок].D2=D2К[i];
        КнПок[КнПок].D3=D3К[i];
        КнПок[КнПок].Пост=ПостК[i];
        КнПок[КнПок].АнКодПост=АнКодПостК[i];
        КнПок[КнПок].ИНН=ИННК[i];
        КнПок[КнПок].КПП=КППК[i];
        КнПок[КнПок].СТР_ГТД=СТР_ГТДК[i];
        КнПок[КнПок].D8=D8К[i];
        КнПок[КнПок].Sto1=Sto1К[i];
        КнПок[КнПок].Sto18=Sto18К[i];
        КнПок[КнПок].Sum1=Sum1К[i];
        КнПок[КнПок].Sum18=Sum18К[i];
        КнПок[КнПок].Sto2=Sto2К[i];
        КнПок[КнПок].Sum2=Sum2К[i];
        КнПок[КнПок].Sum3=Sum3К[i];
        КнПок[КнПок].КорСчет=КОРСЧЕТК[i];
        КнПок[КнПок].СчетД=СчетПоДебету;
        КнПок[КнПок].Коммент=КомментК[i];
        КнПок[КнПок].Аванс=АвансК[i];
        D8з=D8з+D8К[i];
        Sto1з=Sto1з+Sto1К[i];
        Sto18з=Sto18з+if(КнПок[КнПок].Аванс,0,Sto18К[i]);
        Sum1з=Sum1з+Sum1К[i];
        Sum18з=Sum18з+Sum18К[i];
        Sto2з=Sto2з+if(КнПок[КнПок].Аванс,0,Sto2К[i]);
        St18з=St18з+Sto18К[i];
        St2з=St2з+Sto2К[i];
        Sum2з=Sum2з+Sum2К[i];
        Sum3з=Sum3з+Sum3К[i];


--        ВставкаСтр(D0К[i],ДНП0К[i],1.1.100,D2К[i],D3К[i],ПостК[i],ИННК[i],КППК[i],D8К[i],Sto1К[i],Sum1К[i],Sto18К[i],
--                   Sum18К[i],Sto2К[i],Sum2К[i],Sum3К[i],АнКодПостК[i],КОРСЧЕТК[i],СТР_ГТДК[i],КомментК[i],АвансК[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'),
             GetFieldN(Robl,i,'STO1'),GetFieldN(Robl,i,'STO2'),GetFieldN(Robl,i,'STO18'),
             GetFieldN(Robl,i,'SUM3'),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 Not НеСторнировать:
       Раб.Бух.Сторнировать('');
     fi;
     ПоискАвансов; -- Ищет авансы в картотеке со сторно
     Поисквкниге;
     ФормированиеСтраниц; -- Формирует страницы книги
     ОтображениеПост451;
     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);
var i:I;
  FlagInit=True;
  Раб.Настр_Печать.Cfg("","Документы.счета.кнпок.cfg");
  for i=1..КНпок do
    D0_[i]=DateToString(КНпок[i].D0)+" N"+КНпок[i].ДНП0;
  od;
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 КнПок[Итер].Аванс;
   ОтображениеПост451;
   Return(False);
end;

--Бывший сервис
proc ОбработатьАвансы_ПриНажатии(Кнопка:String);
  Раб.Бух.Сторнировать('');
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,"ИНН");
      КНПок[Iter].КПП=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: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);
    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=Substr(D0_[Iter],N+1,255);
  fi;

end;


КОНЕЦ