
BlankWithTemplate  "Формирование файлов в формате ФНС";

  кнЗакрыть		  :Object;
  кнДопРеквизиты	  :Object;
  кнОбновить		  :Object;
  кнПроверить		  :Object;
  кнСформировать	  :Object;
  Флаг_Старые		  :Object;
  Флаг_Печатать 	  :Object;
  Флаг_Принтер		  :Object;
  Флаг_БарКоды		  :Object;
  Флаг_ТолькоП		  :Object;
  Надпись_ВсегоФорм	  :Object;

  ПоказыватьСтарые	  :Logical = [False];
  ПечататьФормы 	  :Logical = [False];
  ОдинПринтер		  :Logical = [True];
  BarCodeUse		  :Logical = [False];
  OnlyPrint		  :Logical = [False];

  ДатаФормирования	  :Date;
  ПутьВыгрузки		  :String;
  Общ_ОтправительФИО	  :String;
  Общ_ОтправительДолж	  :String;
  Общ_ОтправительТФ	  :String;
  Общ_ИФНСОтпр		  :String  = [ИНФО.ОИ.Код1+ИНФО.ОИ.Код2+ИНФО.ОИ.Код3+ИНФО.ОИ.Код4];
  НачНомер		  :Integer = [1];
  Выгр_Формат2		  :Logical = [True];

  var Максимум_ДляНомера  :Integer; -- = 3;
  var Выбор_Все 	  :String  = "ь";
  var Выбор_Ничего	  :String  = "ы";
  var ИмяФайлаВсе	  :String  = "ь";
  var ИмяФайлаНичего	  :String  = "ы";

  var кнНаим		  :String  = "";
  var кнИмяФ		  :String  = "";
  var стрОбщОтпр	  :String  = "<общий отправитель>";
  var стрПринтер	  :String  = "<!!!печать отменена!!!>";
  var ИНН_ИЧП		  :String  = ЭкспортМНС.ОбщиеФункции.MNS_Предст_ИНН;

      сохр_ИмяФормы[]	  :String;
      сохр_Выгружать[]	  :Logical;
      сохр_ИмФайл[]	  :Logical;
      сохр_ПорНомер[]	  :String;
      сохр_ОтпрФИО[]	  :String;
      сохр_ОтпрДолж[]	  :String;
      сохр_ОтпрТФ[]	  :String;

      секцияПозиции	  :Section;
  var Позиции		  :Integer;
  var ИмяФормы[]	  :String;
  var НомерСтроки[]	  :Integer = $;
  var Выгружать[]	  :Logical;
  var ИмФайл[]		  :Logical;
  var Наименование[]	  :String;
  var КНД[]		  :String;
  var ВерсияФормата[]	  :String;
  var ПорядковыйНомер[]   :String;
  var ИМНС[]		  :String;
  var ОтправительФИО[]	  :String;
  var ОтправительДолж[]   :String;
  var ОтправительТФ[]	  :String;
  var ОтчетныйГод[]	  :String;
  var НалоговыйПериод[]   :Integer;
  var ОтчетныйПериод[]	  :String;
  var ВидДокумента[]	  :Integer;
  var Корректировка[]	  :Integer;
  var ИНН[]		  :String;
  var КПП[]		  :String;
  var XML[]		  :Logical;
  var MNS_Shema[]	  :String;
  var MNS_GUID[]	  :String;
  var РегНомерФСС[]	  :String;
  var РегНомерПФР[]	  :String;
  var ИмяФайла[]	  :String  = if(Выгружать[$], if(Length(ИНН[$])=0:		 "!Не задан ИНН"

							|(Length(ИНН[$])>0 and
							  Length(ИНН[$])<10) or
							 Up(SubStr(ИНН[$], 1, 3))="НЕТ": "!Неверный ИНН"

							|Length(ИНН[$])=12 and
							 ИНН[$]<>ИНН_ИЧП and
							 SubStr(ИНН[$], 1, 2)="00":	 "!Неправильно введен ИНН"

							|Length(ОтчетныйГод[$])<4:	 "!Неверный отч.год"


							|(substr(ВерсияФормата[$],1,1)="3" or substr(ВерсияФормата[$],1,1)="2") and (not ИмФайл[$] and ПорядковыйНомер[$]="" or
							 ПорядковыйНомер[$]="000000"):	     "!Не задан пор.номер"

							|(substr(ВерсияФормата[$],1,1)="3" or substr(ВерсияФормата[$],1,1)="2") and (not ИмФайл[$] and ПорядковыйНомер[$]<>"" and
							 Length(ПорядковыйНомер[$])<>6):  "!Неверный пор.номер"

							|(substr(ВерсияФормата[$],1,1)="7" and ПорядковыйНомер[$]="" or
							 ПорядковыйНомер[$]="00000"):	    "!Не задан пор.номер"
							|(substr(ВерсияФормата[$],1,1)="7" and ПорядковыйНомер[$]<>"" and
							 Length(ПорядковыйНомер[$])<>5):  "!Неверный пор.номер"

							|(substr(ВерсияФормата[$],1,1)="3" or substr(ВерсияФормата[$],1,1)="2") and (ИмФайл[$] and ПорядковыйНомер[$]="" or
							 ПорядковыйНомер[$]="00000000"):       "!Не задан пор.номер"

--							  |(substr(ВерсияФормата[$],1,1)="3" or substr(ВерсияФормата[$],1,1)="2") and (ИмФайл[$] and ПорядковыйНомер[$]<>"" and
--							   Length(ПорядковыйНомер[$])<>6):  "!Неверный пор.номер"


							|True:	if(substr(ВерсияФормата[$],1,1)="3"  or substr(ВерсияФормата[$],1,1)="2",ЭкспортМНС.ОбщиеФункции.MNS_CreateFileName(ИНН[$],КПП[$], ИМНС[$], ОтчетныйГод[$], ПорядковыйНомер[$], ИмФайл[$], ВерсияФормата[$]),
								if(substr(ВерсияФормата[$],1,1)="4"  or substr(ВерсияФормата[$],1,1)="5",ЭкспортМНС.ОбщиеФункции.MNS_CreateFileNameXML(ИМНС[$],ИНН[$],КПП[$],MNS_Shema[$],ПорядковыйНомер[$], ИмФайл[$]),
								if(substr(ВерсияФормата[$],1,1)="0", ЭкспортМНС.ОбщиеФункции.MNS_CreateFileNameFSSXML(РегНомерФСС[$],ОтчетныйГод[$],ОтчетныйПериод[$],ИмФайл[$]),
								if(substr(ВерсияФормата[$],1,1)="7", ЭкспортМНС.ОбщиеФункции.MNS_CreateFileNamePFRXML(ОтчетныйГод[$],РегНомерПФР[$],ПорядковыйНомер[$],ИмФайл[$])))))),"");

  var БарКоды[] 	  :Logical;

  var Декларация[]	  :String;
  var Декларация_БК[]	  :Logical;

  var Форма_БухОтчетность :String = "Отчеты.Баланс.БухОтчетность";
