БланкСШаблоном "Счет-фактура от поставщика", Редактор СЧЕТФАКТПОСТ;

btnFillIt: Object;

ОбщСумма:Numeric=ВСЕГОПОК-(СТО1+СУМ1)-(СТО18+СУМ18)-(СТО2+СУМ2)-СУМ3;

Пров: String=Если(Отбр(ОбщСумма, 2)<0:"Всего покупок включая НДС меньше суммы показателей !","");
Необлаг:Numeric=Окр(ВСЕГОПОК-(СТО2+СУМ2+СТО1+СУМ1+СТО18+СУМ18+СУМ3),2); -- Необлагается НДС;
НеоблагСТ:Numeric=Окр(ВСЕГОПОКСТ-(СТО2СТ+СУМ2СТ+СТО1СТ+СУМ1СТ+СТО18СТ+СУМ18СТ+СУМ3СТ),2); -- Необлагается НДС сторно;

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

ВалютаСФ:String = if(Валюта='','РУБ',Валюта);
ВалОпл[]:String= if(ОПЛАТА[$].Валюта='','РУБ',ОПЛАТА[$].Валюта);

ТекстДатыОприходования :String = if(Аванс,"Дата оплаты аванса","Дата оприходования");

Proc ДобавитьСтроку(Об:String);
  ВставитьРамку(Оплата,Оплата+1);
End;

Proc УдалитьСтроку(Об:String);
 УдалитьРамку(Оплата,asInteger(шаблон.кадр));
End;

Proc СохрПослДату;
var i:Integer;
var ПДата:Date;
  Пдата=1.1.100;
  for i=1..Оплата do
   if Оплата[i].ДатаОплаты>Пдата:Пдата=Оплата[i].ДатаОплаты;fi;
  od;
  ДатаПосл=Пдата;
end;

func ВыборВалютыСФ(Клетка:String;Итер:Integer):logical;
  Валюта=Раб.Бух.ВыбратьВалюту(Валюта);
  ^false;
end;

func ВыборВалютыОпл(Клетка:String;Итер:Integer):logical;
  Оплата[Итер].Валюта=Раб.Бух.ВыбратьВалюту(Оплата[Итер].Валюта);
  ^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 ПриПроверке:Logical;
var Ответ:Integer;
var Вых:Logical;
var Ан:String;
var i:Integer;
  Вых=true;
  if ДАТА=1.1.100: 
       message("Пожалуйста, введите дату счета фактуры.");
       шаблон.поле="Дата";
       Вых=false;
    |НомерБум<" ":
       message("Пожалуйста, введите номер счета-фактуры.");
       шаблон.поле="НомерБум";
       Вых=false;
    |НАИМПОСТ<" ":
       message("Пожалуйста, введите поставщика.");
       шаблон.поле="НАИМПОСТ";
       Вых=false;
    |ВсегоПок=0:
       message("Пожалуйста, введите сумму покупки.");
       шаблон.поле="ВсегоПок";
       Вых=false;
    |not Раб.сис.IdentCor(КодСделки) :
       шаблон.объект="редСделка";
       Вых=false;
    |ОбщСумма<0:
       Ответ=EnqOkCancel("Всего покупок включая НДС меньше суммы показателей !. Продолжить?");
       if Ответ=cmCancel:Вых=false; fi;
    |Аванс and КодАванса<" ":
       message("Пожалуйста, выберите код аванса");
       шаблон.поле="КодАванса";
       Вых=false;
    |Оплата>0:
       for i=1..Оплата do
	 if (Оплата[i].СуммаОплаты>0) and (Оплата[i].ДатаОплаты=1.1.100):
	   message('Пожалуйста, введите дату оплаты или удалите строку с оплатой.');
	   шаблон.поле='ДатаОплаты';
	   шаблон.кадр=i;
	   Вых=false;
	   break;
	 fi;
       end;

  fi;
 if вых=true: 
  СохрПервОплату;
  СохрПослДату;
  Ан=substr(АнКодПост,pos('.',АнКодПост)+1,length(АнКодПост));
  АнКод = if(Ан<>'':Ан+".",'')+if(КодСделки<>'',КодСделки+'.','')+раб.предм.PtrStr(current,5);
  if ВСЕГОПОК<0:ClearVariable(Оплата);fi;
 fi;
 ^Вых;
