-- Шаблон создан мастером бланков
-- 09.04.2012 14:26:57
--
БланкСШаблоном "Корректировочный счет-фактура", Редактор СЧЕТФАКТ;
Uses Раб.Бух,Раб.Обл, Раб.Документы,Раб.Предм,Раб.список,раб.формат,раб.оплата,Раб.Сис;
флПост451:Object;
Пост451  :Logical;

флПрочеркИНН:Object;
ПрочеркИНН  :Logical;

флПрочеркОплаты:Object;
ПрочеркОплаты  :Logical;

var Текст:I;

ТекстОплата:String=['Оплата производится в рублях по курсу ЦБ РФ на день платежа'];

секКолНаим:Section;
секИНН:Section;
секОплата:Section;

ВыводНаим:Integer=[0];
КорИмя:Строка=if(ВыводНаим=1,Рекв.ПолнИмя,if(ВыводНаим=2,Рекв.КорИмя,Рекв.ПолнИмя+if(Пост451," / "+Рекв.КорИмя,"")));
Номер_[]:Integer=if(Аванс,Ном,Оплата[$].НОМЕРД);
ДатаХ_[]:Date=if(Аванс,ДатаХ,Оплата[$].ДАТА);

КНПлюс:String="+";
КНМинус:String="-";

КПППродавца:String=if(НАШЕПОДРАЗД=nil,Рекв.КПП,НАШЕПОДРАЗД.Реквизиты.КПП);
Валюта_:string=if(Валюта="РУБ":"Российский рубль, 643"|Валюта="USD":"Американский доллар, 840"|Валюта="EUR":"Единая европейская валюта, 978"|True:"");

ВводПокупРучной:Logical; -- false - Покупатель из картотеки, true - ручной ввод покупателя

-- Положение колонок в таблице
КолонкаНДС:Integer=11;
КолонкаНДСАванс:Integer=12;
--

-- Флаги выбора товара из разных картотек
ТипВыбора:Integer=[0]; -- 0 - ТМЦ, 1 - ОСиНА, 2 - Текст

ФлТМЦ:String=if(ТипВыбора=0,'V','');
ФлОСИНА:String=if(ТипВыбора=1,'V','');
флТекст:String=if(ТипВыбора=2,'V','');
----------------------
var СФильтром:Logical; -- Выбор ТМЦ с фильтром

ФИОРук:String=if(Рук=nil,Рекв.ФИОРук,Рук.Фамилия[Дата]+' '+Рук.ИНИЦИАЛЫ);
ФИОБух:String=if(Бух=nil,Рекв.ФИОБух,Бух.Фамилия[Дата]+' '+Бух.ИНИЦИАЛЫ);

var СуммаУв[]=Cre(КолНаим[$].СуммаДО-КолНаим[$].Сумма);
var СуммаУм[]=Deb(КолНаим[$].СуммаДО-КолНаим[$].Сумма);
var СумАкцУв[]=Cre(КолНаим[$].СумАкцДО-КолНаим[$].СумАкц);
var СумАкцУм[]=Deb(КолНаим[$].СумАкцДО-КолНаим[$].СумАкц);
var СуммаНДСУв[]=Cre(КолНаим[$].СуммаНДСДО-КолНаим[$].СуммаНДС);
var СуммаНДСУм[]=Deb(КолНаим[$].СуммаНДСДО-КолНаим[$].СуммаНДС);
var ВсегоУв[]=Cre(КолНаим[$].ВсегоДО-КолНаим[$].Всего);
var ВсегоУм[]=Deb(КолНаим[$].ВсегоДО-КолНаим[$].Всего);

var СумДокВ:Numeric=if(Аванс and Пост451,0,СуммаМассива(СуммаУв,КолНаим));
var АкцДокВ:Numeric=if(Аванс and Пост451,0,СуммаМассива(СумАкцУв,КолНаим));
var НДСДокВ:Numeric=СуммаМассива(СуммаНДСУв,КолНаим);
var СумВсегоВ:Numeric=СуммаМассива(ВсегоУв,КолНаим);

var СумДокГ:Numeric=if(Аванс and Пост451,0,СуммаМассива(СуммаУм,КолНаим));
var АкцДокГ:Numeric=if(Аванс and Пост451,0,СуммаМассива(СумАкцУм,КолНаим));
var НДСДокГ:Numeric=СуммаМассива(СуммаНДСУм,КолНаим);
var СумВсегоГ:Numeric=СуммаМассива(ВсегоУм,КолНаим);