--  var Форма_БалансФ1Ф2    :String = "Отчеты.Баланс.БалансФ1Ф2";
--  var Форма_БалансФ1	    :String = "Отчеты.Баланс.БалансФ1";
--  var Форма_БалансФ2	    :String = "Отчеты.Баланс.БалансФ2";
--  var Форма_БалансФ3	    :String = "Отчеты.Баланс.БалансФ3";
--  var Форма_БалансФ4	    :String = "Отчеты.Баланс.БалансФ4";
--  var Форма_БалансФ5	    :String = "Отчеты.Баланс.БалансФ5";
--  var Форма_БалансФ6	    :String = "Отчеты.Баланс.БалансФ6";
  var Форма_ИГБ 	  :String = "Отчеты.Налоги.Н1.ИГБ";
  var Форма_НДС 	  :String = "Отчеты.Налоги.Н3.НДС";
  var Форма_НДС_Ноль	  :String = "Отчеты.Налоги.Н3.НДС0";
  var Форма_НДС_Бел	  :String = "Отчеты.Налоги.Н3.НДС_Беларусь";
  var Форма_НДС_Тамож	  :String = "Отчеты.Налоги.Н3.НДС_ТаможСоюз";
  var Форма_Акциз1	  :String = "Отчеты.Налоги.Н3.Акциз_Прил1";
  var Форма_Акциз3	  :String = "Отчеты.Налоги.Н3.Акциз_Прил3";
  var Форма_Акциз5	  :String = "Отчеты.Налоги.Н3.Акциз_Прил5";
  var Форма_Акциз7	  :String = "Отчеты.Налоги.Н3.Акциз_Прил7";
  var Форма_Акциз9	  :String = "Отчеты.Налоги.Н3.Акциз_Прил9";
  var Форма_ИмуНал	  :String = "Отчеты.Налоги.Н4.ИмуНал";
  var Форма_ИмуНал_Аванс  :String = "Отчеты.Налоги.Н4.ИмуНал_Аванс";
  var Форма_Земля	  :String = "Отчеты.Налоги.Н5.Земля";
  var Форма_Земля_Аванс   :String = "Отчеты.Налоги.Н5.Земля_Аванс";
  var Форма_ЕНВД	  :String = "Отчеты.Налоги.Н6.Декларация_ЕНВД";
  var Форма_УСНО	  :String = "Отчеты.Налоги.Н6.Декларация_УСНО";
  var Форма_ЕдинаяУпрощенная:String = "Отчеты.Налоги.Н6.ЕдинаяУпрощенная";
  var Форма_Транспорт	  :String = "Отчеты.Налоги.Н7.Транспорт";
  var Форма_Транспорт_Аванс:String = "Отчеты.Налоги.Н7.Транспорт_Аванс";
  var Форма_Вода	  :String = "Отчеты.Налоги.Н8.Вода";
  var Форма_Ископаемые	  :String = "Отчеты.Налоги.Н8.Ископаемые";
  var Форма_Недра	  :String = "Отчеты.Налоги.Н8.Недра";
  var Форма_ОкрСредаП1	  :String = "Отчеты.Налоги.Н8.Окр10";
  var Форма_ОкрСредаП2	  :String = "Отчеты.Налоги.Н8.Ок10";
  var Форма_СреднеСписочная:String = "Отчеты.Налоги.Н9.Среднесписочная";

  var Форма_ФСС 	  :String;
  var Форма_РСВ1	  :String;
  var Форма_ЕСН_Декл	  :String;
  var Форма_ЕСН_Аванс	  :String;
  var Форма_ПФР_Декл	  :String;
  var Форма_ПФР_Аванс	  :String;
  var Форма_ЕСН_БЗ_Декл   :String = "Зарплата.Отчеты.ЕСН_Декларация";
  var Форма_ЕСН_БЗ_Аванс  :String = "Зарплата.Отчеты.ЕСН_Аванс";
  var Форма_ПФР_БЗ_Декл   :String = "Зарплата.Отчеты.ПФР_Декларация";
  var Форма_ПФР_БЗ_Аванс  :String = "Зарплата.Отчеты.ПенсСтрах_Аванс";
  var Форма_ЕСН_Стд_Декл  :String = "Отчеты.Налоги.ЕСН.Декларация";
  var Форма_ЕСН_Стд_Аванс :String = "Отчеты.Налоги.ЕСН.Аванс";
  var Форма_ПФР_Стд_Декл  :String = "Отчеты.Налоги.ЕСН.Декларация_ПФР";
  var Форма_ПФР_Стд_Аванс :String = "Отчеты.Налоги.ЕСН.АвансПенс";
  var Форма_ЕСХН	  :String = "Отчеты.Налоги.СХ.НалДекларЕСХН";
  var Форма_Приб	  :String = "НалогУчет.Декларация";
  var Форма_Приб_Ин	  :String = "НалогУчет.Декларация_Нал_Приб_Иностр";
  var Форма_РасчетПриб_Ин :String = "НалогУчет.Расчет_Нал_Приб_Иностр";
  var Форма_ДоходВнеРФ	  :String = "НалогУчет.ДекНалВнеРФ";

  var Форма_ФСС_Стд	  :String = "ОТЧЕТЫ.ФОНДЫ.ФСС";
  var Форма_ФСС_БЗ	  :String = "Зарплата.Отчеты.ФОНДЫ.ФСС";
  var Форма_РСВ1_Стд	  :String = "Отчеты.Фонды.РСВ_1";
  var Форма_РСВ1_БЗ	  :String = "Зарплата.Отчеты.Фонды.РСВ_1";

  func НайтиИндексНастройки(aName :String; aAdd :Logical):Integer;
    var I :Integer;

    for I=1 to LengthOfArray(сохр_ИмяФормы) do
      if Up(aName)=Up(сохр_ИмяФормы[I]) then
	Return(I);
      end;
    end;
    I = 0;
    if aAdd then
      I 	       = LengthOfArray(сохр_ИмяФормы)+1;
      сохр_ИмяФормы[I] = Up(aName);
    end;
    Return(I);
  end;

  proc СохранитьНастройки;
    var I, vIndex :Integer;

    for I=1 to LengthOfArray(ИмяФормы) do
      vIndex = НайтиИндексНастройки(ИмяФормы[I], True);
      сохр_Выгружать[vIndex]  = Выгружать[I];
      сохр_ИмФайл[vIndex]     = ИмФайл[I];
      сохр_ПорНомер[vIndex]   = ПорядковыйНомер[I];
      сохр_ОтпрФИО[vIndex]    = ОтправительФИО[I];
      сохр_ОтпрДолж[vIndex]   = ОтправительДолж[I];
      сохр_ОтпрТФ[vIndex]     = ОтправительТФ[I];
    end;
  end;

  proc СчитатьИзНастройки(aIndex :Integer);
    var vIndex :Integer;

    if aIndex>0 then
      vIndex = НайтиИндексНастройки(ИмяФормы[aIndex], False);
      if vIndex>0 then
	ИмяФормы[aIndex]	  = сохр_ИмяФормы[vIndex];
	Выгружать[aIndex]	  = сохр_Выгружать[vIndex];
	ИмФайл[aIndex]		  = сохр_ИмФайл[vIndex];
	ПорядковыйНомер[aIndex]   = сохр_ПорНомер[vIndex];

	if ОтправительФИО[aIndex] = "" and сохр_ОтпрФИО[vIndex]<>"" then

	  ОтправительФИО[aIndex]  = сохр_ОтпрФИО[vIndex];
	  ОтправительДолж[aIndex] = сохр_ОтпрДолж[vIndex];
	  ОтправительТФ[aIndex]   = сохр_ОтпрТФ[vIndex];
	end;

	if ОтправительФИО[aIndex] = "" or
	   ОтправительФИО[aIndex] = Общ_ОтправительФИО then

	  ОтправительФИО[aIndex]  = стрОбщОтпр;
	  ОтправительДолж[aIndex] = "";
	  ОтправительТФ[aIndex]   = "";
	end;
      end;
    end;
  end;

  proc кнСформировать_Переименовать;
    if OnlyPrint then
      кнСформировать.Caption = "Печ&ать";
    else
      кнСформировать.Caption = "Сформиров&ать";
    end;
  end;

  Func ДатаФормирования_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
    ДатаФормирования = Calendar(ДатаФормирования);
    Template.HideEditor(False);
    Return("");
  end;

  Func ПутьВыгрузки_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
    var vPath :String;

    vPath = ПутьВыгрузки;
    if ChooseFolder(vPath, "Выбор пути выгрузки")=cmOK then
      ПутьВыгрузки = vPath;
    end;

    Template.HideEditor(False);
    Return("");
  end;

  proc ЗаписатьОбщегоОтправителя;
    var I :Integer;

    for I=1 to LengthOfArray(Наименование) do
      ОтправительФИО[I]  = стрОбщОтпр;
      ОтправительДолж[I] = "";
      ОтправительТФ[I]	 = "";
    end;
  end;

  Proc Отправитель_OnExit(FieldName: String; Iter: Integer);
    var I, vIndex :Integer;

    if	  FieldName="ОтправительФИО"  and ОтправительФИО[Iter]="" then
      ОтправительФИО[Iter]  = стрОбщОтпр;
      ОтправительДолж[Iter] = "";
      ОтправительТФ[Iter]   = "";

    elsif FieldName="Общ_ОтправительФИО"  or
	  FieldName="Общ_ОтправительДолж" or
	  FieldName="Общ_ОтправительТФ"   then

      vIndex = 0;
      for I=1 to LengthOfArray(Наименование) do
	if ОтправительФИО[I]<>"" and ОтправительФИО[I]<>стрОбщОтпр then
	  vIndex = vIndex+1;
	end;
      end;
      if vIndex>0 and ((FieldName="Общ_ОтправительФИО"	and Общ_ОтправительФИО <>"")  or
		       (FieldName="Общ_ОтправительДолж" and Общ_ОтправительДолж<>"")  or
		       (FieldName="Общ_ОтправительТФ"	and Общ_ОтправительТФ  <>"")) then

	if EnqOkCancel("При вводе общего отправителя, данные введенные^Mиндивидуально для каждой формы будут удалены^M^MПродолжить?")=cmOk then
	  ЗаписатьОбщегоОтправителя;
	else
	  if	FieldName="Общ_ОтправительФИО"	then Общ_ОтправительФИО  = "";
	  elsif FieldName="Общ_ОтправительДолж" then Общ_ОтправительДолж = "";
	  elsif FieldName="Общ_ОтправительТФ"	then Общ_ОтправительТФ	 = "";
	  else
	  end;
	end;
      else
	ЗаписатьОбщегоОтправителя;
      end;
    else
    end;
  end;

  proc Выгрузка_ВсегоФорм;
    var I, vCount :Integer;

    vCount = 0;
    for I=1 to LengthOfArray(Наименование) do
      if Выгружать[I] then
	vCount = vCount+1;
      end;
    end;
    Надпись_ВсегоФорм.Caption = "Всего форм для выгрузки: "+Str(vCount);
  end;

  Proc Выгрузка_Все_OnClick(Row: Integer; Col: Integer; Double: Logical);
    var I :Integer;

    for I=1 to LengthOfArray(Наименование) do
      Выгружать[I] = True;
    end;
    Выгрузка_ВсегоФорм;
  end;

  Proc Выгрузка_Нич_OnClick(Row: Integer; Col: Integer; Double: Logical);
    var I :Integer;

    for I=1 to LengthOfArray(Наименование) do
      Выгружать[I] = False;
    end;
    Выгрузка_ВсегоФорм;
  end;

  Func Выгрузка_OnEnter(FieldName: String; Iter: Integer): logical;
    if	  Up(FieldName)="Выбор_Все"    then Выгрузка_Все_OnClick(0, 0, False);
    elsif Up(FieldName)="Выбор_Ничего" then Выгрузка_Нич_OnClick(0, 0, False);
    else
    end;
    Return(False);
  end;

  Func Выгружать_OnEnter(FieldName: String; Iter: Integer): logical;
    Выгружать[Iter] = Not Выгружать[Iter];
    if Выгружать[Iter] and (substr(ВерсияФормата[Iter],1,1)="4" or substr(ВерсияФормата[Iter],1,1)="5") then
       ПорядковыйНомер[Iter]=SubStr(GetGUID, 2, Length(GetGUID)-2);
    elsif Not Выгружать[Iter] and (substr(ВерсияФормата[Iter],1,1)="4" or substr(ВерсияФормата[Iter],1,1)="5") then
       ПорядковыйНомер[Iter]="";
    end;
    Выгрузка_ВсегоФорм;
    Return(False);
  end;

  Proc Наименование_OnClick(Row: Integer; Col: Integer; Double: Logical);
    var vIndex :Integer;

    vIndex = AsInteger(Template.Frame);
    if vIndex>0 and LengthOfArray(ИмяФормы)>0 then
      if ИмяФормы[vIndex]<>"" and BlankExist(ИмяФормы[vIndex]) then
	OpenBlank(ИмяФормы[vIndex], False);
      end;
    end;
  end;

  Func Наименование_OnEnter(FieldName: String; Iter: Integer): logical;
    Наименование_OnClick(0, 0, False);
    Return(False);
  end;

  Proc ПорядковыйНомер_OnExit(FieldName: String; Iter: Integer);
    var I, vLength :Integer;

    if substr(ВерсияФормата[Iter],1,1)="3" or substr(ВерсияФормата[Iter],1,1)="2" or substr(ВерсияФормата[Iter],1,1)="7" then
       Максимум_ДляНомера=if(ИмФайл[Iter],if(substr(ВерсияФормата[Iter],1,1)="3" or substr(ВерсияФормата[Iter],1,1)="2",8,5),if(substr(ВерсияФормата[Iter],1,1)="3" or substr(ВерсияФормата[Iter],1,1)="2",6,5));
       if ПорядковыйНомер[Iter]<>"" then
	  vLength = Length(ПорядковыйНомер[Iter]);
	  if	vLength<Максимум_ДляНомера then
	    for I=1 to Максимум_ДляНомера-vLength do
	      ПорядковыйНомер[Iter] = "0"+ПорядковыйНомер[Iter];
	    end;
	  elsif vLength>Максимум_ДляНомера then
	    ПорядковыйНомер[Iter] = SubStr(ПорядковыйНомер[Iter], 1, Максимум_ДляНомера);
	  else
	  end;
       end;
    end;
  end;

  func Макс_НачНомер :Integer;
    var vMax, I :Integer;
    var vStr	:String;

    if НачНомер<1 then
      НачНомер = 1;
    else
      vMax     = 0;
      for I=1 to LengthOfArray(Наименование) do
	if Выгружать[I] then
	  vMax = vMax+1;
	end;
      end;
      vStr     = "";
      for I=1 to Максимум_ДляНомера do
	vStr = vStr+"9";
      end;
      vMax     = Int(vStr)-vMax+1;
      НачНомер = if(НачНомер>vMax, vMax, НачНомер);
    end;
    Return(НачНомер);
  end;

  proc ПронумероватьПоУмолчанию(aNumber :Integer);
    var I :Integer;

    Hint("Нумерация по умолчанию...");
    aNumber = if(aNumber<1, 1, aNumber);
    for I=1 to LengthOfArray(Наименование) do
      if Выгружать[I] then
	if substr(ВерсияФормата[i],1,1)<"4"  or substr(ВерсияФормата[i],1,1)="7" then
	   ПорядковыйНомер[I] = Str(aNumber);
	   aNumber	      = aNumber+1;
	end;
	if (substr(ВерсияФормата[i],1,1)="4" or substr(ВерсияФормата[i],1,1)="5") then
	   ПорядковыйНомер[I]=SubStr(GetGUID, 2, Length(GetGUID)-2);
	end;
      else
	ПорядковыйНомер[I] = "";
      end;
      ПорядковыйНомер_OnExit("", I);
    end;
    Hint("");
  end;

  Proc НачНомер_OnExit(FieldName: String; Iter: Integer);
    ПронумероватьПоУмолчанию(Макс_НачНомер);
  end;

  Proc ИмяФайла_OnClick(Row: Integer; Col: Integer; Double: Logical);
    var vIndex :Integer;
    var vFile  :String;

    vIndex = AsInteger(Template.Frame);
    if vIndex>0 and LengthOfArray(ИмяФайла)>0 then
      if    ПутьВыгрузки="" then
	Message("Необходимо выбрать папку...");
	Template.Field = "ПутьВыгрузки";
	Exit;

      elsif ИмяФайла[vIndex]="" or SubStr(ИмяФайла[vIndex], 1, 1) = "!" then
	Message("Выбранный файл содержит ошибки в наименовании и не может быть открыт...");
	Exit;

      elsif Not ExistFile(ПутьВыгрузки+ИмяФайла[vIndex]) then
	Message("Выбранный файл не найден^M(файл либо не сформирован,либо указан неверный путь)");
	Exit;

      else
	if WordInString("xml",ИмяФайла[vIndex],".") then
	   OpenEditor(ПутьВыгрузки+ИмяФайла[vIndex], true);
	else
	   OpenEditor(ПутьВыгрузки+ИмяФайла[vIndex], False);
	end;
      end;
    end;
  end;

  Func ИмяФайла_OnEnter(FieldName: String; Iter: Integer): logical;
    ИмяФайла_OnClick(0, 0, False);
    Return(False);
  end;

  Func ОтправительФИО_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
    var vIndex	      :Integer;
    var ФИО, Долж, ТФ :String;
    var vRecord       :Record;

    vIndex  = if(Sect="секцияПозиции", AsInteger(Template.Frame), 0);
    vRecord = OpenCardFile("Сотрудники");

    if vRecord<>Nil:
      ФИО    = GetCardFieldS("Сотрудники", vRecord, "ФИОТ");
      if GetCardFieldR("Сотрудники", vRecord, "Должность")<>nil then
	Долж = GetCardFieldS("Сотрудники", vRecord, "Должность.Долж");
      end;
      ТФ     = GetCardFieldS("Сотрудники", vRecord, "ТелефонРабочий");

      if vIndex>0 then
	ОтправительФИО[vIndex]	= ФИО;
	ОтправительДолж[vIndex] = Долж;
	ОтправительТФ[vIndex]	= ТФ;
	Отправитель_OnExit("ОтправительФИО", vIndex);
      else
	Общ_ОтправительФИО	= ФИО;
	Общ_ОтправительДолж	= Долж;
	Общ_ОтправительТФ	= ТФ;
	Отправитель_OnExit("Общ_ОтправительФИО", 0);
      end;
    end;

    Template.HideEditor(False);
    Return("");
  end;

  proc ДобавитьФормуВСписок(aName    :String;
			    aBarCode :Logical);
    var vIndex :Integer;
    var vBlank :String;

    if BlankExist(aName) then
      vBlank = GetVariableS(aName+".MNS_BlankName");
      if aName=vBlank then
	vIndex		      = LengthOfArray(Декларация)+1;
	Декларация[vIndex]    = aName;
	Декларация_БК[vIndex] = aBarCode;
      else
	Trace("Ошибка! -> "+aName+" -> Имя бланка отличается от значения в бланке: "+vBlank);
      end;
    end;
  end;

  var СтарыеБланки[] :String;

  proc ДобавитьФорму(aName    :String;
		     aBarCode :Logical);

    var vIndex, I :Integer;

    ДобавитьФормуВСписок(aName, aBarCode);

    if ПоказыватьСтарые then
      ClearVariable(СтарыеБланки);

      vIndex = GetBlankNames(aName+"_Старая*", СтарыеБланки, False, False, False);
      for I=1 to vIndex do
	if VariableExists(СтарыеБланки[I]+".MNS_BlankName") and 
	       FuncExists(СтарыеБланки[I]+".MNS_Export")    then

	  ДобавитьФормуВСписок(СтарыеБланки[I], False);
	end;
      end;
    end;
  end;

  proc CreateArrays;

    ClearVariable(Декларация);	    ClearVariable(Декларация_БК);
    ClearVariable(Позиции);	    ClearVariable(Выгружать);	  ClearVariable(Наименование);
    ClearVariable(КНД); 	    ClearVariable(ИмяФормы);	  ClearVariable(ПорядковыйНомер);
    ClearVariable(ВерсияФормата);   ClearVariable(ИмяФайла);	  ClearVariable(ОтправительФИО);
    ClearVariable(ОтправительДолж); ClearVariable(ОтправительТФ); ClearVariable(ОтчетныйГод);	  
    ClearVariable(НалоговыйПериод); ClearVariable(ВидДокумента);  ClearVariable(Корректировка);   
    ClearVariable(ОтчетныйПериод);
    ClearVariable(ИНН); 	    ClearVariable(КПП); 	  ClearVariable(ИМНС);
    ClearVariable(РегНомерФСС);     ClearVariable(РегНомерПФР);

    Hint("Создание предварительного списка форм...");

    if BlankExist(Форма_ЕСН_БЗ_Декл)  or
       BlankExist(Форма_ЕСН_БЗ_Аванс) or
       BlankExist(Форма_ПФР_БЗ_Декл)  or
       BlankExist(Форма_ПФР_БЗ_Аванс) or
       BlankExist(Форма_ФСС_БЗ) then

      Форма_ФСС       = Форма_ФСС_Стд; -- с 2011 г.
      Форма_РСВ1      = Форма_РСВ1_БЗ;
      Форма_ЕСН_Декл  = Форма_ЕСН_БЗ_Декл;
      Форма_ЕСН_Аванс = Форма_ЕСН_БЗ_Аванс;
      Форма_ПФР_Декл  = Форма_ПФР_БЗ_Декл;
      Форма_ПФР_Аванс = Форма_ПФР_БЗ_Аванс;
    else
      Форма_ФСС       = Форма_ФСС_Стд;
      Форма_РСВ1      = Форма_РСВ1_Стд;
      Форма_ЕСН_Декл  = Форма_ЕСН_Стд_Декл;
      Форма_ЕСН_Аванс = Форма_ЕСН_Стд_Аванс;
      Форма_ПФР_Декл  = Форма_ПФР_Стд_Декл;
      Форма_ПФР_Аванс = Форма_ПФР_Стд_Аванс;
    end;

    ДобавитьФорму(Форма_БухОтчетность, False);