End;

Func ВыборСчета(Об:String;Итер:Integer):Logical;
var Temp:String;
  Temp=ВыборКоррСчета('',false);
  if Temp<>'':Кре=Temp;fi;
  ^False;
End;

Proc ВыборСделки(Об:String);
var temp   :record;
var filter :string;
  filter = "ТИП = 'П'";
  if (РеквП <> nil) :
    filter = filter + " and (Контрагент=" + RecordToString(РеквП)+")";
  fi;
  temp=ОткрытьКартотеку("Сделка",filter);
  if (temp <> nil) :
     кодСделки = ВзятьКартПолеС("Сделка",temp,"НОМЕРДОГ");
  fi;
End; -- ВыборСделки

Func ВыборПост(Об:с;Итер:Integer):Logical;
var Пр,ИмяКарт,ИмяПоля:String;
var Зап:Record;
  Пр=ВыборПризнака("К.*");
  if Пр<>"":
   АнКодПост=Пр;
   НаимПост=наим_п(пр);
   ИмяКарт = КартотекаПризнака (Пр);
    If ИмяКарт <> "" :
	 Зап = ПризнакВЗапись (Пр);
	 If Зап <> Nil :
	  if Имякарт="Сотрудники": ИмяПоля="ФИОТ";
	    |Имякарт="КонтрАгент": ИмяПоля="КорИмя";
	  fi;
	  НАИМПОСТ=Раб.Обл.GetCardS(ИмяКарт,Зап,ИмяПоля);
	  ИНН=Раб.Обл.GetCardS(ИмяКарт,Зап,"ИНН");
	  РЕКВП = Зап;
	 fi;
    else
   fi;
  fi;
  ^False;
End;


Proc FillIt(Об:String);
var Qver,t : Integer;
var i	   : Integer;
var RO,So  : Integer;
var CurRec : Record;
var Усл    : String;
var ОбщАнП : String;

 EditorApply;
 Refresh;
 Усл = "+(60!|76!){СФП."+АнКод+"}";
 If ОПЛАТА > 0 :
    Qver = ВопрДаНетОтказ("Очистить информацию об оплатах счета?");
    If Qver = cmYes : ОчиститьПеременную(Оплата);
    |  Qver = cmCancel : Exit;
    Fi;
 fi;
 For transaction t = Усл, 01.01.100, Раб.Предм.СледГод(Сегодня) do
    If (TransSum(t) > 0) :
       ВставитьРамку(Оплата,Оплата+1);
       Оплата[Оплата].ДатаОплаты = TransDate(t);
       Оплата[Оплата].СуммаОплаты = TransSum(t);
       Оплата[Оплата].Валюта='РУБ';
       CurRec = TransRecord(t);
       If TransCardFile(t)<>"":
       Ro = OpenWorkArea(TransCardFile(t),"");
	 Try
	 If TransCardFile(t) = "ВЫПИСКИ" :
	     If CurRec <> Nil :
	       try
		 So = OpenArray(Ro,GetRecordNumber(Ro,CurRec),"ПозицииКре","");
		 try
		   For i = 1..Records(So) do
		     ОбщАнП = GetFieldS(So,i,"ПризнФин") + " " + GetFieldS(So,i,"ПризнУпр");
		     If (GetFieldN(So,i,"Сумма") = Оплата[Оплата].СуммаОплаты) and
			 (Pos(АнКод,ОбщАнП) > 0) :
		       Оплата[Оплата].Номер = GetFieldS(So,i,"НомерБум");
		     fi;
		   od;
		 Finally
		   CloseWorkArea(So);
		 End;
	       Except end;
	     fi;
	 else
	     If CurRec <> Nil :
	       try
		Оплата[Оплата].Номер = GetFieldS(Ro,GetRecordNumber(Ro,CurRec),"НомерБум");
	       Except end;
	     fi;
	 fi;
	 if Оплата[Оплата].Номер = '' :
	    Оплата[Оплата].Номер = TransComment(t);
	 fi;
       Finally
	 CloseWorkArea(Ro);
       end;
       fi;
    fi;
 od;
End; -- FillIt

 ИтогоОплаты :N= СуммаМассива(Оплата[].СуммаОплаты);