proc Пересчет(Клетка:String;Итер:Integer);
  if КолНаим=0:InsertFrame(КолНаим,КолНаим+1);fi;
  if Клетка="Цена" or Клетка="Колич" or Клетка="ЕдИзм":
      if КолНаим[Итер].ЕдИзм<>'%':
        КолНаим[Итер].Сумма=КолНаим[Итер].Колич*КолНаим[Итер].Цена;
      else
        КолНаим[Итер].Сумма=(КолНаим[Итер].Колич/100)*КолНаим[Итер].Цена;
      end;
      КолНаим[Итер].СуммаНДС=КолНаим[Итер].Сумма*КолНаим[Итер].НДС%;
      КолНаим[Итер].Всего=КолНаим[Итер].Сумма+КолНаим[Итер].СуммаНДС;
    |Клетка="ЦенаДО" or Клетка="КоличДО" or Клетка="ЕдИзмДО":
      if КолНаим[Итер].ЕдИзмДО<>'%':
        КолНаим[Итер].СуммаДО=КолНаим[Итер].КоличДО*КолНаим[Итер].ЦенаДО;
      else
        КолНаим[Итер].СуммаДО=(КолНаим[Итер].КоличДО/100)*КолНаим[Итер].ЦенаДО;
      end;
      КолНаим[Итер].СуммаНДСДО=КолНаим[Итер].СуммаДО*КолНаим[Итер].НДСДО%;
      КолНаим[Итер].ВсегоДО=КолНаим[Итер].СуммаДО+КолНаим[Итер].СуммаНДСДО;
    |Клетка="НДС":
      if Аванс:
        КолНаим[Итер].Сумма=0;
        КолНаим[Итер].СуммаНДС=КолНаим[Итер].НДС/(100+КолНаим[Итер].НДС)*КолНаим[Итер].Всего;
      else
        КолНаим[Итер].СуммаНДС=КолНаим[Итер].Сумма*КолНаим[Итер].НДС%;
        КолНаим[Итер].Всего=КолНаим[Итер].Сумма+КолНаим[Итер].СуммаНДС;
      end;
    |Клетка="НДСДО":
      if Аванс:
        КолНаим[Итер].Сумма=0;
        КолНаим[Итер].СуммаНДСДО=КолНаим[Итер].НДСДО/(100+КолНаим[Итер].НДСДО)*КолНаим[Итер].ВсегоДО;
      else
        КолНаим[Итер].СуммаНДСДО=КолНаим[Итер].СуммаДО*КолНаим[Итер].НДСДО%;
        КолНаим[Итер].ВсегоДО=КолНаим[Итер].СуммаДО+КолНаим[Итер].СуммаНДСДО;
      end;
    |Клетка="Всего":
      КолНаим[Итер].СуммаНДС=КолНаим[Итер].НДС/(100+КолНаим[Итер].НДС)*КолНаим[Итер].Всего;
      if Аванс:
        КолНаим[Итер].Сумма=0;
      else
        КолНаим[Итер].Сумма=КолНаим[Итер].Всего-КолНаим[Итер].СуммаНДС;
      end;

      КолНаим[Итер].Цена=КолНаим[Итер].Сумма/КолНаим[Итер].Колич;
    |Клетка="ВсегоДО":
      КолНаим[Итер].СуммаНДСДО=КолНаим[Итер].НДСДО/(100+КолНаим[Итер].НДСДО)*КолНаим[Итер].ВсегоДО;
      if Аванс:
        КолНаим[Итер].СуммаДО=0;
      else
        КолНаим[Итер].СуммаДО=КолНаим[Итер].ВсегоДО-КолНаим[Итер].СуммаНДСДО;
      end;

      КолНаим[Итер].ЦенаДО=КолНаим[Итер].СуммаДО/КолНаим[Итер].КоличДО;
  fi;
end;

proc ОтображениеПост451;
--    if Пост451 then
--       СекШапка.Row(3,RowVisible,false);
--       СекШапка.Row(4,RowVisible,true);
--    else
--       СекШапка.Row(3,RowVisible,true);
--       СекШапка.Row(4,RowVisible,false);
--    end;

--    СекГрузоотпр.Row(1,RowVisible,not Пост451 or not Аванс);
--    СекГрузоотпр.Row(2,RowVisible,Пост451 and Аванс);