--    ДобавитьФорму(Форма_БалансФ1Ф2,	 False);
--    ДобавитьФорму(Форма_БалансФ1,	 False);
--    ДобавитьФорму(Форма_БалансФ2,	 False);
--    ДобавитьФорму(Форма_БалансФ3,	 False);
--    ДобавитьФорму(Форма_БалансФ4,	 False);
--    ДобавитьФорму(Форма_БалансФ5,	 False);
--    ДобавитьФорму(Форма_БалансФ6,	 False);

    ДобавитьФорму(Форма_Приб,	       False);

    ДобавитьФорму(Форма_НДС,	       False);
    ДобавитьФорму(Форма_НДС_Бел,       False);
    ДобавитьФорму(Форма_НДС_Тамож,     False);

    ДобавитьФорму(Форма_Акциз1,        False);
    ДобавитьФорму(Форма_Акциз3,        False);
    ДобавитьФорму(Форма_Акциз5,        False);
    ДобавитьФорму(Форма_Акциз9,        False);

    ДобавитьФорму(Форма_ИмуНал_Аванс,  False);
    ДобавитьФорму(Форма_ИмуНал,        False);

    ДобавитьФорму(Форма_ФСС,	       False);
    ДобавитьФорму(Форма_ФСС_БЗ,        False);
    ДобавитьФорму(Форма_РСВ1,	       False);
    ДобавитьФорму(Форма_ЕСН_Аванс,     False);
    ДобавитьФорму(Форма_ПФР_Аванс,     False);
    ДобавитьФорму(Форма_ЕСН_Декл,      False);
    ДобавитьФорму(Форма_ПФР_Декл,      False);

    ДобавитьФорму(Форма_УСНО,	       False);
    ДобавитьФорму(Форма_ЕНВД,	       False);
    ДобавитьФорму(Форма_ЕСХН,	       True);

    ДобавитьФорму(Форма_ИГБ,	       True);

    ДобавитьФорму(Форма_Приб_Ин,       False);
    ДобавитьФорму(Форма_РасчетПриб_Ин, True);
    ДобавитьФорму(Форма_ДоходВнеРФ,    True);

    ДобавитьФорму(Форма_ЕдинаяУпрощенная,False);
    ДобавитьФорму(Форма_СреднеСписочная,False);

    ДобавитьФорму(Форма_Транспорт_Аванс,True);
    ДобавитьФорму(Форма_Транспорт,     True);

    ДобавитьФорму(Форма_Земля_Аванс,   True);
    ДобавитьФорму(Форма_Земля,	       False);
    ДобавитьФорму(Форма_Недра,	       False);
    ДобавитьФорму(Форма_Ископаемые,    False);
    ДобавитьФорму(Форма_Вода,	       True);

    ДобавитьФорму(Форма_НДС_Ноль,      False);
    ДобавитьФорму(Форма_Акциз7,        False);
    ДобавитьФорму(Форма_ОкрСредаП1,    False);
    ДобавитьФорму(Форма_ОкрСредаП2,    False);

    секцияПозиции.FrameCount = LengthOfArray(Наименование);
    Hint("");
  end;

  Proc кнОбновить_OnClick(Sender: String);
    var I, vIndex, vSaveIndex  :Integer;

    if Sender<>"" then
      СохранитьНастройки;
    end;
    CreateArrays;

    Hint("");
    for I=1 to LengthOfArray(Декларация) do
      if BlankExist(Декларация[I]) then
	Hint("Обновление списка - "+ИмяФормы[I]);
	vIndex			= LengthOfArray(Наименование)+1;
	ИмяФормы[vIndex]	= Декларация[I];

	БарКоды[vIndex] 	= if(VariableExists(ИмяФормы[vIndex]+".Bar_Exist"), GetVariableL(ИмяФормы[vIndex]+".Bar_Exist"), Декларация_БК[I]);
	Наименование[vIndex]	= GetVariableS(ИмяФормы[vIndex]+".MNS_ShortName");
	КНД[vIndex]		= GetVariableS(ИмяФормы[vIndex]+".MNS_КНД");

	ПорядковыйНомер[vIndex] = "";
	ВерсияФормата[vIndex]	= GetVariableS(ИмяФормы[vIndex]+".MNS_ВерФОтч");
	if substr(ВерсияФормата[vIndex],1,1)="2" then
	   ИМНС[vIndex] 	   = GetVariableS(ИмяФормы[vIndex]+".ИМНС_Код");
	end;
	if substr(ВерсияФормата[vIndex],1,1)="3" or substr(ВерсияФормата[vIndex],1,1)="4" or substr(ВерсияФормата[vIndex],1,1)="5" then
	   ИМНС[vIndex] 	   = ExecuteFuncS(ИмяФормы[vIndex]+".MNS_ПолучитьИМНС");
	end;
	if substr(ВерсияФормата[vIndex],1,1)="4" or substr(ВерсияФормата[vIndex],1,1)="5" then
	   MNS_Shema[vIndex]	   = GetVariableS(ИмяФормы[vIndex]+".MNS_Shema");
	end;
	if substr(ВерсияФормата[vIndex],1,1)="0" then
	   РегНомерФСС[vIndex]	   = ExecuteFuncS(ИмяФормы[vIndex]+".ПолучитьРегНомер");
	   ОтчетныйПериод[vIndex]  = GetVariableS(ИмяФормы[vIndex]+".НП");
	end;
	if substr(ВерсияФормата[vIndex],1,1)="7" then
	   РегНомерПФР[vIndex]	   = ExecuteFuncS(ИмяФормы[vIndex]+".ПолучитьРегНомерПФР");
	end;
	ВидДокумента[vIndex]	= GetVariableI(ИмяФормы[vIndex]+".ВД1");
	Корректировка[vIndex]	= GetVariableI(ИмяФормы[vIndex]+".ВД2");
	НалоговыйПериод[vIndex] = GetVariableI(ИмяФормы[vIndex]+".НП");

	ОтправительФИО[vIndex]	= GetVariableS(ИмяФормы[vIndex]+".ОтправительФИО");
	ОтправительДолж[vIndex] = GetVariableS(ИмяФормы[vIndex]+".ОтправительДолж");
	ОтправительТФ[vIndex]	= GetVariableS(ИмяФормы[vIndex]+".ОтправительТФ");

	ОтчетныйГод[vIndex]	= GetVariableS(ИмяФормы[vIndex]+".ОтчГод");
	ИНН[vIndex]		= ExecuteFuncS(ИмяФормы[vIndex]+".MNS_ПолучитьИНН");
	КПП[vIndex]		= ExecuteFuncS(ИмяФормы[vIndex]+".MNS_ПолучитьКПП");
	СчитатьИзНастройки(vIndex);
      end;
    end;

    секцияПозиции.FrameCount = LengthOfArray(Наименование);
    Hint("");
  end;

  func ЗаголовокСообщения(aIndex :Integer; aNew :Logical):String;
    Return(Наименование[aIndex]+":"+if(aNew, "^M^M", ""));
  end;

  func Форма_Формат2(aIndex :Integer):Logical;
    if SubStr(ВерсияФормата[aIndex], 1, 2) = "2." then
      Return(True);
    end;
    Return(False);
  end;

  proc ВыгружаетсяФормат2;
    var I :Integer;

    Выгр_Формат2 = False;
    for I=1 to LengthOfArray(Наименование) do
      if Выгружать[I] then
	if Форма_Формат2(I) then
	  Выгр_Формат2 = True;
	  Exit;
	end;
      end;
    end;
  end;

  func ПроверитьЗаполнение(ПроверитьФайлы :Logical):Logical;
    var I, J, vNumber :Integer;
    var vEnq, vMax    :Integer;
    var vError, vAll  :Logical;
    var vField	      :String;

    vError  = False;
    vNumber = 0;
    Hint("");

    -- Проверить:
    --	 1.*дату формирования
    --	 2.*путь выгрузки
    --	 3. По позициям выгружаемых форм:
    --	    1. порядковый номер
    --	    2. отправителя
    --

    ВыгружаетсяФормат2;

    if	  not ДатаФормирования>01.01.1900 then
      Message("Необходимо выбрать дату формирования файлов...");
      Template.Field = "ДатаФормирования"; 
      Hint(""); Return(True);

    elsif ПутьВыгрузки="" then
      Message("Необходимо выбрать папку для сохранения сформированных файлов...");
      Template.Field = "ПутьВыгрузки";	   
      Hint(""); Return(True);
    elsif Not Existsfolder(ПутьВыгрузки) then
      Message("Выбрана несуществующая папка.");
      Template.Field = "ПутьВыгрузки";	   
      Hint(""); Return(True);

    else

      Hint("Проверка номеров файлов...");
      for I=1 to LengthOfArray(Наименование) do
	if Выгружать[I] then
	  if ПорядковыйНомер[I]="" or ПорядковыйНомер[I]="000" or ПорядковыйНомер[I]="00000" then

	    vMax = Макс_НачНомер;
	    vEnq = EnqOkCancel(ЗаголовокСообщения(I, True)+"Не задан порядковый номер файла^MИсправить нумерацию автоматически (начиная с "+Str(vMax)+")?");
	    if vEnq = cmOk then
	      ПронумероватьПоУмолчанию(vMax);
	      Hint("Проверка номеров файлов...");
	      I = 0; J = LengthOfArray(Наименование)+1; Break;
	    else
	      Hint(""); Return(True);
	    end;
	  else
	    ПорядковыйНомер_OnExit("", I);
	    for J=1 to LengthOfArray(Наименование) do
	      if Выгружать[J] then
		if I<>J and ПорядковыйНомер[I]=ПорядковыйНомер[J] then

		  vMax = Макс_НачНомер;
		  vEnq = EnqOkCancel("У форм с номерами строк "+Str(I)+" и "+Str(J)+" совпадают порядковые номера файлов.^MИсправить нумерацию автоматически (начиная с "+Str(vMax)+")?");
		  if vEnq = cmOk then
		    ПронумероватьПоУмолчанию(vMax);
		    Hint("Проверка номеров файлов...");
		    I = 0; J = LengthOfArray(Наименование)+1; Break;
		  else
		    Hint(""); Return(True);
		  end;
		end;
	      end;
	    end;
	  end;
	end;
      end;
      Hint("");

      vNumber = 0;
      for I=1 to LengthOfArray(Наименование) do
	if Выгружать[I] then
	  Hint("Общая проверка - "+ИмяФормы[I]);
	  if	ИмяФайла[I]="" or SubStr(ИмяФайла[I], 1, 1) = "!" then

	    Message(ЗаголовокСообщения(I, True)+"Необходимо исправить ошибки в имени файла^M(текст ошибки указан в клетке)");
	    Template.Name  = "секцияПозиции";
	    Template.Field = "ИмяФайла";
	    Template.Frame = I;
	    Hint(""); Return(True);

	  elsif ОтправительФИО[I] =стрОбщОтпр then
	    vNumber = vNumber+1;

	  elsif ОтправительФИО[I]<>стрОбщОтпр and Форма_Формат2(I) then
	    if ОтправительФИО[I] = "" or ОтправительДолж[I]= "" then

	      Message(ЗаголовокСообщения(I, True)+"Для выгрузки форм формата 2.хх необходимо выбрать ФИО и должность отправителя (ТФ не обязателен) только для текущей формы или общего отправителя");
	      Template.Name  = "секцияПозиции";
	      Template.Field = "ОтправительФИО";
	      Template.Frame = I;
	      Hint(""); Return(True);
	    end;

	  elsif ОтправительФИО[I]<>стрОбщОтпр and Not Форма_Формат2(I) then
	    if ОтправительФИО[I] = "" then

	      Message(ЗаголовокСообщения(I, True)+"Для выгрузки форм формата 3.хх необходимо выбрать ФИО отправителя (Должность и ТФ не обязательны) только для текущей формы или общего отправителя");
	      Template.Name  = "секцияПозиции";
	      Template.Field = "ОтправительФИО";
	      Template.Frame = I;
	      Hint(""); Return(True);
	    end;

	  else
	  end;
	end;
      end;

      if vNumber>0 then
	if Выгр_Формат2 then
	  if Общ_ОтправительФИО  = "" or Общ_ОтправительДолж = "" then
	    Message("ФИО и должность для общего отправителя (ТФ не обязателен) не выбраны, но используются в выгрузке форм формата 2.х...");
	    Template.Field = "Общ_ОтправительФИО"; Hint(""); Return(True);
	  end;
	else
	  if Общ_ОтправительФИО  = "" then
	    Message("ФИО общего отправителя (Должность и ТФ не обязательны) не выбрано, но используется в выгрузке форм формата 3.х...");
	    Template.Field = "Общ_ОтправительФИО"; Hint(""); Return(True);
	  end;
	end;
      end;

      vNumber = 0;
      for I=1 to LengthOfArray(Наименование) do
	if Выгружать[I] and BlankExist(ИмяФормы[I]) then
	  Hint("Проверка заполнения - "+ИмяФормы[I]);
	  if ProcExists(ИмяФормы[I]+".СохранитьРаздел_Все") then
	    ExecuteProc(ИмяФормы[I]+".СохранитьРаздел_Все");
