--~~~~~~~~~~~~~~~~2Фирма "ДИЦ", Турбо Бухгалтер 6.07~~~~~~~~~~~~~~~~~~~~~--
--								       --
-- 2Подсистема ТБ0:Стандартный комплект				       --
--=====================================================================--
--			 НАЗВАНИЕ БЛАНКА			       --
--		Книга регистрации исходящих счетов-фактур	       --
-------------------------------------------------------------------------
--								       --
--		 Краткое описание назначения картотеки		       --
--	     в соответствующей подсистеме Турбо Бухгалтера	       --
--								       --
--=====================================================================--
-- Список картотек, используемых данным бланком:		       --
-- 1.РЕЕСТР_ИСХ_СФ						       --
-- 2.								       --
-- 3.								       --
-------------------------------------------------------------------------
-- Список бланков, процедуры из которых используются данным бланком:   --
-- 1.								       --
-- 2.								       --
-- 3.								       --
-------------------------------------------------------------------------
-- Список картотек, имеющих поля-ссылки на данную картотеку:	       --
-- 1.								       --
-- 2.								       --
-- 3.								       --
-------------------------------------------------------------------------
-- Список бланков, использующих поля данной картотеки:		       --
-- 1.								       --
-- 2.								       --
-- 3.								       --
--=====================================================================--
-- 2Автор бланка0:Фойгель И.М.	      2Дата создания0:28.04.2001	       --
--								       --
-- 2Дата модификации0:						       --
--								       --
-- 2Бланк сопровождает:0Фойгель И.М.				       --
--_____________________________________________________________________--

БланкСШаблоном "Книга регистрации исходящих счетов-фактур", РЕДАКТОР РЕЕСТР_ИСХ_СФ;

--======================================================================--
--<<<<<<<<<<<<<<< ОБЪЕКТЫ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ БЛАНКА >>>>>>>>>>>>>>>--
--======================================================================--

---------------------------------------------------------
--================= ОБЪЕКТЫ ШАБЛОНА ===================--
---------------------------------------------------------

---------------------------------------------------------
--=========== ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ БЛАНКА ============--
---------------------------------------------------------

КолСтрокНаСтр:Integer=42; -- количество строк на странице
Проведенные  :Logical; -- флаг для формирования только по проведенным документам

--- Для процедуры ВстСтр --------

var RoblR    :Integer;
var RSubOblR :Integer;
var вНстр    :Integer; -- номер страницы
var вПп      :Integer; -- Номер по порядку
var вНСФ     :String;  -- номер счет-фактуры
var вДВыписки:Date;    -- дата выписки
var вСчетФ   :Record;  -- ссылка на СФ;
var вНаимОрг :String;  -- Наименование организации
var вСуммаВал:Numeric; -- Сумма валютная
var вВалюта  :String;  -- Валюта
var вНДС     :Numeric; -- Сумма НДС
var вСуммаНДС:Numeric; -- Сумма с НДС
var ННСтр    :Integer; -- номер строки на текущей странице
var НКартСтр :Integer; -- номер картотечой страницы
var КолЗап   :Integer; -- количество записей в картотеке СФ
var вНачНДС	:Numeric; -- начальная сумма НДС;
var вНачСуммаНДС:Numeric; -- начальная сумма с НДС;
------------------------
Кн	     :String  = "";
Вал[]	     :String  = if(Строки[$].Валюта='', 'РУБ', Строки[$].Валюта);
УбратьВалюту :Logical; -- Убрать колонок с валютой.

ИтогоНДС     :Numeric = SumOfArray(Строки[].НДС)  + НачНДС;
Итого	     :Numeric = SumOfArray(Строки[].СуммаНДС) + НачСуммаСНДС;

Шапка	     :Section;
Таблица      :Section;

Секция_НачСуммы:Integer = if(НомСтр>1 and (НачНДС<>0 or НачСуммаСНДС<>0),1,0);

кнЗаполнение :Object;


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

--======================================================================--
--<<<<<<<<<<<<<<<<<<<<<<<<< ПРОЦЕДУРЫ БЛАНКА >>>>>>>>>>>>>>>>>>>>>>>>>>>--
--======================================================================--

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

---------------------------------------------------------
--============ ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ ==============--
---------------------------------------------------------
proc УстановкаУмолчаний; -- Используется при создании нового листа документа
var Rec:Record;
  ДатаС  = Раб.ПЕР.S; -- Начальная дата
  ДатаПо = Раб.ПЕР.F; -- Конечная дата
  НомСтр = 1;	      -- номер страницы
  Rec=РАБ.Обл.ПервЗапись("Контрагент","","Наше");
  if Rec<>nil:
    Наим = GetCardFieldS("КонтрАгент",Rec,"ПолнИмя");
  end;
end;