--    СекГрузопол.Row(1,RowVisible,not Пост451 or not Аванс);
--    СекГрузопол.Row(2,RowVisible,Пост451 and Аванс);

--    СекКолНаим.Row(1,RowVisible,not Пост451 or not Аванс);
--    СекКолНаим.Row(2,RowVisible,Пост451 and Аванс);
end;

func ФлВыбора_ПриВходе(Поле:String;Итер:Integer):Logical;
  if Поле='флТМЦ':
      ТипВыбора=0;
    |Поле='флОСиНА':
      ТипВыбора=1;
    |Поле='флТекст':
      ТипВыбора=2;
  fi;
  ^false;
end;

func ПокупательТекст_ПриВходе(Поле:String;Итер:Integer):Logical;
  ВводПокупРучной=not ВводПокупРучной;
  ^false;
end;



func Контр(Об:String;Итер:Integer):Logical;
var temp:record;
var ПочтАдрес:String;
  if Об = "КорИмя" :
      temp=OpenCardFile("КонтрАгент","Наше");
      if temp<>nil:
        Рекв=temp;
        НашеПодразд=nil;
      fi;
      ^False;
  |  Об = "Покуп" :
      if not ВводПокупРучной:
          if Итер<>-2: temp=OpenCardFile("КонтрАгент","Покупатель ИЛИ Дик");
           else temp=Раб.Документы.ВыборСФильтром("КонтрАгент","ПолнИмя","Покупатель ИЛИ Дик");
          fi;
          if temp<>nil:
              Адрес=GetCardFieldS("КонтрАгент",temp,"ЮРадрес");
              ПочтАдрес=GetCardFieldS("КонтрАгент",temp,"ПочтАдрес");
              Телефон=GetCardFieldS("КонтрАгент",temp,"телефон");
              ИНН=GetCardFieldS("КонтрАгент",temp,"ИНН");
              КПП=GetCardFieldS("КонтрАгент",temp,"КПП");
              РеквП = temp;
              Покуп=GetCardFieldS("КонтрАгент",temp,"ПолнИмя");
              Аналит=CARDFILERECSIGN('КОНТРАГЕНТ','ПРИЗНАК','К',temp);
              ГрузПол=Покуп+if(ПочтАдрес<>'',','+ПочтАдрес,'');
          fi;
          ^False;
       else ^True;
      fi;
  fi;
end; -- Контр

func Покуп_ПриВходе(Поле:String;Итер:Integer):Logical;
var res :logical;
  res = Контр('Покуп',-2);
  ^false;
end;


func КПППродавца_ПриВходе(Поле:String; Итер:Integer):Logical;
  НашеПодразд=OpenCardFile('Подразделения','',НашеПодразд);
  ГрузОтпр=НашеПодразд.Подраз+if(НашеПодразд.Адрес<>'',','+НашеПодразд.Адрес,'');
  ^false;
end;


proc флПост451_ПриИзменении(Отправитель: String);
   ОтображениеПост451;
   if Пост451 = True then
     флПрочеркИНН.Enabled    = true;
     флПрочеркОплаты.Enabled = true;
    else
     флПрочеркИНН.Enabled    = false;
     флПрочеркОплаты.Enabled = false;
    fi;
end;

proc флПрочеркИНН_ПриИзменении(Отправитель: String);
    СекИНН.Row(1,RowVisible,not ПрочеркИНН);
    СекИНН.Row(2,RowVisible,ПрочеркИНН);
end;

proc флПрочеркОплаты_ПриИзменении(Отправитель: String);
    СекОплата.Row(1,RowVisible,not ПрочеркОплаты);
    СекОплата.Row(2,RowVisible,ПрочеркОплаты);
end;


Proc OnOpen(Create: Logical);
 Раб.Настр_Печать.Cfg("","Документы.счета.счетфактуран_новая.cfg");
end;

func КНПлюс_ПриВходе(Поле:String;Итер:Integer):Logical;
  InsertFrame(КолНаим,КолНаим+1);
  ^false;
end;


func КНМИНУС_ПриВходе(Поле:String;Итер:Integer):Logical;
  DeleteFrame(КолНаим,Итер);
  ^false;
end;

proc СохрПервОплату;
var i,n:Integer;
var ПДата:Date;
  Пдата=Оплата[1].Дата;
  n=1;
  for i=2..Оплата do
    if Оплата[i].Дата<=Пдата:n=i;Пдата=Оплата[i].Дата;fi;
  od;
  КолОплат=Оплата;
  ДатаПерв=Пдата;
  СуммаОплаты=Оплата[n].СумОпл;
  ВалютаОпл=Оплата[n].Валюта;