proc ПодсчетНДС_ПриВыходе(Клетка:String;Итер:Integer);
  if Клетка='СТО2':
       СУМ2=Round(СТО2*20%,2);
    |Клетка='СТО18':
       СУМ18=Round(СТО18*18%,2);
    |Клетка='СТО1':
       СУМ1=Round(СТО1*10%,2);
  fi;
end;

Proc ПриСчитывании;
  if Дата=1.1.100 :
      Кре='';
      Валюта='РУБ';
      if BlankExist("РАБ.ТСС.БИБ.SQL"):Изсистемы=2;fi;
      if Рекв=nil:Рекв=РАБ.Обл.ПервЗапись("КонтрАгент","","Наше");fi;
  fi;
  btnFillIt.Visible = not BlankExist("РАБ.ТСС.БИБ.SQL");
end;

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

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

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

proc Помощь='Помощь';
  Раб.Сис.ShowHelpContext(244);
end;

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

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

  tmp = AnaElection("*");
  if tmp<>"":
    ДопАналитика = ДопАналитика + if(length(ДопАналитика)>0," ","")  + tmp;
  end;

  ^false;
end;


var СпКолАванс	     :Integer;
var СпКодАванса[]    :String;
var СпКодКоммАванса[]:String;

proc ОчиститьПерменныеСпискаАв;
  СпКолАванс = 0;
  ClearVariable(СпКодАванса);
  ClearVariable(СпКодКоммАванса);
end;


--- Проверяет код аванса закрытый или нет в зависимости от суммы и открузок по этому коду аванса
func НеЗакрКодАв(СВсего:Numeric;КодАв:String):Logical;
var РОбл,i:Integer;
var ВсегоСт:Numeric;

  ВсегоСт = 0;
  РОбл = OpenWorkArea("СчетФактПост","КодАванса","Not Аванс and РеквП="+RecordToString(РеквП) + " and КодАванса = '" + КодАв + "'");
  Try
    for i = 1..records(РОбл) do
      ВсегоСт = ВсегоСт + GetFieldN(РОбл,i,"ВсегоПокСт");
    end;

  Finally
   CloseWorkArea(РОбл);
  End;

  ^if(СВсего<>ВсегоСт,true,false);
end;

-- Ищет список авансов для выбора из списка
proc ПостроитьСписокАвансов;
var РОбл,i,КолЗап :Integer;
var КодАв,КоммАв, КодАвПред,КоммАвПред:String;
var СВсего :Numeric; -- Сумма всего

  КодАвПред = "";
  ОчиститьПерменныеСпискаАв;

  РОбл=OpenWorkArea("СчетФактПост","КодАванса","Аванс and РеквП="+RecordToString(РеквП));
  Try
    КолЗап = Records(РОбл);
    for i=1..КолЗап do

      КодАв  = GetFieldS(Робл,i,"КодАванса");
      КоммАв  = GetFieldS(РОбл,i,"КоммАванса");

      if i=1 then КодАвПред = КодАв; КоммАвПред = КоммАв; end;
      if i=КолЗап and КодАвПред <> КодАв then СВсего=GetFieldN(РОбл,i,"ВСЕГОПОК"); end;
      if i=КолЗап and КодАвПред = КодАв then СВсего=СВсего + GetFieldN(РОбл,i,"ВСЕГОПОК"); end;

      if i=КолЗап or КодАв<>КодАВПред then

	if НеЗакрКодАв(СВсего,КодАвпред) then
	  СпКолАванс = СпКолАванс + 1;
	  СпКодАванса[СпКолАванс] = КодАвПред;
	  СпКодКоммАванса[СпКолАванс] = КоммАвПред;
	end;

	if i=КолЗап and i<>1 and КодАвПред <> КодАв then -- т.к. запись последная ее тоже нужно проверить
	  if НеЗакрКодАв(СВсего,КодАв) then
	    СпКолАванс = СпКолАванс + 1;
	    СпКодАванса[СпКолАванс] = КодАв;
	    СпКодКоммАванса[СпКолАванс] = КоммАв;
	  end;
	end;

	СВсего=0;
	КодАвПред = КодАв;
	КоммАвПред = КоммАв;
      else
	СВсего=СВсего + GetFieldN(РОбл,i,"ВСЕГОПОК");
      end;
    end;
  Finally
    CloseWorkArea(РОбл);
  End;