proc ВстСтр; -- Вставка страниц в документ
var НомЗап:Integer;
  if вПП<=КолСтрокНаСтр:
   -- вставка в текущую страницу
    InsertFrame(Строки, Строки+1);
    Строки[Строки].ПП	    = вПП;
    Строки[Строки].НСФ	    = вНСФ;
    Строки[Строки].ДВыписки = вДВыписки;
    Строки[Строки].НаимОрг  = вНаимОрг;
    Строки[Строки].НДС	    = вНДС;
    Строки[Строки].СуммаНДС = вСуммаНДС;
    Строки[Строки].СчетФакт = вСчетФ;
    Строки[Строки].Валюта   = вВалюта;
    Строки[Строки].СуммаВал = вСуммаВал;
    ННСтр		    = ННСтр+1;
    вПП 		    = вПП+1;

    вНачНДС = вНачНДС + вНДС;
    вНачСуммаНДС = вНачСуммаНДС + вСуммаНДС;

  else
    -- вставка в картотечные страницы
    if ННСтр=КолСтрокНаСтр+1: -- создаем новую картотечную страницу
      if RSubOblR<>0: CloseWorkArea(RSubOblR); end;
      hint('Создается '+str(НКартСтр)+' страница из '+str((колзап/КолСтрокНаСтр),0));
      НКартСтр = НКартСтр+1;
      НомЗап   = InsertRecord(RoblR);
      НомЗап   = PutFieldS(RoblR,НомЗап,"НАИМ",   Наим);
      НомЗап   = PutFieldD(RoblR,НомЗап,"ДАТАС",  ДАТАС);
      НомЗап   = PutFieldD(RoblR,НомЗап,"ДАТАПО", ДАТАПО);
      НомЗап   = PutFieldI(RoblR,НомЗап,"НОМСТР", НКартСтр);

      НомЗап   = PutFieldN(RoblR,НомЗап,"НачНДС", вНачНДС);
      НомЗап   = PutFieldN(RoblR,НомЗап,"НачСуммаСНДС", вНачСуммаНДС);

      RSubOblR = OpenArray(RoblR,НомЗап,"СТРОКИ", "НСФ");
      ННСтр    =  1;
    end;
    НомЗап = InsertRecord(RSubOblR);
    НомЗап = PutFieldI(RSubOblR,НомЗап,"ПП",	   вПП);
    НомЗап = PutFieldS(RSubOblR,НомЗап,"НСФ",	   вНСФ);
    НомЗап = PutFieldD(RSubOblR,НомЗап,"ДВЫПИСКИ", вДВЫПИСКИ);
    НомЗап = PutFieldS(RSubOblR,НомЗап,"НАИМОРГ",  вНАИМОРГ);
    НомЗап = PutFieldN(RSubOblR,НомЗап,"НДС",	   вНДС);
    НомЗап = PutFieldN(RSubOblR,НомЗап,"СуммаНДС", вСУММАНДС);
    НомЗап = PutFieldR(RSubOblR,НомЗап,"СЧЕТФАКТ", вСчетФ);
    НомЗап = PutFieldN(RSubOblR,НомЗап,"СУММАВал", вСУММАВал);
    НомЗап = PutFieldS(RSubOblR,НомЗап,"Валюта",   вВалюта);
    вПП    = вПП+1;
    ННСтр  = ННСтр+1;

    вНачНДС = вНачНДС + вНДС;
    вНачСуммаНДС = вНачСуммаНДС + вСуммаНДС;
  end;
end;

proc ЗаполнениеКниги; -- Заполнение книги
var ROblSF:Integer;
var Filtr:String;
var i:Integer;
var Валюта:String;
  ОчиститьПеременную(Строки);
  RSubOblR=0;
  НКартСтр=1;
  ННСтр=1;
  вНстр=1;
  вПп=1;
  вНачНДС=0;
  вНачСуммаНДС=0;
  НачНДС=0;
  НачСуммаСНДС=0;
  filtr="Дата>="+DateToString(ДатаС)+" and Дата<"+DateToString(ДатаПоФильтр)+if(Проведенные," and Проводить","");
  RoblSF=OpenWorkArea("СчетФакт","Дата",filtr);
  Try
    КолЗап=records(RoblSF);
    RoblR=OpenWorkArea("РЕЕСТР_ИСХ_СФ","","");
    Try
      BeginChanging(RoblR);
      Try
	for i=1..КолЗап do
	  вНСФ	    = GetFieldS(RoblSF,i,"НОМЕРБУМ");
	  вДВыписки = GetFieldD(RoblSF,i,"ДАТА");
	  вНаимОрг  = GetFieldS(RoblSF,i,"Покуп");
	  Валюта    = Up(GetFieldS(RoblSF,i,"Валюта"));
	  if Валюта='': Валюта='РУБ'; end;
	  вВалюта   = Валюта;
	  if Валюта<>'РУБ':
	    вСуммаВал=GetFieldN(RoblSF,i,"ВСЕГОДОК");
	  else
	    вСуммаВал=0;
	  fi;
	  вНДС	    = ПересчетВРуб(GetFieldN(RoblSF,i,"Сто2")+GetFieldN(RoblSF,i,"Сто18")+GetFieldN(RoblSF,i,"Сто1"), Валюта, вДВыписки);
	  вСуммаНДС = ПересчетВРуб(GetFieldN(RoblSF,i,"ВсегоДок"), Валюта, ВдВыписки);
	  вСчетФ    = GetRecordKey(RoblSF,i);
	  ВстСтр;
	end;
	EndChanging(RoblR);
      Except
	CancelChanging(RoblR);
	raise;
      End;
    Finally
      CloseWorkArea(RoblR);
    End;
  Finally
    CloseWorkArea(RoblSF);
  End;
  if Строки>0:
    EditorApply;
    message('Бланк заполнен.');
  else
    message('Счетов-фактур за этот период не найдено.');
  fi;