end;

Func ВыборОплаты(Клетка:String;Итер:Integer):Logical;
var Robl:Integer;
 if Not Аванс:
   РедакторПрименить;
   Robl=OpenWorkArea("СчетФАкт","","UKEY="+RecordToString(Current));
   Try
     OpenBlankEditor("РАб.Оплата",Robl,1);
     if Ном<>Раб.Оплата.ВозрНомер or  ДатаХ<>Раб.Оплата.ВозрДата:
         Ном=Раб.Оплата.ВозрНомер;
         ДатаХ=Раб.Оплата.ВозрДата;
     fi;
     СохрПервОплату;
     ^False;
   Finally
     CloseWorkArea(Robl);
   End;
 else
   СохрПервОплату;
   ^True;
 fi;
End;

func ВыборТовара_ПриВходе(Об:String;Итер:Integer):Logical;
var TMPRec:Record;
var Карт,Фильтр:String;
  if ТипВыбора=1: Карт="УчетКарточкаОС";фильтр="";
    |ТипВыбора=0:
       Карт="ТМЦ";
       if Раб.Сис.Ver69:
         Фильтр="";
       else
         Фильтр="Товар ИЛИ Материал ИЛИ Услуга";
       fi;
    |ТипВыбора=2:^True;
  else message("Выберите тип открываемой картотеки");^False;
  fi;
   If КолНаим = 0 :
          ВставитьРамку(КолНаим,КолНаим+1);
   Fi;
  if СФильтром: TMPRec=Раб.документы.ВыборСФильтром(Карт,"Коммент",Фильтр);
   else  TMPRec = ОткрытьКартотеку(Карт,Фильтр);
  fi;
   If TMPRec = NIL :  ^False;
     | True :
      If КолНаим = 0 :
        ВставитьРамку(КолНаим,КолНаим+1);
      Fi;
      if Карт="ТМЦ":
          Раб.Документы.TMSelect(TMPRec);
          КолНаим[Итер].ТМЦ=TMPRec;
          КолНаим[Итер].Наим = Раб.Документы.НаимТМЦ;
          КолНаим[Итер].НДС  = Раб.Документы.НДСТМЦ;
          КолНаим[Итер].ЕдИзм= Раб.Документы.ЕдИзмТМЦ;
          КолНаим[Итер].Страна= Раб.Документы.СтранаТМЦ;
          КолНаим[Итер].ГТД= Раб.Документы.ГТДТМЦ;
        |Карт="УчетКарточкаОС":
          Раб.Документы.OCSelect(TMPRec);
          КолНаим[Итер].Наим = Раб.Документы.НаимОС;
     fi;
   Fi;
 ^False;
end;

func Фильтр_ПриВходе(Поле:String;Итер:Integer):Logical;
  СФильтром=true;
  ВыборТовара_ПриВходе(Поле,Итер);
  СФильтром=false;
  ^false;
end;


func ФИО_ПриВходе(Поле:String;Итер:Integer):Logical;
var tmp:record;
  tmp=OpenCardFile('Сотрудники','МОЛ');
  if tmp<>nil:
    if Поле='ФИОРук':
        Рук=tmp;
      |Поле='ФИОБух':
        Бух=tmp;
    fi;
  fi;
  ^false;
end;



proc ВыводВалюты;
  Текст=if(UP(Валюта)<>'РУБ' and Валюта<>'' and ТекстОплата<>'',1,0);
end;

proc ФорматНДС;
  СекКолНаим.Cell(1,КолонкаНДС , CellFormat,if(НДС0,',##0%;;0%',',##0%;;##.Без НДС') );
  СекКолНаим.Cell(2,КолонкаНДС , CellFormat,if(НДС0,',##0%;;0%',',##0%;;##.Без НДС') );
end;