--	      Trace("+"+ИмяФормы[I]);
--	    else
--	      Trace("-"+ИмяФормы[I]);
	  end;
	  vError  = ExecuteFuncL(ИмяФормы[I]+".MNS_Verify", False);
	  vNumber = vNumber+1;

	  if vError then
	    vField = GetVariableS(ИмяФормы[I]+".MNS_ErrorField");
	    if vField<>"" then
	      OpenBlank(ИмяФормы[I], False);
	      ExecuteProc(ИмяФормы[I]+".SetFocusOnError");
	    end;
	    Hint(""); Return(True);
	  end;
	end;
      end;

      if ПроверитьФайлы then
	Hint("Проверка наличия файлов...");
	vAll = False;
	for I=1 to LengthOfArray(Наименование) do
	  if Выгружать[I] and not vAll then
	    if ExistFile(ПутьВыгрузки+ИмяФайла[I]) then
	      J = Enquiry("", "Файл "+ИмяФайла[I]+" в папке "+ПутьВыгрузки+" уже существует^MПри дальнейшем формировании он будет перезаписан^MПродолжить?", "Да;Перезаписать все;Отменить", mtWarning);
	      if (J= 1 or J= 2) and ExtractWord(2,ИмяФайла[I],".")="xml" then
		 DeleteFile(ПутьВыгрузки+ИмяФайла[I]);
	      end;
	      if    J = 2 then 
		 vAll = True;
	      elsif J = 3 then Hint(""); Return(True);
	      else
	      end;
	    end;
	  elsif Выгружать[I] and vAll then
	      if (J= 1 or J= 2) and ExtractWord(2,ИмяФайла[I],".")="xml" then
		 DeleteFile(ПутьВыгрузки+ИмяФайла[I]);
	      end;
	  end;
	end;
	Hint("");
      end;

    end;
    if vNumber=0 and not vError then
      Message("Не выбраны формы для выгрузки...");
      Template.Name  = "секцияПозиции";
      Template.Field = "Выгружать";
      Template.Frame = 1;
      Hint(""); Return(True);
    end;
    Hint(""); Return(False);
  end;

  Proc кнПроверить_OnClick(Sender: String);
    if	  OnlyPrint then
      Message("При установленном флаге 'Только печать документов' проверка выключена");
    elsif Not OnlyPrint And Not ПроверитьЗаполнение(False) then
      Message("Проверка завершена...^MОшибок нет");
    end;
  end;

  proc кнСформировать_OnClick(Sender: String);
    var I, vNumber	:Integer;
    var vErrorCode	:String;
    var ИсхФИО,  ФИО	:String;
    var ИсхДолж, Долж	:String;
    var ИсхТФ,	 ТФ	:String;
    var ИсхBarCode	:Logical;
    var vFileMNS	:String;
    var vPrinter	:String;
    var vTime		:Integer;
    var vError, vBarC	:Logical;

    vNumber = 0; 
    vTime   = Time;
    Hint("");

    кнОбновить_OnClick("кнОбновить");
    if Not OnlyPrint then				 -- Если задано формирование
      vError = ПроверитьЗаполнение(True);		 -- Проверяем формы
    end;

    if OnlyPrint or (Not vError) then			 -- Если только печать или формирование и нет ошибок
      for I=1 to LengthOfArray(Наименование) do
	if Выгружать[I] and BlankExist(ИмяФормы[I]) then -- Если выгружать и заданный бланк существует

	  if Not OnlyPrint then 			 -- Если задано формирование, то проверяем форму
	    vError = ExecuteFuncL(ИмяФормы[I]+".MNS_Verify", False);
	  end;

	  if OnlyPrint or (Not vError) then		 -- Если только печать или формирование и нет ошибок

	    Hint("Формирование - "+ИмяФормы[I]);

	    vErrorCode = "";
	    vFileMNS   = "";

	    if Not OnlyPrint then			 -- Если задано формирование
	      ИсхФИО	 = GetVariableS(ИмяФормы[I]+".ОтправительФИО");
	      ИсхДолж	 = GetVariableS(ИмяФормы[I]+".ОтправительДолж");
	      ИсхТФ	 = GetVariableS(ИмяФормы[I]+".ОтправительТФ");
	      ИсхBarCode = GetVariableL(ИмяФормы[I]+".BarCodeUse");

	      if ОтправительФИО[I] = стрОбщОтпр then	 -- Если задан общий отправитель, берем его
		ФИО   = Общ_ОтправительФИО;
		Долж  = Общ_ОтправительДолж;
		ТФ    = Общ_ОтправительТФ;
	      else					 --   иначе берем индивидуально для каждой формы
		ФИО   = ОтправительФИО[I];
		Долж  = ОтправительДолж[I];
		ТФ    = ОтправительТФ[I];
	      end;

	      PutVariableS(ИмяФормы[I]+".ОтправительФИО",  ФИО);
	      PutVariableS(ИмяФормы[I]+".ОтправительДолж", Долж);
	      PutVariableS(ИмяФормы[I]+".ОтправительТФ",   ТФ);

	      if IsBlankOpen(ИмяФормы[I]) then Close(ИмяФормы[I]); end;
	      vErrorCode = ExecuteFuncS(ИмяФормы[I]+".MNS_Export", True, True, ПутьВыгрузки, ПорядковыйНомер[I], 1, ДатаФормирования);
	      if ПечататьФормы and vErrorCode="" then	 -- Если задана печать док-ов после формирования, то берем имя файла
		vFileMNS = ЭкспортМНС.ОбщиеФункции.MNS_FileName;
		if vFileMNS<>"" and not ExistFile(vFileMNS) then
		  vErrorCode = "Файл "+vFileMNS+" не найден";
		end;
	      end;
	    end;

	    if OnlyPrint or (ПечататьФормы and vErrorCode="") then -- Только печать или печать с формированием
	      if vPrinter<>стрПринтер and ((ОдинПринтер and vPrinter="") or (Not ОдинПринтер)) then

		vPrinter = "";
		if Not ChoosePrinter(vPrinter, ЗаголовокСообщения(I, False)+" Выбор принтера...")=cmOk then
		  if Not OnlyPrint then 		 -- Выбор принтера
		    if EnqOkCancel(ЗаголовокСообщения(I, True)+"Печать документа отменена^MПродолжить формирование файлов без печати?") = cmOk then
		      vPrinter = стрПринтер;
		    else
		      Hint(""); Exit;
		    end;
		  else
		    Hint(""); Exit;
		  end;
		end;
	      end;

	      if vPrinter<>"" and vPrinter<>стрПринтер then -- Принтер задан, печатаем
		if IsBlankOpen(ИмяФормы[I]) then Close(ИмяФормы[I]); end;
		vBarC = if(Not OnlyPrint and (BarCodeUse and AsLogical(Флаг_БарКоды.Enabled)), БарКоды[I], False);
		PutVariableL(ИмяФормы[I]+".BarCodeUse", vBarC);
		OpenBlank   (ИмяФормы[I], False);
		ExecuteProc (ИмяФормы[I]+".Напечатать", vFileMNS, vPrinter);
		Close	    (ИмяФормы[I]);
	      end;
	    end;

	    if Not OnlyPrint then			 -- Если задано формирование
	      PutVariableS(ИмяФормы[I]+".ОтправительФИО",  ИсхФИО);	ИсхФИО	   = "";
	      PutVariableS(ИмяФормы[I]+".ОтправительДолж", ИсхДолж);	ИсхДолж    = "";
	      PutVariableS(ИмяФормы[I]+".ОтправительТФ",   ИсхТФ);	ИсхТФ	   = "";
	      PutVariableL(ИмяФормы[I]+".BarCodeUse",	   ИсхBarCode); ИсхBarCode = False;
	    end;

	    if vErrorCode="" then
	      vNumber = vNumber+1;
	    else
	      if EnqOkCancel(ЗаголовокСообщения(I, True)+vErrorCode+"^M^MПродолжить?") = cmCancel then
		Hint(""); Exit;
	      end;
	    end;
	  end;
	end;
      end;
      if vNumber>0 and vErrorCode="" then
	Message("Выгрузка завершена...^MСформировано "+Str(vNumber)+" файл(а/ов)^M^MВремя выполнения "+Str(Time-vTime)+" сек.");
      end;
    end;
    Hint("");
  end;

  Proc Флаги_OnChange(Sender: String);
    if	  Sender="Флаг_Печатать" then
      Флаг_Принтер.Enabled    = False;
      Флаг_БарКоды.Enabled    = False;

      if ПечататьФормы then
	Флаг_Принтер.Enabled  = True;
	Флаг_БарКоды.Enabled  = True;
	OnlyPrint	      = False;
      end;
    elsif Sender="Флаг_ТолькоП" then
      Флаг_Принтер.Enabled    = False;
      Флаг_БарКоды.Enabled    = False;

      if OnlyPrint then
	ПечататьФормы	      = False;
	Флаг_Принтер.Enabled  = True;
      end;
    elsif Sender="Флаг_Старые" then
      кнОбновить_OnClick("");
      Выгрузка_ВсегоФорм;
    else
    end;
    кнСформировать_Переименовать;
  end;

  proc СисДата;
    var I :Integer;