end;

func НайтиНовыйКодАванса:String;
var РОбл, КолЗап, ЦелАванс:Integer;

  РОбл = OpenWorkArea("СчетФактПост","КодАванса","Аванс");
  Try
    КолЗап = Records(РОбл);
    if КолЗап>0 then ЦелАванс = int(GetFieldS(РОбл, колЗап, "КодАванса"));
    else
      ЦелАванс = 0;
    end;
  Finally
    CloseWorkArea(РОбл);
  End;

  ^Раб.Формат.StrZ(ЦелАванс + 1, 6);
end;

func ВыборКодАванса_ПриВходе(Клетка:String; Итер: Integer):Logical;
var i,НомерКодаАванса:Integer;
var НовыйКоммент:String;
var ТипЗакрытияБланка:Integer; -- 0 -- ничего не делать, 1 - выбрали код аванса , 2 - добавление нового кода
  if РеквП<>nil then
    ПостроитьСписокАвансов;

    if СпКолАванс>0 then -- Если нашли авансы
      ClearVariable(Раб.СписокАвансов.КОДАВАНСА);
      ClearVariable(Раб.СписокАвансов.Комментарий);
      Раб.СписокАвансов.секКолАв = спКолАванс;
      Раб.СписокАвансов.ИзАванса = Аванс;
      for i=1..спКолАванс do
	Раб.СписокАвансов.КОДАВАНСА[i] = СпКодАванса[i];
	Раб.СписокАвансов.Комментарий[i] = СпКодКоммАванса[i];
      end;
      OpenBlank("Раб.СписокАвансов");
      ТипЗакрытияБланка = Раб.СписокАвансов.ТипЗакрытияБланка;

    else -- Если списка нет, то нужно создать код
      if Аванс then
	if EnqOkCancel("Незакрытые счета-фактуры поставщиков отсутствуют. Создать новый код аванса поставщика?")=CmOk then
	  ТипЗакрытияБланка = 2;
	else
	  ТипЗакрытияБланка = 0;
	end;
      else
	message("Незакрытые авансовые счета-фактуры отсутствуют.");
	ТипЗакрытияБланка = 0;
      end;
    end;

    if ТипЗакрытияБланка = 1 then
      НомерКодаАванса = Раб.СписокАвансов.НомерВыбранногоАванса;
      КодАванса = СпКодАванса[НомерКодаАванса];
      КоммАванса = СпКодКоммАванса[НомерКодаАванса];
      ВСЕГОПОКСТ =0;СТО2=0;СУМ2=0;СТО18СТ =0;СУМ18СТ=0;СТО1СТ=0;СУМ1СТ=0;СУМ3СТ=0;
     |ТипЗакрытияБланка = 2 then
       if(Input(НовыйКоммент,"Введите комментарий к новому коду авансов")=CmOk) then
	 КодАванса = НайтиНовыйКодАванса;
	 КоммАванса = НовыйКоммент;
       else
	  КодАванса  = "";
	  КоммАванса = "";
       end;
       ВСЕГОПОКСТ =0;СТО2=0;СУМ2=0;СТО18СТ =0;СУМ18СТ=0;СТО1СТ=0;СУМ1СТ=0;СУМ3СТ=0;
    end;
  else
    message("Пожалуйста, введите поставщика.");
    шаблон.поле="НАИМПОСТ";
  end;

 ^false;
end;


---------------

proc ОбработатьАвансы_ПриНажатии(Кнопка: String);
  EditorApply;
--  Раб.Бух.СторнироватьСФПОСТ(""); -- Без учета текущего аванса в с.ф.
  Раб.Бух.СторнироватьСФПОСТ(КодАванса);
end;


proc КодАванса_ПриВыходе(Клетка:String; Итер: Integer);
  ВСЕГОПОКСТ  =0;
  СТО2СТ      =0;
  СУМ2СТ      =0;
  СТО18СТ     =0;
  СУМ18СТ     =0;
  СТО1СТ      =0;
  СУМ1СТ      =0;
  СУМ3СТ      =0;
  КоммАванса  ="";
end;


Конец