end;

proc УдалениеСтарыхСтраниц; -- Удаляет старые сформированные страницы за текущий период
var Robl:Integer;
var i, кол:Integer;
  Robl=OpenWorkArea('РЕЕСТР_ИСХ_СФ','','ДатаС='+DateToString(ДатаС)+' and ДатаПо='+DateToString(ДатаПо)+'and НомСтр>1');
  Try
    кол=records(Robl);
    if кол>0 :
	 BeginChanging(Robl);
	 Try
	   for i=1..кол do
	     DeleteRecord(Robl,i);
	   end;
	   EndChanging(Robl);
	 Except
	   CancelChanging(Robl);
	   raise;
	 End;
     end;
  Finally
    CloseWorkArea(Robl);
  End;
end;

proc ОтображениеВалютныхКолонок;
  if УбратьВалюту:
      Шапка.Column(7,ColVisible,false);
      Шапка.Column(8,ColVisible,false);
      Таблица.Column(7,ColVisible,false);
      Таблица.Column(8,ColVisible,false);
  else
      Шапка.Column(7,ColVisible,true);
      Шапка.Column(8,ColVisible,true);
      Таблица.Column(7,ColVisible,true);
      Таблица.Column(8,ColVisible,true);
  fi;
end;

proc ОтображениеКнЗаполнение;
  if НомСтр>1: 
    кнЗаполнение.Enabled=false;
  else
    кнЗаполнение.Enabled=true;
  end;
end;

---------------------------------------------------------
--====== ПРОЦЕДУРЫ-ОБРАБОТЧИКИ СОБЫТИЙ ШАБЛОНА ========--
---------------------------------------------------------

proc ПриСчитывании;
  if НомСтр=0:
    УстановкаУмолчаний;
  end;
  ОтображениеВалютныхКолонок;
  ОтображениеКнЗаполнение;
end;


---------------------------------------------------------
--======= ПРОЦЕДУРЫ-ОБРАБОТЧИКИ СОБЫТИЙ ПОЛЕЙ =========--
---------------------------------------------------------
---------------------------------------------------------
--======= ПРОЦЕДУРЫ-ОБРАБОТЧИКИ ОБЪЕКТОВ ШАБЛОНА ======--
---------------------------------------------------------

func СчетФактНомерБум_ПриОбзоре(Сек:String;Итер:Integer;Столб:Integer;Тек:String):String;
var Robl:Integer;
  if  Строки[Итер].СчетФакт<>nil:
    OpenBlank('ДОКУМЕНТЫ.СЧЕТА.СФ',true,Строки[Итер].СчетФакт);
  else
    Robl=OpenWorkArea('СчетФакт','','НОМЕРБУМ="'+Строки[Итер].НСФ+'"'+'and Дата='+DateToString(Строки[Итер].ДВыписки));
    Try
      if Records(Robl)>0:
	OpenBlankEditor('ДОКУМЕНТЫ.СЧЕТА.СФ',Robl,1);
      else
	message('Выбранная с.ф. в картотеке не найдена.');
      fi;
    Finally
      CloseWorkArea(Robl);
    End;
  fi;
  шаблон.HideEditor(false);
  ^'';
end;


func Кн_ПриВходе(Поле:String;Итер:Integer):Logical;
  СчетФактНомерБум_ПриОбзоре(Поле,Итер,0,'');
  ^false;
end;

proc кнЗаполнение_ПриНажатии(Об:String); -- Заполнение листов документа;
  УдалениеСтарыхСтраниц;
  ЗаполнениеКниги;
end;

proc кнПериод_ПриНажатии(Об:String); -- Выбор периода формирования
  OpenBlank("Раб.ПЕР");
  ДатаС =Раб.ПЕР.S;
  ДатаПо=Раб.ПЕР.F;
end;

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

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

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

proc флУбратьВалюту_ПриИзменении(Флаг:String);
  ОтображениеВалютныхКолонок;
end;

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


Конец