proc ПриСчитывании;
  ВыводНаим=0;
  If Раб.Обл.НоваяЗапись('СЧЕТФАКТ',Current):
      ПрочеркИНН    = false;
      ПрочеркОплаты = false;
      Счет='90.3';
      ДатаК=Сегодня;
      НомерК=Раб.Обл.СледСУчетомГода("СчетФакт","НомерК","ДатаК");
      НомерБумК=СТР(НомерК);
      if Рекв=nil:Рекв=РАБ.Обл.ПервЗапись("КонтрАгент","","Наше");fi;
      if Рекв<>nil:
        if ГрузОтпр='':
          ГрузОтпр=Рекв.ПолнИмя+if(Рекв.ПочтАдрес<>'',','+Рекв.ПочтАдрес,'');
        fi;
      fi;
      НРасчет=true;
      if Валюта='':Валюта="РУБ";fi;
      if BlankExist("РАБ.ТСС.БИБ.SQL"):Изсистемы=2;fi;
  | True :
      If НомерБум = "" :
      НомерБум=СТР(Номер);
      Fi;
      If Рекв = Nil :
       Рекв=РАБ.Обл.ПервЗапись("КонтрАгент","","Наше");
      Fi;
  Fi;
  if Дата>=09.06.2009:
     Пост451 = True;
     флПрочеркИНН.Enabled    = true;
     флПрочеркОплаты.Enabled = true;
  else
     Пост451 = False;
     флПрочеркИНН.Enabled    = false;
     флПрочеркОплаты.Enabled = false;
  fi;
  --КнопИмпорт;
  ВыводВалюты;
  --ДопИнфо_ПриИзменении('');
  --ОтображениеОбьектов;
  ОтображениеПост451;
  -- Убираем столбец НДС в зависимости от аванса
  секКолНаим.Column(КолонкаНДС,ColVisible,not Аванс);
  секКолНаим.Column(КолонкаНДСАванс,ColVisible,Аванс);
  ФорматНДС;
end;


--Proc OnRead;
--   If КолНаим = 0 :
--          ВставитьРамку(КолНаим,КолНаим+1);
--   Fi;

--end;



Proc CheckBox4_OnChange(Sender: String);
  ФорматНДС;
end;

Func ВыборВалюты(FieldName: String; Iter: Integer): logical;
  Валюта=Раб.Бух.ВыбратьВалюту(Валюта);
  ВыводВалюты;
  ^False;
end;


Func OnVerify: Logical;
var JJ,i:Integer;
var Tmp1,Tmp2,Tmp3,Tmp4,Tmp5,Tmp6,Tmp7:Numeric;
var Ан:String;

-- Расчет информации для книги продаж
--   For i=1..КолНаим do КолНаим[I].Всего=Сумма[I]+СумНДС[I]; Od;
   Tmp1=0;
   Tmp2=0;
   Tmp3=0;
   Tmp4=0;
   Tmp5=0;
   Tmp6=0;
   Tmp7=0;

   For JJ=1..КолНаим Do
           Tmp1=Tmp1+КолНаим[JJ].Всего;
     if Round(КолНаим[JJ].НДС) = 18:
       Tmp6    =Tmp6+КолНаим[JJ].СуммаНДС;
       Tmp7    =Tmp7+if(not Аванс,КолНаим[JJ].Сумма,КолНаим[JJ].Всего-КолНаим[JJ].СуммаНДС);
     |Round(КолНаим[JJ].НДС) <> 10 and  КолНаим[JJ].НДС <> 0 and КолНаим[JJ].НДС <> 9.09:
       Tmp2    =Tmp2+КолНаим[JJ].СуммаНДС;
       Tmp4    =Tmp4+if(not Аванс,КолНаим[JJ].Сумма,КолНаим[JJ].Всего-КолНаим[JJ].СуммаНДС);
     |Round(КолНаим[JJ].НДС) = 10 or КолНаим[JJ].НДС = 9.09:
       Tmp3    =Tmp3+КолНаим[JJ].СуммаНДС;
       Tmp5    =Tmp5+if(not Аванс,КолНаим[JJ].Сумма,КолНаим[JJ].Всего-КолНаим[JJ].СуммаНДС);
     Fi;
   Od;

   If ВсегоДок <> Tmp1 : ВсегоДок = Tmp1; Fi;
   If Сто1        <> Tmp2 :  Сто1 = Tmp2; Fi;
   If Сто18       <> Tmp6 :  Сто18= Tmp6; Fi;
   If Сто2        <> Tmp3 :  Сто2 = Tmp3; Fi;
   If Сум1        <> Tmp4 :  Сум1 = Tmp4; Fi;
   If Сум18       <> Tmp7 :  Сум18= Tmp7; Fi;
   If Сум2        <> Tmp5 :  Сум2 = Tmp5; Fi;
   ^True;
end;


Конец