--    if Today<01.07.2007 then
--	 for I=1 to LengthOfArray(Наименование) do
--	    ИмФайл[I] = False;
--	 end;
--    else
--	 for I=1 to LengthOfArray(Наименование) do
--	    ИмФайл[I] = True;
--	 end;
--    end;
    if Today<01.10.2008 then
       for I=1 to LengthOfArray(Наименование) do
	  ИмФайл[I] = False;
       end;
    else
       for I=1 to LengthOfArray(Наименование) do
	  ИмФайл[I] = True;
       end;
    end;
  end;

  Proc Template_OnOpen(Create: Logical);
    Флаги_OnChange("Флаг_Печатать");
    кнОбновить_OnClick("");
    СисДата;
    Выгрузка_ВсегоФорм;
  end;

  Proc Template_OnClose(Destroy: Logical);
    СохранитьНастройки;
  end;

  Proc кнДопРеквизиты_OnClick(Sender: String);
    OpenBlank("ЭкспортМНС.Реквизиты_Ф2", False);
  end;

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

  Proc кнЗакрыть_OnClick(Sender: String);
    Close;
  end;


  Func ИмФайл_OnEnter(FieldName: String; Iter: Integer): logical;
    var k    :Integer;
    ИмФайл[Iter] = Not ИмФайл[Iter];
    k=pos("0",ПорядковыйНомер[Iter]);
    while k=1 do
      ПорядковыйНомер[Iter]=delete(ПорядковыйНомер[Iter],1,k);
      k=pos("0",ПорядковыйНомер[Iter]);
    end;
    ПорядковыйНомер_OnExit(ПорядковыйНомер[Iter],Iter);
    Return(False);
  end;

  Proc ИмяФайлаВсе_OnClick(Row: Integer; Col: Integer; Double: Logical);
    var I :Integer;

    for I=1 to LengthOfArray(Наименование) do
      if Выгружать[I] then
	 ИмФайл[I] = True;
      end;
    end;
  end;

  Proc ИмяФайлаНич_OnClick(Row: Integer; Col: Integer; Double: Logical);
    var I :Integer;
    for I=1 to LengthOfArray(Наименование) do
      ИмФайл[I] = False;
    end;
  end;

  Func НаимФайла_OnEnter(FieldName: String; Iter: Integer): logical;
    if	  Up(FieldName)="ИмяФайлаВсе"	 then ИмяФайлаВсе_OnClick(0, 0, False);
    elsif Up(FieldName)="ИмяФайлаНичего" then ИмяФайлаНич_OnClick(0, 0, False);
    else
    end;
    Return(False);
  end;

Proc ОбщИФНСОтпр_OnExit(Поле: String; Итер: Integer);
    if Общ_ИФНСОтпр = "" then
       Общ_ИФНСОтпр = (ИНФО.ОИ.Код1+ИНФО.ОИ.Код2+ИНФО.ОИ.Код3+ИНФО.ОИ.Код4);
    end;
end;

Proc ПутьВыгрузки_OnExit(Поле: String; Итер: Integer);
  if Pos(':',ПутьВыгрузки)=0 then
     ПутьВыгрузки = ПутьВыгрузки + ':';
  end;
  if Pos('\',ПутьВыгрузки)=0 then
     ПутьВыгрузки = ПутьВыгрузки + '\';
  end;
  ПутьВыгрузки = Up(ПутьВыгрузки);
end;

End

