БЛАНКСШАБЛОНОМ "Отчеты по НФА";
var SORT_MENU	:s='01';
var BTNNAME_MENU:s='Обороты НФА';
РасчетТолькоОстаткиК:l;
var Пользователь:s;
var Схема	:s;
папка:s;
BUTTON1:O;
BUTTON2:O;
BUTTON3:O;
BUTTON5:O;
BUTTON6:O;
--BUTTON8:O;
EDIT1:O;
EDIT2:O;
EDIT3:O;
EDIT5:O;
EDIT6:O;
EDIT7:O;
EDIT8:O;
ПЕР10_СЕКЦИЯ:СЕКЦИЯ;
ПЕР30_СЕКЦИЯ:СЕКЦИЯ;
ПЕР10_СЕКЦИЯ_Ц:СЕКЦИЯ;
ПЕР30_СЕКЦИЯ_Ц:СЕКЦИЯ;
ПЕР4_СЕКЦИЯ   :СЕКЦИЯ;
ФЛТолько106:l;
ФлПоказыватьЦены:l;
ФлВыводГрупп	 :O;ВыводГрупп	   :l;
ФлУчетОст	 :O;УчетОст	   :l;
ФлУчетОстН	 :O;УчетОстН	   :l;
ФлУчетОстК	 :O;УчетОстК	   :l;
ФлМеньшеНульОстН :O;МеньшеНульОстН :l;
ФлНульОстН	 :O;НульОстН	   :l;
ФлБольшеНульОстН :O;БольшеНульОстН :l;
ФлМеньшеНульОстК :O;МеньшеНульОстК :l;
ФлНульОстК	 :O;НульОстК	   :l;
ФлБольшеНульОстК :O;БольшеНульОстК :l;
ФлУчетОбо	 :O;УчетОбо	   :l;
ФлМеньшеНульОбо  :O;МеньшеНульОбо  :l;
ФлНульОбо	 :O;НульОбо	   :l;
ФлБольшеНульОбо  :O;БольшеНульОбо  :l;
ФлУчетВНПР	 :O;УчетВНПР	   :l;
УчетДопАнализ:l;
расчитывать_доп:l;
расчитывать_доп_:s='Расчитывать доп столбец';
ИСТ1:l; ИСТ1_:l;
ИСТ2:l; ИСТ2_:l;
ИСТ3:l; ИСТ3_:l;
ИСТ4:l; ИСТ4_:l;
количество_доп:l;
var количество_доп_:s='количество';  
сумма_доп:l;
var сумма_доп_:s='сумма';
цена_доп:l;
var цена_доп_:s='цена';
количество_доп_у:i;
сумма_доп_у:i;
цена_доп_у:i;
количество_доп_з:n;
сумма_доп_з:n;
цена_доп_з:n;

Датадоп:d;
Условие_доп:i;
Датдоп:s=if(Условие_доп=0:'Остаток на '+datetostring(Датадоп)|Условие_доп=1:'Оборот на '+datetostring(Датадоп));

--УчетОст      :l;
--МеньшеНульОст:l;
--НульОст      :l;
--БольшеНульОст:l;

--УчетОбо      :l;
--МеньшеНульОбо:l;
--НульОбо      :l;
--БольшеНульОбо:l;
var NN[]:i=$;
var СчетНФА :С=if(ФЛТолько106,"*.?.106.??!|ЗАБ.??.106*","*.?.101.??!|*.?.105.??!|ЗАБ.??.*");
var СчетПок :С=if(ФЛТолько106,"*.?.106.??!|ЗАБ.??.106*","*.?.101.??!|*.?.105.??!|ЗАБ.??.*");
var СчетПост:С=if(ФЛТолько106,"*.?.106.??!|ЗАБ.??.106*","*.?.101.??!|*.?.105.??!|ЗАБ.??.*");
Материал:С;
Организация:С;
Покупатель:С;
Склад:С;
СчетОтчета:С;
ОтчетВыбор:s;
ОтчетВыборЗап:record;
ДопПр:s;
--var Путь :String=PlanVar("НФА")+"\Отчеты\НФАОТЧ.lst";
func Путь:s;
 ^PlanVar("НФА")+"\Отчеты\НФАОТЧ.lst";
end;
var Buf[] :String;

Отчет:Ц;
var едСумма:s=if(Отчет=4,'','Сумма');
var sprav:s=if(ОТЧЕТ=0:'НФА'|ОТЧЕТ=1:'МОЛ'|ОТЧЕТ=2:'К'|ОТЧЕТ=3:'М'|ОТЧЕТ=4:'НФА'|ОТЧЕТ=5:'НФА'|ОТЧЕТ=6:'НФА');
Отч:Ц;
var ПЕР10:Ц=ЕСЛИ((ОТЧЕТ=0 or ОТЧЕТ=5)and not ФлПоказыватьЦены ,1  , 0);
var Отч0 :Ц=ЕСЛИ((ОТЧЕТ=0 or ОТЧЕТ=5)and not ФлПоказыватьЦены ,Отч, 0);
var ПЕР30:Ц=ЕСЛИ((ОТЧЕТ=0 or ОТЧЕТ=5)and not ФлПоказыватьЦены ,1  , 0);

var ПЕР10_Ц:Ц=ЕСЛИ((ОТЧЕТ=0 or ОТЧЕТ=5)and ФлПоказыватьЦены ,1	, 0);
var Отч0_Ц :Ц=ЕСЛИ((ОТЧЕТ=0 or ОТЧЕТ=5)and ФлПоказыватьЦены ,Отч, 0);
var ПЕР30_Ц:Ц=ЕСЛИ((ОТЧЕТ=0 or ОТЧЕТ=5)and ФлПоказыватьЦены ,1	, 0);

var ПЕР14:Ц=ЕСЛИ(ОТЧЕТ=1 ИЛИ ОТЧЕТ=2 ИЛИ ОТЧЕТ=3 ИЛИ ОТЧЕТ=4 ,1  ,0);
var Отч4: Ц=ЕСЛИ(ОТЧЕТ=1 ИЛИ ОТЧЕТ=2 ИЛИ ОТЧЕТ=3 ИЛИ ОТЧЕТ=4 ,Отч,0);
var ПЕР34:Ц=ЕСЛИ(ОТЧЕТ=1 ИЛИ ОТЧЕТ=2 ИЛИ ОТЧЕТ=3 ИЛИ ОТЧЕТ=4 ,1  ,0);
ОТЧ0_СЕКЦИЯ:секция;
ОТЧ0_СЕКЦИЯ_Ц:секция;
ОТЧ4_СЕКЦИЯ:секция;

var Имяотчета:С= "Отчет (бланки, не менять!!!)";--+Имяформы

ДатНач:ДАТА=[Dat(1, 1, Year(СЕГОДНЯ))]; Дат:ДАТА=[СЕГОДНЯ];
НаименГР_СПОСОБ:l;-- Наименование группы
var Наимен[]:СТРОКА;
var НаименПР[]:СТРОКА;
var НаименГР[]:СТРОКА;
var ОстатокНРуб[]:Ч;	    
var ОстатокНШт[]:Ч;
var НЦенаОст[]:Ч;
var КупленоРуб[]:Ч;	    
var КупленоШт []:Ч;
var ЦенаКупли[]:Ч;
var ПроданоРуб []:Ч;
var ПроданоШт  []:Ч;
var ЦенаПродажи[]:Ч;
var ОстатокРуб[]:Ч;	    
var ОстатокШт []:Ч;
var ЦенаОст[]:Ч;
var Прибыль[]:Ч;
var ДопКол []:Ч;
var ДопСум []:Ч;
var ДопЦен []:Ч;
ДопСпр:s=if(ФЛТолько106,'ФКР.*','УЧН.*');
var НФА_ДопСпрАн[] :String;
var НФА0_ДопСпрАн[] :String;
var НФА1_ДопСпрАн[] :String;
var ДопАн[] :String;

var ДопКолВсего:Ч ;
var ДопСумВсего:Ч ;
var ДопЦенВсего:Ч ;


var ОстатокНРубВсего:Ч;     
var ОстатокНШтВсего:Ч;
var КупленоРубВсего:Ч;	    
var КупленоШтВсего :Ч;
var ПроданоРубВсего:Ч;	    
var ПроданоШтВсего :Ч;
var ОстатокРубВсего:Ч;	    
var ОстатокШтВсего :Ч;
var ПрибыльВсего:Ч;

var ОстатокНЦ[]:Ч=ОстатокНРуб[$]/ОстатокНШт[$];
var КупленоЦ[]:Ч=КупленоРуб[$]/КупленоШт[$];
var ПроданоЦ[]:Ч=ПроданоРуб[$]/ПроданоШт[$];
var ОстатокЦ[]:Ч=ОстатокРуб[$]/ОстатокШт[$];
var ЕдИзм[] :String;
var Фильтртовара:С=МАТЕРИАЛ;
var Фильтрпоставщик:С=ЕСЛИ(ДЛИНА(ОРГАНИЗАЦИЯ)>0,ЕСЛИ(ДЛИНА(Фильтртовара)>0,"&","")+ОРГАНИЗАЦИЯ,"");
var Фильтрпокупатель:С=ЕСЛИ(ДЛИНА(ПОКУПАТЕЛЬ)>0,ЕСЛИ(ДЛИНА(Фильтртовара+Фильтрпоставщик)>0,"&","")+ПОКУПАТЕЛЬ,"");
var Фильтрсклад:С=ЕСЛИ(ДЛИНА(СКЛАД)>0,ЕСЛИ(ДЛИНА(Фильтртовара+Фильтрпоставщик+Фильтрпокупатель)>0,"&","")+СКЛАД,"");
var ФильтрДопПр:С=ЕСЛИ(ДЛИНА(ДопПр)>0,ЕСЛИ(ДЛИНА(Фильтртовара+Фильтрпоставщик+Фильтрпокупатель+Фильтрсклад)>0,"&","")+ДопПр,"");
--Делитель:С=ЕСЛИ(ДЛИНА(Фильтрпоставщик+Фильтрпокупатель+ФильтрМОЛ+Фильтрсклад+Фильтрсделка)>0,"/","")
var Фильтротчета:С=Фильтртовара+Фильтрпоставщик+Фильтрпокупатель+Фильтрсклад+ФильтрДопПр;
var Sort0:s;
var Sort1:s;
var Sort2:s;
var ОТЧЕТ_	    :i;
var Покупатель_     :s;
var ОРГАНИЗАЦИЯ_    :s;
var СКЛАД_	    :s;
var СчетОтчета_     :s;
var Место_секция    :s;
var Место_строка    :i;
var Место_столбец   :i;
var Место_поле	    :s;
var ДействПоДопСпр[]:s;
КакСчитатьДопСчета:i;
var Условие_доп_счета:s=if(ФЛТолько106,'*.?.106.??.???','*.?.104.??.???|*.?.101.??.???');

КнПредОтчет:объект;

proc clearvar;
clearvariable(ДействПоДопСпр);
clearvariable(Отч);
clearvariable(Отч0);
clearvariable(Отч4);
clearvariable(Наимен	 );
clearvariable(НаименПР	 );
clearvariable(ОстатокНРуб);
clearvariable(ОстатокНШт );
clearvariable(НЦенаОст	 );
clearvariable(КупленоРуб );
clearvariable(КупленоШт  );
clearvariable(ЦенаКупли  );
clearvariable(ПроданоРуб );
clearvariable(ПроданоШт  );
clearvariable(ЦенаПродажи);
clearvariable(ОстатокРуб );
clearvariable(ОстатокШт  );
clearvariable(ЦенаОст	 );
clearvariable(Прибыль	 );
clearvariable(Buf	 );
clearvariable(НаименГР	 );
clearvariable(ДопАн	 );
clearvariable(ДопКол	 );
clearvariable(ДопСум	 );
clearvariable(ДопЦен	 );
clearvariable(НФА_ДопСпрАн);
clearvariable(НФА0_ДопСпрАн);
clearvariable(НФА1_ДопСпрАн);
clearvariable(ЕдИзм);

clearvariable(ОстатокНШтВсего );
clearvariable(ОстатокНРубВсего);
clearvariable(КупленоШтВсего  );
clearvariable(КупленоРубВсего );
clearvariable(ПроданоШтВсего  );
clearvariable(ПроданоРубВсего );
clearvariable(ОстатокШтВсего  );
clearvariable(ОстатокРубВсего );
clearvariable(ДопКолВсего     );
clearvariable(ДопСумВсего     );
clearvariable(ДопЦенВсего     );

end;
func ВзятьНаименГР(wa:i;NFA:s):s;
  var ii:i;
  ii=ВзятьНомерЗаписи(wa,ПризнакВЗапись(NFA,false));
--  ii=поиск(wa,1,SubStr(NFA,5,6),SubStr(NFA,12,250));
  if ii>0:
    ^GetFieldS(wa,ii,'ГРУППАКОД')+'/'+GetFieldS(wa,ii,if(НаименГР_СПОСОБ,'ГРУППАССЫЛКА','ГРУППАВИД'));
  fi;
  ^'';
end;
proc ЗаполнитьГруппы;
 var ii,wa:i;
 var ss:s;
 var autorefana:l;
 if ВыводГрупп:
   if Отчет=0:
     autorefana=Автообработка;
     ЗадатьАвтообработку(false);
     if Отч0>0:
       wa=OpenWorkArea('РПО_НФА','ГРНФА;ПРИЗНАК');
       ОкноВыполненияПоказать(Отч0,'Заполнение групп НФА...');
       for ii=1..Отч0 do
	ОкноВыполненияПоложение(ii);
	ss=trim(НаименПР[ii]);
	НаименГР[ii]=ВзятьНаименГР(wa,ss);
       od;
       CloseWorkArea(wa);
     fi;
     ОкноВыполненияЗакрыть;
     ЗадатьАвтообработку(autorefana);
   fi;
 fi;

end;
func УслИСТ_флаг:s;
var ss,ss0:s;
var УслИ,УслКроме:s;
  УслИ='';УслКроме='';
  if ИСТ1 и (не ИСТ2) и (не ИСТ3):УслИ='(*.1.???.??.???)';
   | ИСТ2 и (не ИСТ1) и (не ИСТ3):УслИ='(*.2.???.??.???)';
   | ИСТ3 и (не ИСТ1) и (не ИСТ2):УслИ='(*.3.???.??.???)';
   | ИСТ1 и  ИСТ2 и ИСТ3:УслИ='(*.?.???.??.???)';
   | (не ИСТ1) и (не ИСТ2) и (не ИСТ3):УслИ='(*.0.???.??.???)';
   | ИСТ2 и  ИСТ3 и (не ИСТ1):УслКроме='(*.1.???.??.???)';УслИ='(*.?.???.??.???)';
   | ИСТ1 и  ИСТ3 и (не ИСТ2):УслКроме='(*.2.???.??.???)';УслИ='(*.?.???.??.???)';
   | ИСТ1 и  ИСТ2 и (не ИСТ3):УслКроме='(*.3.???.??.???)';УслИ='(*.?.???.??.???)';
  fi;
  if ИСТ4:УслИ=if(УслИ<>'','('+УслИ+'|(ЗАБ.??.*))','(ЗАБ.??.*)');
   | true:УслКроме=if(УслКроме<>'','('+УслКроме+'|(ЗАБ.??.*))','(ЗАБ.??.*)');
  fi;
  if УслИ<>'' и УслКроме<>'':ss='&('+УслИ+'&~'+УслКроме+')';
   | УслИ<>'' и УслКроме= '':ss='&'+УслИ;
   | УслИ= '' и УслКроме<>'':ss='&~'+УслКроме;
   | УслИ= '' и УслКроме= '':ss='';
  fi;
  ^ss;
end;

func УслИСТ_(УчетВНПР_:l):s;
var ss,ss0:s;
  ss=УслИСТ_флаг;
  ss0='('+СчетОтчета+')';
  if not УчетВНПР_:
     ss0=ss0+'/*&~'+ss0;
  fi;
  ss='('+ss0+')'+ss;
  ^ss;
end;
func УслИСТ:s;
  ^УслИСТ_(УчетВНПР);
end;

func СобратьСчетОтчета_доп:s;
^trim(Условие_доп_счета);
  if КакСчитатьДопСчета=2:^trim(Условие_доп_счета);
   | КакСчитатьДопСчета=3:^trim(СчетОтчета);
   | КакСчитатьДопСчета=1:^РАБ.НФА.B01.abl(Условие_доп_счета,'&',УслИСТ);
   | КакСчитатьДопСчета=0:^РАБ.НФА.B01.abl(Условие_доп_счета,'|',УслИСТ);
  fi;
  ^'';
end;
var СчетОтчета_доп:s=СобратьСчетОтчета_доп;

Proc СохранитьМесто(l:l);
 if l:
    Место_секция =КакСтрока(Шаблон.ИМЯ	  ) ;
    Место_поле	 =КакСтрока(Шаблон.Поле   );
    Место_строка =КакЦелое (Шаблон.Кадр   );
    Место_столбец=КакЦелое (Шаблон.столбец);
  | true:
    Шаблон.ИМЯ	  =Место_секция;
    Шаблон.столбец=Место_столбец  ;
--    Шаблон.Поле=Место_поле  ;
    Шаблон.Кадр=Место_строка;
 fi;
-- trace(Место_секция);
-- trace(Место_поле);
-- trace(str(Место_строка));

End;

Proc СохранитьНастройки(l:l);
 if l:
    ОТЧЕТ_	=ОТЧЕТ	    ;
    Покупатель_ =Покупатель ;
    ОРГАНИЗАЦИЯ_=ОРГАНИЗАЦИЯ;
    СКЛАД_	=СКЛАД	    ;
    СчетОтчета_ =СчетОтчета ;
--    ИСТ1_=ИСТ1;
--    ИСТ2_=ИСТ2;
--    ИСТ3_=ИСТ3;
--    ИСТ4_=ИСТ4;
  | true:
    ОТЧЕТ      =ОТЧЕТ_	    ;
    Покупатель =Покупатель_ ;
    ОРГАНИЗАЦИЯ=ОРГАНИЗАЦИЯ_;
    СКЛАД      =СКЛАД_	    ;
    СчетОтчета =СчетОтчета_ ;
--    ИСТ1=ИСТ1_;
--    ИСТ2=ИСТ2_;
--    ИСТ3=ИСТ3_;
--    ИСТ4=ИСТ4_;
 fi;
 КнПредОтчет.Visible=l;
End;
var aAna[]:s;
func ЗаполнитьНФА_ДопСпрАн:i;
var СчетОтчета_доп_,ДопСпр_,nameFile:s;
var искл_спр,ss,nfa,dopan:s;
var Режим:l;
var len,i,xx,z,p:i;
var aDate:d;
var aSum1,aSum2:n;
var aVal1,aVal2:s;
var aDeb,aCre:s;
var aComment:s;

 clearvariable(НФА_ДопСпрАн);
 clearvariable(НФА0_ДопСпрАн);
-- clearvariable(НФА1_ДопСпрАн);
-- искл_спр='К|ПБС|Ф|МОЛ|ПЕРИОД|ВД|ДВИЖ_НФА|ДНФА|ММДД|ГГ|М|КТ|ВП|НФА_УМПЕР|НФА_УВПЕР';
 искл_спр='К|ПБС|Ф|МОЛ|ПЕРИОД|ВД|ДВИЖ_НФА|ДНФА|ММДД|ГГ|М|КТ|ВП';
 СчетОтчета_доп_=СчетОтчета_доп;
 ДопСпр_=substr(ДопСпр,1,pos('.',ДопСпр)-1);
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Подготовка...");
 Try
   nameFile=PlanVar('CACHE')+"\"+GetGUID;
--   len=TujReport(nameFile, 1.1.100, Датадоп, СчетОтчета_доп_, Раб.НФА.B01.abl(Фильтротчета,'&',ДопСпр), искл_спр, "", "", TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna, False);
   if УчетДопАнализ and not расчитывать_доп:
      len=TujReport(nameFile, 1.1.100, Дат+1, СчетОтчета, Раб.НФА.B01.abl(Фильтротчета,'&',ДопСпр), искл_спр, "", "", TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna+if(ИСТ4,TujRepZabalance,0), False);
    | УчетДопАнализ and расчитывать_доп:
      len=TujReport(nameFile, 1.1.100, Датадоп, СчетОтчета_доп_, Раб.НФА.B01.abl(Фильтротчета,'&',ДопСпр), искл_спр, "", "", TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna+if(ИСТ4,TujRepZabalance,0), False);
   fi;
   if len>0:
     OpenTextJur(nameFile);
     Try
       ShowProgress(len, "Обработка данных...");
       i=1;
--	 ClearVariable(LSTНФА); ClearVariable(LSTСУМ); ClearVariable(LSTКОЛ);
--	 ClearVariable(LSTДА1); ClearVariable(LSTДА2); ClearVariable(LSTДА3);
--	 ClearVariable(txtМОЛ); ClearVariable(txtМХЭ); ClearVariable(txtDANA);
--	 dd=ToDay; ToDayStr=Str(Day(dd))+Str(Mon(dd))+Str(Year(dd));
--	 мм=0; м1=0; м2=0;
       while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
	 ProgressPos(i);
	 i=i+1;
--	   КОДСЧТ=""; SUM=0.00;
	 xx=LengthOfArray(aAna);
	 ss='';nfa='';dopan='';
	 if xx>0:
	    for z=1..xx do
	      if nfa='':
		 if pos('НФА.',aAna[z])=1:
		    nfa=substr(aAna[z],1,Pos(":", aAna[z])-1);
		 fi;
	      fi;
	      if dopan='':
		 p=pos(ДопСпр_+'.',aAna[z]);
		 if p=2:
		    if pos(substr(aAna[z],1,1),'+-')>0:
		       dopan=aAna[z];
		    fi;
		  | p=1:dopan=aAna[z];
		 fi;
	      fi;

	      if nfa<>'' and dopan<>'':
		 ss=nfa+'&'+dopan;
		 break;
	      fi;
	    od;
	 fi;
	 if ss<>'':len=поисквмассиве(НФА_ДопСпрАн,ss,true);
	    if len<1:
	       len=insertinarraysort(НФА_ДопСпрАн,ss);
	       insertinarray(НФА0_ДопСпрАн,len,nfa);
	    fi;
	 fi;
       od;
     Finally
       CloseTextJur;
       if ExistFile(nameFile): DeleteFile(nameFile); fi;
     end; -- Try
   fi; -- len
 Finally
   CloseProgress;
   ToggleAutoRefresh(Режим);
 end;
 len=lengthofarray(НФА_ДопСпрАн);
  ^len;
end;
func ЗаполнитьНФА_ДопСпрАн_кроме:i;
var СчетОтчета_доп_,ДопСпр_,nameFile:s;
var искл_спр,ss,nfa,dopan:s;
var Режим:l;
var len,i,xx,z,p:i;
var aDate:d;
var aSum1,aSum2:n;
var aVal1,aVal2:s;
var aDeb,aCre:s;
var aComment:s;

 clearvariable(НФА1_ДопСпрАн);
-- искл_спр='К|ПБС|Ф|МОЛ|ПЕРИОД|ВД|ДВИЖ_НФА|ДНФА|ММДД|ГГ|М|КТ|ВП|НФА_УМПЕР|НФА_УВПЕР';
 искл_спр='К|ПБС|Ф|МОЛ|ПЕРИОД|ВД|ДВИЖ_НФА|ДНФА|ММДД|ГГ|М|КТ|ВП';
 СчетОтчета_доп_=СчетОтчета_доп;
 ДопСпр_=substr(ДопСпр,1,pos('.',ДопСпр)-1);
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Подготовка...");
 Try
   nameFile=PlanVar('CACHE')+"\"+GetGUID;
--   len=TujReport(nameFile, 1.1.100, Датадоп, СчетОтчета_доп_, Раб.НФА.B01.abl(Фильтротчета,'&',ДопСпр), искл_спр, "", "", TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna, False);
   if УчетДопАнализ and not расчитывать_доп:
      len=TujReport(nameFile, 1.1.100, Дат+1, СчетОтчета, Раб.НФА.B01.abl(Фильтротчета,'&~',ДопСпр), искл_спр, "", "", TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna+if(ИСТ4,TujRepZabalance,0), False);
    | УчетДопАнализ and расчитывать_доп:
      len=TujReport(nameFile, 1.1.100, Датадоп, СчетОтчета_доп_, Раб.НФА.B01.abl(Фильтротчета,'&~',ДопСпр), искл_спр, "", "", TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna+if(ИСТ4,TujRepZabalance,0), False);
   fi;
   if len>0:
     OpenTextJur(nameFile);
     Try
       ShowProgress(len, "Обработка данных...");
       i=1;
--	 ClearVariable(LSTНФА); ClearVariable(LSTСУМ); ClearVariable(LSTКОЛ);
--	 ClearVariable(LSTДА1); ClearVariable(LSTДА2); ClearVariable(LSTДА3);
--	 ClearVariable(txtМОЛ); ClearVariable(txtМХЭ); ClearVariable(txtDANA);
--	 dd=ToDay; ToDayStr=Str(Day(dd))+Str(Mon(dd))+Str(Year(dd));
--	 мм=0; м1=0; м2=0;
       while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
	 ProgressPos(i);
	 i=i+1;
--	   КОДСЧТ=""; SUM=0.00;
	 xx=LengthOfArray(aAna);
	 ss='';nfa='';
	 if xx>0:
	    for z=1..xx do
	      if nfa='':
		 if pos('НФА.',aAna[z])=1:
		    nfa=substr(aAna[z],1,Pos(":", aAna[z])-1);
		 fi;
	      fi;
--		if dopan='':
--		   p=pos(ДопСпр_+'.',aAna[z]);
--		   if p=2:
--		      if pos(substr(aAna[z],1,1),'+-')>0:
--			 dopan=aAna[z];
--		      fi;
--		    | p=1:dopan=aAna[z];
--		   fi;
--		fi;

	      if nfa<>'' :
		 ss=nfa;
		 break;
	      fi;
	    od;
	 fi;
	 addinarray(НФА1_ДопСпрАн,true,false,nfa);
--	   if ss<>'':len=поисквмассиве(НФА_ДопСпрАн,ss,true);
--	      if len<1:
--		 len=insertinarraysort(НФА_ДопСпрАн,ss);
--		 insertinarray(НФА0_ДопСпрАн,len,nfa);
--	      fi;
--	   fi;
       od;
     Finally
       CloseTextJur;
       if ExistFile(nameFile): DeleteFile(nameFile); fi;
     end; -- Try
   fi; -- len
 Finally
   CloseProgress;
   ToggleAutoRefresh(Режим);
 end;
 len=lengthofarray(НФА1_ДопСпрАн);
  ^len;
end;

proc ПостроитьОтчет(имя:СТРОКА; it:I);
var r :REPORT;
var a,Фильтротчета0 :STRING;
var Выводить,l1,l2,l3:l;
var ii,tt:i;
--if расчитывать_доп:
--  ii=ЗаполнитьНФА_ДопСпрАн;
--fi;
if ОТЧЕТ=4:message('Отчет по драгметаллам ОС^MПока не реализованн!');exit;fi;
if not УчетВНПР:Фильтротчета0=Фильтротчета;
 | true:Фильтротчета0=Фильтротчета;
fi;

--  BUTTON8.Visible=(ОТЧЕТ=0);
МАТЕРИАЛ=ЕСЛИ(ОТЧЕТ=0: "НФА.*"
	  |ОТЧЕТ=1: ""
	  |ОТЧЕТ=2: ""
	  |ОТЧЕТ=3: "НФА.*");

ОРГАНИЗАЦИЯ="";
ПОКУПАТЕЛЬ="";
СКЛАД="";

СчетОтчета=ЕСЛИ(ОТЧЕТ=0: СчетНФА
	       |ОТЧЕТ=1: СчетПок
	       |ОТЧЕТ=2: СчетПост
	       |ОТЧЕТ=3: СчетНФА);
--  r = RepOpen(Путь+"|"+ИмяОтчета,"("+СчетОтчета+")",Фильтротчета0, ДатНач, Дат+1,'',sprav);
clearvar;
  r = RepOpen(Путь+"|"+ИмяОтчета,"("+УслИСТ+")",Фильтротчета0, ДатНач, Дат+1,'',sprav);
  try
    RepReset(r);
    ClearVar;
    Выводить=true;
    while RepNext(r) do
      if Выводить:InsertFrame(Отч, Отч+1);fi;
      Выводить=true;
      a = RepIdent(r);
      НаименПР	 [Отч] =a;
      Наимен	 [Отч] = ЕСЛИ(ДЛИНА(Наим_П(a))>0,Наим_П(a),a);
      ОстатокНРуб[Отч] = отбр(RepSaldoS(r,отчСверн,"РУБ"),4);
      ОстатокНШт [Отч] = RepSalDoS(r,отчСверн,"КОЛ");
      НЦенаОст	 [Отч] = ОстатокНРуб[Отч]/ОстатокНШт[Отч];
      КупленоРуб [Отч] = отбр(RepTurn(r,repDeb,"РУБ"),4);
      КупленоШт  [Отч] = RepTurn(r,repDeb,"КОЛ");
      ЦенаКупли  [Отч] = КупленоРуб[Отч]/КупленоШт[Отч];
      ПроданоРуб [Отч] = отбр(RepTurn(r,repCre,"РУБ"),4);
      ПроданоШт  [Отч] = RepTurn(r,repCre,"КОЛ");
      ЦенаПродажи[Отч] = ПроданоРуб[Отч]/ПроданоШт[Отч];
      ОстатокРуб [Отч] = отбр(RepSaldof(r,отчСверн,"РУБ"),4);
      ОстатокШт  [Отч] = RepSalDof(r,отчСверн,"КОЛ");
      ЦенаОст	 [Отч] = ОстатокРуб[Отч]/ОстатокШт[Отч];
      Прибыль	 [Отч] = ПроданоРуб[Отч]-КупленоРуб[Отч];
      ЕдИзм	 [Отч] = Unit(a);
--	if УчетОст:
--	   l1=true;if МеньшеНульОст: if not(ОстатокНРуб[Отч]<0 или ОстатокРуб[Отч]<0 или ОстатокНШт[Отч]<0 или ОстатокШт[Отч]<0):l1=false;fi;fi;
--	   l2=true;if НульОст	   : if not(ОстатокНРуб[Отч]=0 или ОстатокРуб[Отч]=0 или ОстатокНШт[Отч]=0 или ОстатокШт[Отч]=0):l2=false;fi;fi;
--	   l3=true;if БольшеНульОст: if not(ОстатокНРуб[Отч]>0 или ОстатокРуб[Отч]>0 или ОстатокНШт[Отч]>0 или ОстатокШт[Отч]>0):l3=false;fi;fi;
--	   Выводить=Выводить и l1 и l2 и l3;
--	fi;
--	if УчетОбо:
--	   l1=true;if МеньшеНульОбо: if not(КупленоРуб[Отч]<0 или ПроданоРуб[Отч]<0 или КупленоШт[Отч]<0 или ПроданоШт[Отч]<0):l1=false;fi;fi;
--	   l2=true;if НульОбо	   : if not(КупленоРуб[Отч]=0 или ПроданоРуб[Отч]=0 или КупленоШт[Отч]=0 или ПроданоШт[Отч]=0):l2=false;fi;fi;
--	   l3=true;if БольшеНульОбо: if not(КупленоРуб[Отч]>0 или ПроданоРуб[Отч]>0 или КупленоШт[Отч]>0 или ПроданоШт[Отч]>0):l3=false;fi;fi;
--	   Выводить=Выводить и l1 и l2 и l3;
--	fi;
    end;
    ОстатокНРубВсего = СуммаМассива(ОстатокНРуб,Отч);
    КупленоРубВсего = RepTotalTurn(r, repDeb, 'РУБ');	КупленоШтВсего	= RepTotalTurn(r, repDeb, 'КОЛ');
    ПроданоРубВсего = RepTotalTurn(r, repCre, 'РУБ');	ПроданоШтВсего	= RepTotalTurn(r, repCre, 'КОЛ');
    ОстатокРубВсего = СуммаМассива(ОстатокРуб,Отч);
    ОстатокШтВсего  = СуммаМассива(ОстатокШт,Отч);
    ПрибыльВсего    = СуммаМассива(Прибыль,Отч);
  finally
    r = RepClose(r);
  end;
  tt=Отч;
  for ii=1..tt do
    if

      ОстатокНРуб [ii] = 0 и
      ОстатокНШт  [ii] = 0 и
      КупленоРуб  [ii] = 0 и
      КупленоШт   [ii] = 0 и
      ПроданоРуб  [ii] = 0 и
      ПроданоШт   [ii] = 0 и
      ОстатокРуб  [ii] = 0 и
      ОстатокШт   [ii] = 0 :
      if ОТЧЕТ=0:DeleteFrame(Отч0,ii);
       | true:	 DeleteFrame(Отч4,ii);
      fi;


      tt=tt-1;ii=ii-1;
    fi;
  od;
Sort1=Раб.Нфа.B00.ch_S_wвниз;
Sort2='';
Sort0='';
--var SSS:S=Раб.Нфа.B00.ch_S_wвверх+Раб.Нфа.B00.ch_S_wвниз+Раб.Нфа.B00.ch_S_wвправо+Раб.Нфа.B00.ch_S_wвлево;
     ЗаполнитьГруппы;

end;

var НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ[]:s;
var НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ0[];
var НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ1[];
var НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО0[];
var НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО1[];
var НАИМЕН_ДРАГ[]:s;
var ЕДИЗМ_ДРАГ []:s;
var КОЛИЧ      [];

proc ПостроитьОтчетДрагМет(услсч:S;услан:S);
var wa,war,ii,j,k,rs,z,zz:i;
var ss,ss1,ss2,ss3,НФА,УЧН,услан0:s;
var ll:l;
var ост0,ост1,обо0,обо1,:n;
  услан=trim(услан);
--  if услан<>'':услан='{'+услан+'}';fi;
  ClearVariable(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ);
  ClearVariable(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ0);
  ClearVariable(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ1);
  ClearVariable(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО0);
  ClearVariable(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО1);

  ss=МАТЕРИАЛ;if trim(ss)='' :ss='НФА.101.*';fi;
  wa=OpenWorkArea('РПО_ИНВКАРТ_ОС','НФА','СООТВ(НФА,"'+ss+'") and СООТВ(НФА,"НФА.101.*")');
--  wa=OpenWorkArea('РПО_ИНВКАРТ_ОС','НФА;ИНВ','СООТВ(НФА,"'+ss+'") and СООТВ(НФА,"НФА.101.*")');
    rs=records(wa);
    if rs<1:closeworkarea(wa);exit;fi;
    ОкноВыполненияПоказать(Отч, "Расчет...");

    for zz=1..Отч do
      НФА=НаименПР[zz];
      ОкноВыполненияПоказать(Отч, "Расчет "+НФА);
      ОкноВыполненияПоложение(zz);
      setfilter(wa,'СООТВ(НФА,"'+НФА+'")');
      rs=records(wa);
      if rs>0:
	for ii=1..rs do
	  УЧН='УЧН.'+trim(GetFields(wa, ii,'ИНВ'));
	  if услан<>'':услан0='{('+услан+')&'+НФА+'&'+УЧН+'}';
	   | true:     услан0='{'+НФА+'&'+УЧН+'}';
	  fi;
	  if name_a(УЧН)<>' ':
	    if естьпроводки(услсч+услан0,1.1.100,Дат+1):
  --		ss2=НФА;
  --		ss3=УЧН;
  --		if ss2+'#'+ss3<>НФА+'#'+УЧН and ss2<>'' and ss2<>'':
  --		  НФА=ss2;
  --		  УЧН=ss3;
  --		  if услан<>'':услан0='{('+услан+')&'+НФА+'&'+УЧН+'}';
  --		   | true:     услан0='{'+НФА+'&'+УЧН+'}';
  --		  fi;
		ВзятьКакМассив(wa,ii,"","ХАРОС","НАИМЕН_ДРАГ|ЕДИЗМ_ДРАГ|КОЛИЧ");
		j=длинамассива(НАИМЕН_ДРАГ);
		ll=false;
		for k=1..j do
		 ss=trim(up(НАИМЕН_ДРАГ[k]));
		 if ss<>'' and not ll and КОЛИЧ[k]<>0:-- есть драгмет, расчитываем обороты и остатки в количестве!
		    ll=true;
		 fi;
		 if ll:
		    if ss<>'' and КОЛИЧ[k]<>0:-- учитываем как драг мет
		       ss1=trim(up(ЕДИЗМ_ДРАГ[k]));
		       z=ПоискВмассиве(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ,ss+'#'+ss1);
		       if z<1:z=ВставитьВмассивСорт(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ,ss+'#'+ss1);
				ВставитьВмассив(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ0,z,0);
				ВставитьВмассив(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ1,z,0);
				ВставитьВмассив(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО0,z,0);
				ВставитьВмассив(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО1,z,0);
		       fi;
				ОСТ0=Оборот(услсч+услан0,1.1.100,ДатНач,'КОЛ');
				ОСТ1=Оборот(услсч+услан0,1.1.100,Дат+1,'КОЛ');
				ОБО0=Оборот('+'+услсч+услан0,ДатНач,Дат+1,'КОЛ');
				ОБО1=-Оборот('-'+услсч+услан0,ДатНач,Дат+1,'КОЛ');
		       НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ0[z]=НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ0[z]+КОЛИЧ[k]*ОСТ0;
		       НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ1[z]=НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ1[z]+КОЛИЧ[k]*ОСТ1;
		       НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО0[z]=НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО0[z]+КОЛИЧ[k]*ОБО0;
		       НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО1[z]=НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО1[z]+КОЛИЧ[k]*ОБО1;
		    fi;
		 fi;
		od;
  --		fi;
	    fi;
	  fi;
	od;
      fi;
    od;
  closeworkarea(wa);
--   message('Отчет по драгметаллам ОС^MПока не реализованн!');
 ОкноВыполненияЗакрыть;

end;

proc ПостроитьОтчет1(имя:СТРОКА);
var r  :REPORT;
var a  :s;
var i,j,zz,zzz,xxx:i;
var ss,Фильтротчета0,dopan :s;
var Выводить,l0,l1,l2,l3,gr_by,ll:l;
var ii,tt:i;
var ОстатокНРуб_:n;
var ОстатокНШт_ :n;
var КупленоРуб_ :n;
var КупленоШт_	:n;
var ПроданоРуб_ :n;
var ПроданоШт_	:n;
var ОстатокРуб_ :n;
var ОстатокШт_	:n;
if not(ИСТ1 or ИСТ2 or ИСТ3 or ИСТ4):
   message('Не выбрано условие по отбору счетов!'+chr(13)+
	   'поставте галочки для нужных вам по отчету условиям:'+chr(13)+
	   '1-Бюджет'+chr(13)+
	   '2-Предпринимательская деятельность'+chr(13)+
	   '3-Целевые средства'+chr(13)+
	   '  Забаланс'
	   ,тсПредупреждение);
fi;
clearvar;
if not УчетВНПР:Фильтротчета0=Фильтротчета;
 | true:Фильтротчета0=Фильтротчета;
fi;
СчетОтчета=ЕСЛИ(ДЛИНА(СчетОтчета)=0,"*",СчетОтчета);
if расчитывать_доп or УчетДопАнализ:
  i=ЗаполнитьНФА_ДопСпрАн_кроме;
  i=ЗаполнитьНФА_ДопСпрАн;
fi;
--  r = RepOpen(Путь+"|"+ИмяОтчета,"("+СчетОтчета+")",Фильтротчета0, ДатНач, Дат+1,'',sprav);

if ОТЧЕТ=4:
-- ************************************************
  if trim(Фильтротчета0)='':ss='НФА.101.*&УЧН.*';
   | true: ss='('+Фильтротчета0+')&НФА.101.*&УЧН.*';
  fi;
  r = RepOpen(Путь+"|"+ИмяОтчета,"("+УслИСТ+")",ss, ДатНач, Дат+1,'','НФА');
--  trace(УслИСТ);
  try
    RepReset(r);
    ClearVariable(Отч);
    Выводить=true;
    while RepNext(r) do
      if Выводить:InsertFrame(Отч, Отч+1);fi;
      Выводить=true;
      a = RepIdent(r);
--	Товар[Отч] = SubStr(a,5,255);	  -- без Com.PaperPref

      НаименПР[Отч] =a;
      Наимен[Отч] =ЕСЛИ(ДЛИНА(Наим_П(a))>0,Наим_П(a),a);
      ОстатокНРуб[Отч] = отбр(RepSaldoS(r,отчСверн,"РУБ"),4);	   ОстатокНШт [Отч] = RepSalDoS(r,отчСверн,"КОЛ");
      НЦенаОст[Отч] = ОстатокНРуб[Отч]/ОстатокНШт[Отч];
      КупленоРуб[Отч] = отбр(RepTurn(r,repDeb,"РУБ"),4);  КупленоШт[Отч] = RepTurn(r,repDeb,"КОЛ");
      ЦенаКупли[Отч] = КупленоРуб[Отч]/КупленоШт[Отч];
      ПроданоРуб[Отч] = отбр(RepTurn(r,repCre,"РУБ"),4);  ПроданоШт[Отч] = RepTurn(r,repCre,"КОЛ");
      ЦенаПродажи[Отч] = ПроданоРуб[Отч]/ПроданоШт[Отч];
      ОстатокРуб[Отч] = отбр(RepSaldof(r,отчСверн,"РУБ"),4);	  ОстатокШт [Отч] = RepSalDof(r,отчСверн,"КОЛ");
      ЦенаОст[Отч] = ОстатокРуб[Отч]/ОстатокШт[Отч];
      ЕдИзм	 [Отч] = Unit(a);

      if УчетОст:
	 l0=Выводить;
	 if УчетОстН:
	   l1=false;if МеньшеНульОстН:if (ОстатокНРуб[Отч]<0 или ОстатокНШт[Отч]<0):l1=true;fi;fi;
	   l2=false;if НульОстН      :if (ОстатокНРуб[Отч]=0 или ОстатокНШт[Отч]=0):l2=true;fi;fi;
	   l3=false;if БольшеНульОстН:if (ОстатокНРуб[Отч]>0 или ОстатокНШт[Отч]>0):l3=true;fi;fi;
	   l0=(l1 или l2 или l3);
	 fi;
	 if УчетОстК:
	   l1=false;if МеньшеНульОстК:if (ОстатокРуб[Отч]<0 или ОстатокШт[Отч]<0):l1=true;fi;fi;
	   l2=false;if НульОстК      :if (ОстатокРуб[Отч]=0 или ОстатокШт[Отч]=0):l2=true;fi;fi;
	   l3=false;if БольшеНульОстК:if (ОстатокРуб[Отч]>0 или ОстатокШт[Отч]>0):l3=true;fi;fi;
	  |true:l1=true;
	 fi;
	 if УчетОстН и УчетОстК:Выводить=Выводить и (l0 или l1 или l2 или l3);
	  | true:Выводить=Выводить и l0 и (l1 или l2 или l3);
	 fi;
      fi;
      if УчетОбо:
	 l1=false;if МеньшеНульОбо:if (КупленоРуб[Отч]<0 или ПроданоРуб[Отч]<0 или КупленоШт[Отч]<0 или ПроданоШт[Отч]<0):l1=true;fi;fi;
	 l2=false;if НульОбо	  :if (КупленоРуб[Отч]=0 или ПроданоРуб[Отч]=0 или КупленоШт[Отч]=0 или ПроданоШт[Отч]=0):l2=true;fi;fi;
	 l3=false;if БольшеНульОбо:if (КупленоРуб[Отч]>0 или ПроданоРуб[Отч]>0 или КупленоШт[Отч]>0 или ПроданоШт[Отч]>0):l3=true;fi;fi;
	 Выводить=Выводить и (l1 или l2 или l3);
      fi;

    end;
    if not Выводить:DeleteFrame(Отч,Отч);fi;
    ОстатокНРубВсего = СуммаМассива(ОстатокНРуб,Отч); ОстатокНШтВсего = СуммаМассива(ОстатокНШт,Отч);
    КупленоРубВсего = СуммаМассива(КупленоРуб,Отч);   КупленоШтВсего  = СуммаМассива(КупленоШт,Отч);
    ПроданоРубВсего = СуммаМассива(ПроданоРуб,Отч);   ПроданоШтВсего  = СуммаМассива(ПроданоШт,Отч);
    ОстатокРубВсего = СуммаМассива(ОстатокРуб,Отч);
    ОстатокШтВсего  = СуммаМассива(ОстатокШт,Отч);
  finally
    r = RepClose(r);
  end;
  tt=Отч;
  for ii=1..tt do
    if
      ОстатокНРуб [ii] = 0 и
      ОстатокНШт  [ii] = 0 и
      КупленоРуб  [ii] = 0 и
      КупленоШт   [ii] = 0 и
      ПроданоРуб  [ii] = 0 и
      ПроданоШт   [ii] = 0 и
      ОстатокРуб  [ii] = 0 и
      ОстатокШт   [ii] = 0 :
      if ОТЧЕТ=0:DeleteFrame(Отч0,ii);
       | true:	 DeleteFrame(Отч4,ii);
      fi;

      tt=tt-1;ii=ii-1;

    fi;
  od;
  Отч=tt;

-- ************************************************
   ПостроитьОтчетДрагМет("("+УслИСТ+")",ss);
   clearvar;
   tt=длинамассива(НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ);
   Отч=tt;
   for i=1..tt do
      НаименПР	  [i] = ВыделитьСлово(1,НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ[i],'#');
      Наимен	  [i] =if(ДЛИНА(Наим_П(НаименПР[i]))>1,Наим_П(НаименПР[i]),НаименПР[i])+' ('+ВыделитьСлово(2,НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ[i],'#')+')';
      ОстатокНРуб [i] = НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ0[i] ;
      ОстатокНШт  [i] = НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ0[i] ;
      КупленоРуб  [i] = НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО0[i] ;
      КупленоШт   [i] = НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО0[i] ;
      ПроданоРуб  [i] = НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО1[i] ;
      ПроданоШт   [i] = НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОБО1[i] ;
      ОстатокРуб  [i] = НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ1[i] ;
      ОстатокШт   [i] = НАИМЕН_ДРАГ_ЕДИЗМ_ДРАГ_КОЛИЧ_ОСТ1[i] ;
   od;
    ОстатокНРубВсего = СуммаМассива(ОстатокНРуб,tt);
    КупленоРубВсего = СуммаМассива(КупленоРуб,tt);   КупленоШтВсего  = СуммаМассива(КупленоШт,tt);
    ПроданоРубВсего = СуммаМассива(ПроданоРуб,tt);   ПроданоШтВсего  = СуммаМассива(ПроданоШт,tt);
    ОстатокРубВсего = СуммаМассива(ОстатокРуб,tt);
    ОстатокШтВсего  = СуммаМассива(ОстатокШт,tt);
    ОстатокНШтВсего  = СуммаМассива(ОстатокНШт,tt);
   --message('Отчет по драгметаллам ОС^MПока не реализованн!');exit;fi;
 | ОТЧЕТ=5:
      ClearVariable(Отч);
      gr_by=вопрос('','Раскрыть отчет по наименованиям?','Только итоги;По наименованиям',mtConfirmation)<2;
      tt=РАБ.НФА.ОТЧЕТЫ.Раскрыть_ВсеУсловия_по_аналитике(Фильтротчета0,ОтчетВыборЗап,true,false,false,true);
      zz=1;
--	CopyArray(РАБ.НФА.ОТЧЕТЫ.СписокПризн,НаименПР);
      zzz=tt;
      ОкноВыполненияПоказать(zzz,'Расчет остатков и оборотов - '+str(zzz)+' позиций'); -- синхронизация с уже раскрытой группой

      for tt=1..zzz do
	ОкноВыполненияПоложение(tt);
	  if gr_by:a=РАБ.НФА.ОТЧЕТЫ.СписокПризн_rec[tt];
	   | true:a=РАБ.НФА.ОТЧЕТЫ.СписокПризн[tt];
	  fi;
	  zz=searchinarray(НаименПР,a,true);
	  if zz<1:zz=insertinarraysort(НаименПР,a);
		     insertinarray(ОстатокНРуб,zz,0);
		     insertinarray(ОстатокНШт,zz,0);
		     insertinarray(КупленоРуб,zz,0);
		     insertinarray(КупленоШт,zz,0);
		     insertinarray(ПроданоРуб,zz,0);
		     insertinarray(ПроданоШт,zz,0);
		     insertinarray(ОстатокРуб,zz,0);
		     insertinarray(ОстатокШт,zz,0);
		     insertinarray(ДопКол,zz,0);
		     insertinarray(ДопСум,zz,0);
		     insertinarray(ДопЦен,zz,0);
		     insertinarray(ЕдИзм ,zz,'');
	  fi;
--	    trace(a);
	  a=РАБ.НФА.ОТЧЕТЫ.СписокПризн[tt];	    --Дат+1			    УслИСТ_
--	    trace(a);
--	    trace(РАБ.НФА.ОТЧЕТЫ.СписокПризн_rec[tt]);
--	    Наимен     [zz+1] =ОтчетВыбор;
--	    Наимен     [zz+1] = ЕСЛИ(ДЛИНА(Наим_П(a))>0,Наим_П(a),a);
if not РасчетТолькоОстаткиК:
	  ОстатокНРуб_ = отбр(Saldo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+a+"}",ДатНач,"РУБ"),4);
	  ОстатокНШт_  = SalDo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+a+"}",ДатНач,"КОЛ");
--	    НЦенаОст   [zz+1] = ОстатокНРуб[zz+1]/ОстатокНШт[zz+1];

	  КупленоРуб_  = отбр(Turn("(+"+УслИСТ+"){("+Фильтротчета0+")&"+a+"}",ДатНач,Дат+1,"РУБ"),4);
	  КупленоШт_   = Turn("(+"+УслИСТ+"){("+Фильтротчета0+")&"+a+"}",ДатНач,Дат+1,"КОЛ");
--	    ЦенаКупли  [zz+1] = КупленоРуб[zz+1]/КупленоШт[zz+1];

	  ПроданоРуб_  = -отбр(Turn("(-"+УслИСТ+"){("+Фильтротчета0+")&"+a+"}",ДатНач,Дат+1,"РУБ"),4);
	  ПроданоШт_   = -Turn("(-"+УслИСТ+"){("+Фильтротчета0+")&"+a+"}",ДатНач,Дат+1,"КОЛ");
--	    ЦенаПродажи[zz+1] = ПроданоРуб[zz+1]/ПроданоШт[zz+1];
fi;
	  ОстатокРуб_  = отбр(Saldo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+a+"}",Дат+1,"РУБ"),4);
	  ОстатокШт_   = SalDo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+a+"}",Дат+1,"КОЛ");
--	    ОстатокРуб_  = 1;
--	    ОстатокШт_	 = 1;
if not РасчетТолькоОстаткиК:
	     ОстатокНРуб[zz] = ОстатокНРуб[zz]+ОстатокНРуб_;
	     ОстатокНШт [zz] = ОстатокНШт [zz]+ОстатокНШт_ ;
	     КупленоРуб [zz] = КупленоРуб [zz]+КупленоРуб_ ;
	     КупленоШт	[zz] = КупленоШт  [zz]+КупленоШт_  ;
	     ПроданоРуб [zz] = ПроданоРуб [zz]+ПроданоРуб_ ;
	     ПроданоШт	[zz] = ПроданоШт  [zz]+ПроданоШт_  ;
fi;
	     ОстатокРуб [zz] = ОстатокРуб [zz]+ОстатокРуб_ ;
	     ОстатокШт	[zz] = ОстатокШт  [zz]+ОстатокШт_  ;
if расчитывать_доп: xxx=поисквмассиве(НФА0_ДопСпрАн,a,true);
   if xxx>0:ii=lengthofarray(НФА0_ДопСпрАн);
      for i=xxx..ii do
	if НФА0_ДопСпрАн[i]<>a:break;fi;
--	  dopan=ВыделитьСлово(2,НФА_ДопСпрАн[i],'&');
	-- расчет по доп аналитике --
	  ОстатокНРуб_	= отбр(Saldo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",Дат+1,"РУБ"),4);
	  ОстатокНШт_	= SalDo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",Дат+1,"КОЛ");
	  if ОстатокНШт_>0:
	    if ОстатокНРуб_/ОстатокНШт_>40000:
	       ОстатокРуб_=отбр(Saldo("("+СчетОтчета_доп+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",Датадоп+1,"РУБ"),4);
	       if ОстатокРуб_<=0:
		  ДопКол[zz] =ДопКол[zz]+ОстатокНШт_;
		  ДопСум[zz] =ДопСум[zz]+ОстатокНРуб_;
	       fi;
	    fi;
	  fi;





	-----------------------------
      od;
   fi;
fi;

      od;
      zzz=lengthofarray(НаименПР);
      ОкноВыполненияПоказать(Отч,'Удаление ненужных строк...'); -- синхронизация с уже раскрытой группой
      for zz=1..zzz do
	  ОкноВыполненияПоложение(zz);

	  Выводить=true;
	  if УчетОст:
	     l0=Выводить;
	     if УчетОстН:
	       l1=false;if МеньшеНульОстН:if (ОстатокНРуб[zz]<0 или ОстатокНШт[zz]<0):l1=true;fi;fi;
	       l2=false;if НульОстН	 :if (ОстатокНРуб[zz]=0 или ОстатокНШт[zz]=0):l2=true;fi;fi;
	       l3=false;if БольшеНульОстН:if (ОстатокНРуб[zz]>0 или ОстатокНШт[zz]>0):l3=true;fi;fi;
	       l0=(l1 или l2 или l3);
	     fi;
	     if УчетОстК:
	       l1=false;if МеньшеНульОстК:if (ОстатокРуб[zz]<0 или ОстатокШт[zz]<0):l1=true;fi;fi;
	       l2=false;if НульОстК	 :if (ОстатокРуб[zz]=0 или ОстатокШт[zz]=0):l2=true;fi;fi;
	       l3=false;if БольшеНульОстК:if (ОстатокРуб[zz]>0 или ОстатокШт[zz]>0):l3=true;fi;fi;
	      |true:l1=true;
	     fi;
	     if УчетОстН и УчетОстК:Выводить=Выводить и (l0 или l1 или l2 или l3);
	      | true:Выводить=Выводить и l0 и (l1 или l2 или l3);
	     fi;
	  fi;
	  if УчетОбо:
	     l1=false;if МеньшеНульОбо:if (КупленоРуб[zz]<0 или ПроданоРуб[zz]<0 или КупленоШт[zz]<0 или ПроданоШт[zz]<0):l1=true;fi;fi;
	     l2=false;if НульОбо      :if (КупленоРуб[zz]=0 или ПроданоРуб[zz]=0 или КупленоШт[zz]=0 или ПроданоШт[zz]=0):l2=true;fi;fi;
	     l3=false;if БольшеНульОбо:if (КупленоРуб[zz]>0 или ПроданоРуб[zz]>0 или КупленоШт[zz]>0 или ПроданоШт[zz]>0):l3=true;fi;fi;
	     Выводить=Выводить и (l1 или l2 или l3);
	  fi;
	  if not Выводить:
	     УдалитьИзМассива(ОстатокНРуб,zz,false);
	     УдалитьИзМассива(ОстатокНШт ,zz,false);
	     УдалитьИзМассива(КупленоРуб ,zz,false);
	     УдалитьИзМассива(КупленоШт  ,zz,false);
	     УдалитьИзМассива(ПроданоРуб ,zz,false);
	     УдалитьИзМассива(ПроданоШт  ,zz,false);
	     УдалитьИзМассива(ОстатокРуб ,zz,false);
	     УдалитьИзМассива(ОстатокШт  ,zz,false);
	     УдалитьИзМассива(НаименПР	 ,zz,false);
	     УдалитьИзМассива(Наимен	 ,zz,false);
	     УдалитьИзМассива(ДопКол	 ,zz,false);
	     УдалитьИзМассива(ДопСум	 ,zz,false);
	     УдалитьИзМассива(ДопЦен	 ,zz,false);
	     УдалитьИзМассива(ЕдИзм	 ,zz,false);

--	       Delet eFrame(Отч0,zz);
	     zz=zz-1;zzz=zzz-1;
	  fi;
      od;
	Отч=lengthofarray(НаименПР);
	ОстатокНРубВсего= СуммаМассива(ОстатокНРуб,Отч);
	ОстатокНШтВсего= СуммаМассива(ОстатокНШт,Отч);
	КупленоРубВсего = СуммаМассива(КупленоРуб,Отч);   
	КупленоШтВсего	= СуммаМассива(КупленоШт,Отч);
	ПроданоРубВсего = СуммаМассива(ПроданоРуб,Отч);   
	ПроданоШтВсего	= СуммаМассива(ПроданоШт,Отч);
	ОстатокРубВсего = СуммаМассива(ОстатокРуб,Отч);
	ОстатокШтВсего	= СуммаМассива(ОстатокШт,Отч);

	ДопКолВсего  = СуммаМассива(ДопКол,Отч);
	ДопСумВсего  = СуммаМассива(ДопСум,Отч);
	ДопЦенВсего  = СуммаМассива(ДопЦен,Отч);
      ОкноВыполненияПоказать(Отч,'Вывод наименований строк отчета...');
      for zz=1..Отч do
	  if gr_by:
	     Наимен[zz]=getcardfields('РПО_ОТЧЕТЫ_СТРОКИ',stringtorecord(НаименПР[zz]),'КОД1');
	     НаименПР[zz]=getcardfields('РПО_ОТЧЕТЫ_СТРОКИ',stringtorecord(НаименПР[zz]),'КОД');
	   | true:Наимен[zz]=Name_A(НаименПР[zz]);
	  fi;
	  ОкноВыполненияПоложение(zz);
      od;
      ОкноВыполненияЗакрыть;
 | true:
  r = RepOpen(Путь+"|"+ИмяОтчета,"("+УслИСТ+")",Фильтротчета0, ДатНач, Дат+1,'',sprav);
--  trace(УслИСТ);
  try
    RepReset(r);
    ClearVariable(Отч);
    Выводить=true;
    while RepNext(r) do
      if Выводить:InsertFrame(Отч, Отч+1);fi;
      Выводить=true;
      a = RepIdent(r);
--	Товар[Отч] = SubStr(a,5,255);	  -- без Com.PaperPref

      НаименПР[Отч] =a;
      Наимен[Отч] =ЕСЛИ(ДЛИНА(Наим_П(a))>0,Наим_П(a),a);
      ОстатокНРуб[Отч] = окр(RepSaldoS(r,отчСверн,"РУБ"),2);	  ОстатокНШт [Отч] = RepSalDoS(r,отчСверн,"КОЛ");
      НЦенаОст[Отч] = ОстатокНРуб[Отч]/ОстатокНШт[Отч];
      КупленоРуб[Отч] = окр(RepTurn(r,repDeb,"РУБ"),2);  КупленоШт[Отч] = RepTurn(r,repDeb,"КОЛ");
      ЦенаКупли[Отч] = КупленоРуб[Отч]/КупленоШт[Отч];
      ПроданоРуб[Отч] = окр(RepTurn(r,repCre,"РУБ"),2);  ПроданоШт[Отч] = RepTurn(r,repCre,"КОЛ");
      ЦенаПродажи[Отч] = ПроданоРуб[Отч]/ПроданоШт[Отч];
      ОстатокРуб[Отч] = окр(RepSaldof(r,отчСверн,"РУБ"),2);	 ОстатокШт [Отч] = RepSalDof(r,отчСверн,"КОЛ");
      ЦенаОст[Отч] = ОстатокРуб[Отч]/ОстатокШт[Отч];
      ЕдИзм	 [Отч] = Unit(a);
      zzz=Отч;
if УчетДопАнализ: xxx=поисквмассиве(НФА0_ДопСпрАн,a,true);
   if xxx>0:
--	zzz=Отч;
      ii=lengthofarray(НФА0_ДопСпрАн);
      ll=поисквмассиве(НФА1_ДопСпрАн,a,true)>0;-- есть без доп анализа - надо разбить строки
      if not ll:-- только с допаналитикой
	 ll=xxx<ii;-- возможно несколько вариантов
	 if ll:
	    ll=НФА0_ДопСпрАн[xxx]=НФА0_ДопСпрАн[xxx+1];-- несколько вариантов
	 fi;

	 if not ll:
	    ДопАн[Отч]=ВыделитьСлово(2,НФА_ДопСпрАн[xxx],'&');-- только с допаналитикой
	 fi;
      fi;
      if ll:
	for i=xxx..ii do
	  if НФА0_ДопСпрАн[i]<>a:break;fi;
	  InsertFrame(Отч, Отч+1);
	  НаименПР[Отч] =a;
	  ДопАн[Отч]=ВыделитьСлово(2,НФА_ДопСпрАн[i],'&');
	     Наимен[Отч]=ЕСЛИ(ДЛИНА(Наим_П(a))>0,Наим_П(a),a);
	  if match(ДопАн[Отч],'УЧН.*'):
	     if Наим_П('ИНВВЕД.'+a+'.'+ДопАн[Отч])<>' ':
		Наимен[Отч]=Наимен[Отч]+'/'+Наим_П('ИНВВЕД.'+a+'.'+ДопАн[Отч]);
	     fi;

	  fi;
  --	    dopan=НФА_ДопСпрАн[i]
	  -- расчет по доп аналитике --

	ОстатокНРуб[Отч] = окр(Saldo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",ДатНач,"РУБ"),2);
	ОстатокНШт [Отч] = окр(Saldo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",ДатНач,"КОЛ"),точность(a));
	НЦенаОст[Отч]	 = ОстатокНРуб[Отч]/ОстатокНШт[Отч];

	ОстатокРуб[Отч]  =  окр(Saldo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",Дат+1,"РУБ"),2);
	ОстатокШт [Отч]  =  окр(Saldo("("+УслИСТ_(true)+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",Дат+1,"КОЛ"),точность(a));
	ЦенаОст[Отч]	 = ОстатокРуб[Отч]/ОстатокШт[Отч];

	КупленоРуб[Отч]  = окр(Turn("+("+УслИСТ+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",ДатНач,Дат+1,"РУБ"),2);
	КупленоШт [Отч]  = окр(Turn("+("+УслИСТ+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",ДатНач,Дат+1,"КОЛ"),точность(a));
	ЦенаКупли[Отч]	 = КупленоРуб[Отч]/КупленоШт[Отч];

	ПроданоРуб[Отч]  = -окр(Turn("-("+УслИСТ+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",ДатНач,Дат+1,"РУБ"),2);
	ПроданоШт [Отч]  = -окр(Turn("-("+УслИСТ+"){("+Фильтротчета0+")&"+НФА_ДопСпрАн[i]+"}",ДатНач,Дат+1,"КОЛ"),точность(a));
	ЦенаПродажи[Отч] = ПроданоРуб[Отч]/ПроданоШт[Отч];

	ОстатокНРуб[zzz] = ОстатокНРуб[zzz]-ОстатокНРуб[Отч];
	ОстатокНШт [zzz] = ОстатокНШт [zzz]-ОстатокНШт [Отч];
	ОстатокРуб [zzz] = ОстатокРуб [zzz]-ОстатокРуб [Отч];
	ОстатокШт  [zzz] = ОстатокШт  [zzz]-ОстатокШт  [Отч];
	КупленоРуб [zzz] = КупленоРуб [zzz]-КупленоРуб [Отч];
	КупленоШт  [zzz] = КупленоШт  [zzz]-КупленоШт  [Отч];
	ПроданоРуб [zzz] = ПроданоРуб [zzz]-ПроданоРуб [Отч];
	ПроданоШт  [zzz] = ПроданоШт  [zzz]-ПроданоШт  [Отч];
	ЕдИзм	   [Отч] = Unit(a);
	  -----------------------------
	od;
	НЦенаОст[zzz]	 = ОстатокНРуб[zzz]/ОстатокНШт[zzz];
	ЦенаОст[zzz]	 = ОстатокРуб[zzz]/ОстатокШт[zzz];
	ЦенаКупли[zzz]	 = КупленоРуб[zzz]/КупленоШт[zzz];
	ЦенаПродажи[zzz] = ПроданоРуб[zzz]/ПроданоШт[zzz];
      fi;
   fi;
fi;
      ii=Отч;
      for i=zzz..ii do
	 if УчетОст:
	    l0=Выводить;
	    if УчетОстН:
	      l1=false;if МеньшеНульОстН:if (ОстатокНРуб[Отч]<0 или ОстатокНШт[Отч]<0):l1=true;fi;fi;
	      l2=false;if НульОстН	:if (ОстатокНРуб[Отч]=0 или ОстатокНШт[Отч]=0):l2=true;fi;fi;
	      l3=false;if БольшеНульОстН:if (ОстатокНРуб[Отч]>0 или ОстатокНШт[Отч]>0):l3=true;fi;fi;
	      l0=(l1 или l2 или l3);
	    fi;
	    if УчетОстК:
	      l1=false;if МеньшеНульОстК:if (ОстатокРуб[Отч]<0 или ОстатокШт[Отч]<0):l1=true;fi;fi;
	      l2=false;if НульОстК	:if (ОстатокРуб[Отч]=0 или ОстатокШт[Отч]=0):l2=true;fi;fi;
	      l3=false;if БольшеНульОстК:if (ОстатокРуб[Отч]>0 или ОстатокШт[Отч]>0):l3=true;fi;fi;
	     |true:l1=true;
	    fi;
	    if УчетОстН и УчетОстК:Выводить=Выводить и (l0 или l1 или l2 или l3);
	     | true:Выводить=Выводить и l0 и (l1 или l2 или l3);
	    fi;
	 fi;
	 if УчетОбо:
	    l1=false;if МеньшеНульОбо:if (КупленоРуб[Отч]<0 или ПроданоРуб[Отч]<0 или КупленоШт[Отч]<0 или ПроданоШт[Отч]<0):l1=true;fi;fi;
	    l2=false;if НульОбо      :if (КупленоРуб[Отч]=0 или ПроданоРуб[Отч]=0 или КупленоШт[Отч]=0 или ПроданоШт[Отч]=0):l2=true;fi;fi;
	    l3=false;if БольшеНульОбо:if (КупленоРуб[Отч]>0 или ПроданоРуб[Отч]>0 или КупленоШт[Отч]>0 или ПроданоШт[Отч]>0):l3=true;fi;fi;
	    Выводить=Выводить и (l1 или l2 или l3);
	 fi;
	 if not Выводить:DeleteFrame(Отч,Отч);fi;
	 Выводить=true;
      od;
    end;
    ОстатокНРубВсего = СуммаМассива(ОстатокНРуб,Отч);
    ОстатокНШтВсего = СуммаМассива(ОстатокНШт,Отч);
    КупленоРубВсего = СуммаМассива(КупленоРуб,Отч);   КупленоШтВсего  = СуммаМассива(КупленоШт,Отч);
    ПроданоРубВсего = СуммаМассива(ПроданоРуб,Отч);   ПроданоШтВсего  = СуммаМассива(ПроданоШт,Отч);
    ОстатокРубВсего = СуммаМассива(ОстатокРуб,Отч);
    ОстатокШтВсего  = СуммаМассива(ОстатокШт,Отч);
  finally
    r = RepClose(r);
  end;
fi; -- драгмет
  tt=Отч;
  for ii=1..tt do
    if
      ОстатокНРуб [ii] = 0 и
      ОстатокНШт  [ii] = 0 и
      КупленоРуб  [ii] = 0 и
      КупленоШт   [ii] = 0 и
      ПроданоРуб  [ii] = 0 и
      ПроданоШт   [ii] = 0 и
      ОстатокРуб  [ii] = 0 и
      ОстатокШт   [ii] = 0 :

	УдалитьИзМассива(ОстатокНРуб,ii,false);
	УдалитьИзМассива(ОстатокНШт ,ii,false);
	УдалитьИзМассива(КупленоРуб ,ii,false);
	УдалитьИзМассива(КупленоШт  ,ii,false);
	УдалитьИзМассива(ПроданоРуб ,ii,false);
	УдалитьИзМассива(ПроданоШт  ,ii,false);
	УдалитьИзМассива(ОстатокРуб ,ii,false);
	УдалитьИзМассива(ОстатокШт  ,ii,false);
	УдалитьИзМассива(НаименПР   ,ii,false);
	УдалитьИзМассива(Наимен     ,ii,false);
	УдалитьИзМассива(ДопАн	   ,ii,false);
	     УдалитьИзМассива(ДопКол	 ,ii,false);
	     УдалитьИзМассива(ДопСум	 ,ii,false);
	     УдалитьИзМассива(ДопЦен	 ,ii,false);
	     УдалитьИзМассива(ЕдИзм	 ,ii,false);

--	if ОТЧЕТ=0 or ОТЧЕТ=5:DeleteFrame(Отч0,ii);
--	 | true:   DeleteFrame(Отч4,ii);
--	fi;

      tt=tt-1;ii=ii-1;

    fi;
  od;
  Отч=tt;
Sort1=Раб.Нфа.B00.ch_S_wвниз;
Sort2='';
Sort0='';
     ЗаполнитьГруппы;
--   if ОТЧЕТ=5 or ОТЧЕТ=0:
--	   РазрешенРасчетТолькоОстаткиК(РасчетТолькоОстаткиК);
--	   ОТЧ0_СЕКЦИЯ.Column(6, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР10_СЕКЦИЯ.Column(6+3, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР30_СЕКЦИЯ.Column(6-1, ColVisible, not РасчетТолькоОстаткиК);
--	   ОТЧ0_СЕКЦИЯ.Column(7, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР10_СЕКЦИЯ.Column(7+3, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР30_СЕКЦИЯ.Column(7-1, ColVisible, not РасчетТолькоОстаткиК);
--	   ОТЧ0_СЕКЦИЯ.Column(8, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР10_СЕКЦИЯ.Column(8+3, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР30_СЕКЦИЯ.Column(8-1, ColVisible, not РасчетТолькоОстаткиК);
--	   ОТЧ0_СЕКЦИЯ.Column(9, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР10_СЕКЦИЯ.Column(9+3, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР30_СЕКЦИЯ.Column(9-1, ColVisible, not РасчетТолькоОстаткиК);
--	   ОТЧ0_СЕКЦИЯ.Column(10, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР10_СЕКЦИЯ.Column(10+3, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР30_СЕКЦИЯ.Column(10-1, ColVisible, not РасчетТолькоОстаткиК);
--	   ОТЧ0_СЕКЦИЯ.Column(11, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР10_СЕКЦИЯ.Column(11+3, ColVisible, not РасчетТолькоОстаткиК);
--	   ПЕР30_СЕКЦИЯ.Column(11-1, ColVisible, not РасчетТолькоОстаткиК);
--   fi;
end;


FUNC КаленДат(Об:с;Итер:Ц):L;
   Var DTMP :Date;

       If Об = "ДатНач" :
	    DTMP=КАЛЕНДАРЬ(ДатНач);
	       ДатНач=DTMP;
       |  Об = "Дат" :
	    DTMP=КАЛЕНДАРЬ(Дат);
	       Дат=DTMP;
       Fi;
       ^false;
КОНЕЦ;

Proc ВТовара (Об:С);
  Перем Сч:С;
   Сч=ВыборПризнака("НФА.*");

   If Сч <> МАТЕРИАЛ И Сч <> "" :
       МАТЕРИАЛ = Сч;
   Fi;
End;
Proc ВОтчета (Об:С);
  var rec:record;
  var Сч,ss,ss1,ss2:С;
    ss='ВИДДОК.ИНФО.НФА.ОТЧЕТЫ_СТРОКИ';
    if Name_A(ss)<>' ':
       ss1=РАБ.НФА.B01.2ПолеПоПризнакуС0(ss,'КартУсл');
       ss2=РАБ.НФА.B01.2ПолеПоПризнакуС0(ss,'КАРТБРО');
       ss2=РАБ.НФА.B01.ВзятьBROизКартотеки(ss2);
       ss =РАБ.НФА.B01.2ПолеПоПризнакуС0(ss,'КартИмя');
       if ss<>'':
	 if ss2<>'':rec=ОткрытьКартотеку(ss2,'--'+ss1,rec,crdAnyRecord);
	  | ss1<>'':rec=ОткрытьКартотеку(ss,'--'+ss1,rec,crdAnyRecord);
	  | true:   rec=ОткрытьКартотеку(ss,'',rec,crdAnyRecord);
	 fi;
       fi;
     | true:rec=ОткрытьКартотеку('РПО_ОТЧЕТЫ_СТРОКИ','',rec,crdAnyRecord);
    fi;




--   rec=ОткрытьКартотеку('РПО_ОТЧЕТЫ_СТРОКИ','',rec,crdAnyRecord);
   if rec<>nil:
      ОтчетВыборЗап=rec;
      ОтчетВыбор=getcardfields('РПО_ОТЧЕТЫ_СТРОКИ',ОтчетВыборЗап,'КОД');
      ОтчетВыбор=trim(ОтчетВыбор+'/'+getcardfields('РПО_ОТЧЕТЫ_СТРОКИ',ОтчетВыборЗап,'КОД1'));
      if ОтчетВыбор='/':ОтчетВыбор=getcardfields('РПО_ОТЧЕТЫ_СТРОКИ',ОтчетВыборЗап,'ИМЯ');fi;
   fi;
End;

Proc ВПокупателя (Об:С);
  Перем Сч:С;
   Сч=ВыборПризнака("МОЛ.*");

   If Сч <> ПОКУПАТЕЛЬ И Сч <> "" :
       ПОКУПАТЕЛЬ = Сч;
   Fi;
End;

Proc ВСклада (Об:С);
  Перем Сч:С;
   Сч=ВыборПризнака("М.*");

   If Сч <> СКЛАД И Сч <> "" :
       СКЛАД = Сч;
   Fi;
End;

Proc ВДопПр (Об:С);
  Перем Сч:С;
   Сч=ВыборПризнака("КТ.*|П.*|ПЕРИОД.*|РБС.*|ФКР.*|КОСГУ.*");

   If Сч <> ДопПр И Сч <> "" :
       ДопПр = Сч;
   Fi;
End;

Proc ВСчета (Об:С);
  Перем Сч:С;
   Сч=ВыборСчета(СчетНФА);
   If Сч <> СЧЕТОТЧЕТА И Сч <> "" :
       СЧЕТОТЧЕТА = Сч;
   Fi;
End;
func ОтчетПоОдной (об :С; итер:Ц) :L;
if ОТЧЕТ=0: -- НФА
   if БланкОткрыт('ОТЧЕТЫ.НФА.КАРТОЧКА'):Close('ОТЧЕТЫ.НФА.КАРТОЧКА');fi;
   ОТЧЕТЫ.НФА.КАРТОЧКА.ТоварПр=НаименПР[итер];
   ОТЧЕТЫ.НФА.КАРТОЧКА.Товар  =Name_A(НаименПР[итер]);
--   ОТЧЕТЫ.НФА.КАРТОЧКА.СчетТМЦ=СчетОтчета;
   ОТЧЕТЫ.НФА.КАРТОЧКА.СчетТМЦ=УслИСТ;
   ОТЧЕТЫ.НФА.КАРТОЧКА.СКЛАДПР=СКЛАД;
   ОТЧЕТЫ.НФА.КАРТОЧКА.ДатаН=ДатНач;
   ОТЧЕТЫ.НФА.КАРТОЧКА.ДатаК=Дат;
   OpenBlank('ОТЧЕТЫ.НФА.КАРТОЧКА',false);
 | ОТЧЕТ=1: -- МОЛ
   СохранитьНастройки(true);СохранитьМесто(true);
   Покупатель =НаименПР[итер];ОТЧЕТ=0;ПостроитьОтчет1('');
 | ОТЧЕТ=2: -- К
   ОРГАНИЗАЦИЯ=НаименПР[итер];ОТЧЕТ=0;ПостроитьОтчет1('');
 | ОТЧЕТ=3: -- М
   СКЛАД      =НаименПР[итер];ОТЧЕТ=0;ПостроитьОтчет1('');
fi;

--IF ОТЧЕТ=0 :
--  МБП.карточка_учета.ДатаН = ДатНач;
--  МБП.карточка_учета.ДатаК = Дат;
--  МБП.карточка_учета.Товар =Наим_П(НаименПР[итер]);
--  МБП.карточка_учета.ТоварПр = НаименПР[итер];
--  МБП.карточка_учета.ТоварЕД = Unit(НаименПР[итер]);
--  МБП.карточка_учета.СкладПр= Склад;
--  ОткрБланк("МБП.карточка_учета",false);
--FI;
--IF ОТЧЕТ=1 or ОТЧЕТ=2 or ОТЧЕТ=3 or ОТЧЕТ=4:--МОЛ,ОРГ,СКЛАД
--   if НаименПР[итер]<>'':
--	Раб.вспомотчет.Type = 1;
--	Раб.вспомотчет.ДатаН = ДатНач;
--	Раб.ВспомОтчет.ДатаК = Дат;
--	Раб.ВспомОтчет.Naimen = НаименПР[итер];
--	ОткрБланк("Раб.ВспомОтчет",false);
--   | true:
--	Message ('Это списанная продукция. Для уточнения сделайте отчет ПО СКЛАДАМ');
--   fi;
--FI;
  ^false;
end;
proc КнПредОтчет_ПриНажатии(s:s);
 СохранитьНастройки(false);ПостроитьОтчет1('');СохранитьМесто(false);
end;
proc Печать_ПриНажатии(s:s);
var ИмяНастройки:s;
var Книжная:l;
var Путь:s;
 Путь=PlanVar('НФА')+'\Настройки\';

 if ОТЧЕТ=0:ИмяНастройки=Путь+'RPO_Отчеты_нфа_обороты_НФА.cfg';Книжная=false; -- альбомная
  | true:   ИмяНастройки=Путь+'RPO_Отчеты_нфа_обороты.cfg';Книжная=true;  -- книжная
 fi;
-- trace(ИмяНастройки);
 --trace(PlanVar('INI')+'\RPO_Отчеты_нфа_обороты.cfg');
CopyFile(ИмяНастройки,PlanVar('INI')+'\RPO_Отчеты_нфа_обороты.cfg');
 Print('','','',Книжная,0,0,true);
-- Print('','Отчеты.нфа.обороты.cfg','',Книжная,0,0,true);
end;


ПРОЦ ОтчетПоСкладам(Об:С);
--  перем ит:Ц;
--  перем ск:с;
--  if Склад="" или Склад="СКЛАД.*" или Склад="ПОДР.*":
--  Раб.ОтчетМБП.ОтборМОЛ=Покупатель;
--  Раб.ОтчетМБП.ОтборОРГ=Организация;
--  Раб.ОтчетМБП.ОтборСч=СчетОтчета;
--  Раб.ОтчетМБП.ДатаОтч=Дат+1;
--  Раб.ОтчетМБП.Призн=МАТЕРИАЛ;
--  IF Отч=0:
--     exit;
--     |True:
--  for ит=1..Отч DO
--  Раб.ОтчетМБП.Наимен[ит]=НаименПр[ит];
--  OD;
--  Раб.ОтчетМБП.КолПр=Отч;
--  ОткрБланк("Раб.ОтчетМБП",false);
--  FI;
--  |True:
--  Сообщение("В отчете уже задан конкретный склад. Уберите признак склада или введите строку 'СКЛАД.*'.");
--  fi;
КОНЕЦ;

proc closebln(ob:l);
clearvar;
end;

func cng(ob:s;i:i):L;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="... по НФА";
 Buf[2]="... по МОЛ";
 Buf[3]="... по Контрагентам";
 Buf[4]="... по Местонахождению";
 Buf[5]="... по драгметаллам ОС";
 Buf[6]="... по отчету";
 nn=Alternate("Выберите тип отчета ...", Buf, -1);
 if nn<>0: Отчет=nn-1; fi;
-- Отчет=if(Отчет<3:Отчет+1,0);
 ^false;
end;
func ПриВходе(s:s;i:i):l;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="Для наименования (по возростанию)";
 Buf[2]="Для наименования (по убыванию)";
 if Отчет=0:
   Buf[3]="Для кода (по возростанию)";
   Buf[4]="Для кода (по убыванию)";
 fi;
 nn=Alternate("Выберите вид сортировки ...", Buf, -1);
 if nn=0:^false;fi;
 if Отчет=0:
   if nn=1:СортироватьСекцию(Отч0,'Наимен',true,false); Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвниз;
    | nn=2:СортироватьСекцию(Отч0,'Наимен',false,false);Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвверх;
    | nn=3:СортироватьСекцию(Отч0,'НаименПР',true,false); Sort2='';Sort0='';Sort1=Раб.Нфа.B00.ch_S_wвниз;
    | nn=4:СортироватьСекцию(Отч0,'НаименПР',false,false);Sort2='';Sort0='';Sort1=Раб.Нфа.B00.ch_S_wвверх;
   fi;
  | true:
   if nn=1:СортироватьСекцию(Отч4,'Наимен',true,false); Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвниз;
    | nn=2:СортироватьСекцию(Отч4,'Наимен',false,false);Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвверх;
    | nn=3:СортироватьСекцию(Отч4,'Наимен',true,false); Sort2='';Sort0='';Sort1=Раб.Нфа.B00.ch_S_wвниз;
    | nn=4:СортироватьСекцию(Отч4,'Наимен',false,false);Sort2='';Sort0='';Sort1=Раб.Нфа.B00.ch_S_wвверх;
   fi;
 fi;

--var SSS:S=Раб.Нфа.B00.ch_S_wвверх+Раб.Нфа.B00.ch_S_wвниз+Раб.Нфа.B00.ch_S_wвправо+Раб.Нфа.B00.ch_S_wвлево;

^false;
end;
proc РазрешенУчетОстН(Enabl:l);
 ФлМеньшеНульОстН.Enabled=Enabl;
 ФлНульОстН.Enabled	 =Enabl;
 ФлБольшеНульОстН.Enabled=Enabl;
end;
proc РазрешенУчетОстК(Enabl:l);
 ФлМеньшеНульОстК.Enabled=Enabl;
 ФлНульОстК.Enabled	 =Enabl;
 ФлБольшеНульОстК.Enabled=Enabl;
end;
proc РазрешенУчетОст(Enabl:l);
 ФлУчетОстН.Enabled=Enabl;
 ФлУчетОстК.Enabled=Enabl;
 if Enabl:
    РазрешенУчетОстН(УчетОстН);
    РазрешенУчетОстК(УчетОстК);
  | true:
    РазрешенУчетОстН(Enabl);
    РазрешенУчетОстК(Enabl);
 fi;
end;
proc РазрешенУчетОбо(Enabl:l);
 ФлМеньшеНульОбо.Enabled=Enabl;
 ФлНульОбо.Enabled	=Enabl;
 ФлБольшеНульОбо.Enabled=Enabl;
end;
proc РазрешенВыводГрупп(Enabl:l);
if Enabl:ЗаполнитьГруппы;fi;
ПЕР10_СЕКЦИЯ.столбец(2,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ.столбец(3,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ.столбец(2,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ.столбец(2,ColVisible,Enabl);

ПЕР10_СЕКЦИЯ_Ц.столбец(2,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ_Ц.столбец(3,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец (2,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец(2,ColVisible,Enabl);
end;
proc РазрешенУчетДопАнализ(Enabl:l);
ПЕР10_СЕКЦИЯ.столбец(8+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ.столбец (5+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ.столбец(4+1,ColVisible,Enabl);

ПЕР10_СЕКЦИЯ_Ц.столбец(8+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец (5+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец(4+1,ColVisible,Enabl);
end;

proc РазрешенРасчетТолькоОстаткиК(Enabl:l);
Enabl=not Enabl;
ПЕР10_СЕКЦИЯ.столбец( 9+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ.столбец(10+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ.столбец(11+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ.столбец(12+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ.столбец(13+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ.столбец(14+1,ColVisible,Enabl);

ОТЧ0_СЕКЦИЯ.столбец ( 6+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ.столбец ( 7+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ.столбец ( 8+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ.столбец ( 9+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ.столбец (10+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ.столбец (11+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ.столбец( 5+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ.столбец( 6+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ.столбец( 7+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ.столбец( 8+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ.столбец( 9+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ.столбец(10+1,ColVisible,Enabl);

ПЕР10_СЕКЦИЯ_Ц.столбец( 9+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ_Ц.столбец(10+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ_Ц.столбец(11+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ_Ц.столбец(12+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ_Ц.столбец(13+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ_Ц.столбец(14+1,ColVisible,Enabl);

ПЕР10_СЕКЦИЯ_Ц.столбец(15+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ_Ц.столбец(16+1,ColVisible,Enabl);
ПЕР10_СЕКЦИЯ_Ц.столбец(17+1,ColVisible,Enabl);
--ПЕР10_СЕКЦИЯ_Ц.столбец(18,ColVisible,Enabl);

ОТЧ0_СЕКЦИЯ_Ц.столбец( 6+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец( 7+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец( 8+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец( 9+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец(10+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец(11+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец(12+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец(13+1,ColVisible,Enabl);
ОТЧ0_СЕКЦИЯ_Ц.столбец(14+1,ColVisible,Enabl);
--ОТЧ0_СЕКЦИЯ_Ц.столбец(15,ColVisible,Enabl);

ПЕР30_СЕКЦИЯ_Ц.столбец( 5+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец( 6+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец( 7+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец( 8+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец( 9+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец(10+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец(11+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец(12+1,ColVisible,Enabl);
ПЕР30_СЕКЦИЯ_Ц.столбец(13+1,ColVisible,Enabl);
--ПЕР30_СЕКЦИЯ_Ц.столбец(14,ColVisible,Enabl);
end;
proc Разрешенрасчитывать_доп(Enabl:l);
ПЕР10_СЕКЦИЯ.столбец(17+1,ColVisible,Enabl и количество_доп);
ПЕР10_СЕКЦИЯ.столбец(18+1,ColVisible,Enabl и сумма_доп);
ПЕР10_СЕКЦИЯ.столбец(19+1,ColVisible,Enabl и цена_доп);
ОТЧ0_СЕКЦИЯ.столбец (14+1,ColVisible,Enabl и количество_доп);
ОТЧ0_СЕКЦИЯ.столбец (15+1,ColVisible,Enabl и сумма_доп);
ОТЧ0_СЕКЦИЯ.столбец (16+1,ColVisible,Enabl и цена_доп);

ПЕР30_СЕКЦИЯ.столбец(13+1,ColVisible,Enabl и количество_доп);
ПЕР30_СЕКЦИЯ.столбец(14+1,ColVisible,Enabl и сумма_доп);
ПЕР30_СЕКЦИЯ.столбец(15+1,ColVisible,Enabl и цена_доп);

ПЕР10_СЕКЦИЯ_Ц.столбец(17+4+1,ColVisible,Enabl и количество_доп);
ПЕР10_СЕКЦИЯ_Ц.столбец(18+4+1,ColVisible,Enabl и сумма_доп);
ПЕР10_СЕКЦИЯ_Ц.столбец(19+4+1,ColVisible,Enabl и цена_доп);
ОТЧ0_СЕКЦИЯ_Ц.столбец(14+4+1,ColVisible,Enabl и количество_доп);
ОТЧ0_СЕКЦИЯ_Ц.столбец(15+4+1,ColVisible,Enabl и сумма_доп);
ОТЧ0_СЕКЦИЯ_Ц.столбец(16+4+1,ColVisible,Enabl и цена_доп);

ПЕР30_СЕКЦИЯ_Ц.столбец(13+4+1,ColVisible,Enabl и количество_доп);
ПЕР30_СЕКЦИЯ_Ц.столбец(14+4+1,ColVisible,Enabl и сумма_доп);
ПЕР30_СЕКЦИЯ_Ц.столбец(15+4+1,ColVisible,Enabl и цена_доп);
end;

proc Фл_ПриИзменении(s:s);
 if s='ФлУчетОст'   :РазрешенУчетОст (УчетОст );
  | s='ФлУчетОстН'  :РазрешенУчетОстН(УчетОстН);
  | s='ФлУчетОстК'  :РазрешенУчетОстК(УчетОстК);
  | s='ФлУчетОбо'   :РазрешенУчетОбо (УчетОбо );
  | s='ФлВыводГрупп':РазрешенВыводГрупп (ВыводГрупп );
  | s='ФлУчетДопАнализ':РазрешенУчетДопАнализ(УчетДопАнализ);
  | s='ФлРасчетТолькоОстаткиК':РазрешенРасчетТолькоОстаткиК(РасчетТолькоОстаткиК);
  | s='расчитывать_доп' :Разрешенрасчитывать_доп(расчитывать_доп);
  | s='ФлПоказыватьЦены':
    РазрешенВыводГрупп (ВыводГрупп );
--    РазрешенУчетОст(УчетОст);
--    РазрешенУчетОбо(УчетОбо);
    РазрешенУчетДопАнализ(УчетДопАнализ);
    РазрешенРасчетТолькоОстаткиК(РасчетТолькоОстаткиК);
    Разрешенрасчитывать_доп(расчитывать_доп);
 fi;
end;
proc КнДопАн_ПриНажатии(s:s);
-- ДопСпр=ВыборПризнака('УЧН.*',true);
-- if ДопСпр<>'':ДопСпр=ДопСпр+'.*';fi;
 --Message('Возможность доп анализа в разрезе инв номеров находится в разработке');
end;
proc ВосстановитьНастройки1;
 СчетОтчета=ЕСЛИ(ОТЧЕТ=0: СчетНФА
		|ОТЧЕТ=1: СчетПок
		|ОТЧЕТ=2: СчетПост
		|ОТЧЕТ=3: СчетНФА
		|ОТЧЕТ=5: СчетНФА);
end;
proc ВосстановитьНастройки2;
  МАТЕРИАЛ=ЕСЛИ(ОТЧЕТ=0: "НФА.*"
	    |ОТЧЕТ=1: ""
	    |ОТЧЕТ=2: ""
	    |ОТЧЕТ=5: "НФА.*"
	    |ОТЧЕТ=3: "НФА.*");
end;
proc ВосстановитьНастройкиВсе;
ВосстановитьНастройки1;
ВосстановитьНастройки2;
УчетВНПР=true;
ИСТ1	=true;
ИСТ2	=true;
ИСТ3	=true;
ИСТ4	=true;
end;

proc OnOpen (l :L);
  var usr:s;
  usr=ИмяБазы('РПО_ОСТ_НФА');
  Пользователь=trim(ИмяПользователя(usr));
  Схема       =trim(ИмяСхемы(usr));
  Пользователь=Раб.СТР.ЗаменаПодстроки(Пользователь,' ','_');
  Схема=Раб.СТР.ЗаменаПодстроки(Схема,' ','_');
РазрешенВыводГрупп (ВыводГрупп );
РазрешенУчетОст(УчетОст);
РазрешенУчетОбо(УчетОбо);
РазрешенУчетДопАнализ(УчетДопАнализ);
РазрешенРасчетТолькоОстаткиК(РасчетТолькоОстаткиК);
Разрешенрасчитывать_доп(расчитывать_доп);
if Датадоп=1.1.100:Датадоп=Дат;fi;
if МАТЕРИАЛ='':ВосстановитьНастройки1;
fi;
if СчетОтчета='':ВосстановитьНастройки2;
fi;
  СохранитьНастройки(true);
--  ПостроитьОтчет("",0);
end;



Функ ВыборСорт(Поле: Строка; Итер: Целое): Логич;
 var ii:i;
 var ob:s;
 var ll:l;
  if Отчет=0 or Отчет=5: ob='ОТЧ0_СЕКЦИЯ';
   | true:    ob='ОТЧ4_СЕКЦИЯ';
  fi;
  ii=вопрос("", "Выбор способа сортировки...",	"По алфавиту;Обратно алфавита;отмена", mtConfirmation);
  if Поле='Sort0':
     if ii=1:СортироватьСекцию(ob,"НАИМЕНГР",true,false); Sort1='';Sort2='';Sort0=Раб.Нфа.B00.ch_S_wвниз;
      | ii=2:СортироватьСекцию(ob,"НАИМЕНГР",false,false); Sort1='';Sort2='';Sort0=Раб.Нфа.B00.ch_S_wвверх;
     fi;
   | Поле='Sort1':
     if ii=1:СортироватьСекцию(ob,"НАИМЕНПР",true,false); Sort0='';Sort2='';Sort1=Раб.Нфа.B00.ch_S_wвниз;
      | ii=2:СортироватьСекцию(ob,"НАИМЕНПР",false,false); Sort0='';Sort2='';Sort1=Раб.Нфа.B00.ch_S_wвверх;
     fi;
   | Поле='Sort2':
     if ii=1:СортироватьСекцию(ob,'НАИМЕН',true,false); Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвниз;
      | ii=2:СортироватьСекцию(ob,'НАИМЕН',false,false); Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвверх;
     fi;
  fi;
  Возврат false ;
end;

func ПриВходеФлаг(Поле: Строка; Итер: Целое): Логич;
 if Поле='количество_доп'   or Поле='количество_доп_'	 :количество_доп  =not количество_доп  ;Фл_ПриИзменении('расчитывать_доп');
  | Поле='сумма_доп'  or Поле='сумма_доп_'   :сумма_доп =not сумма_доп ;Фл_ПриИзменении('расчитывать_доп');
  | Поле='цена_доп' or Поле='цена_доп_'  :цена_доп=not цена_доп;Фл_ПриИзменении('расчитывать_доп');
  | Поле='расчитывать_доп' or Поле='#расчитывать_доп_'	:расчитывать_доп=not расчитывать_доп;Фл_ПриИзменении('расчитывать_доп');
 fi;
  ^false;
end;
Функ Датдоп_ПриВходе(Поле: Строка; Итер: Целое): Логич;
var ii:i;
  ClearVariable(buf);
  buf[1]='Отмена';
  buf[2]='Начало '+datetostring(ДатНач);
  buf[3]='Конец '+datetostring(Дат);
  buf[4]='Выбрать другую дату...';
  ii=alternate('Выбор даты для расчета доп столбца...',buf);
  if ii<2:^false;fi;
  if ii=2:Датадоп=ДатНач;
   | ii=3:Датадоп=Дат;
   | ii=4:Датадоп=Календарь(Датадоп);
  fi;
  ^false  ;
end;

--func ПриВходе(s:s;i:i):l;
--var nn :Integer;
-- ClearVariable(Buf);
-- Buf[1]="Для наименования (по возростанию)";
-- Buf[2]="Для наименования (по убыванию)";
-- if Отчет=0:
--   Buf[3]="Для кода (по возростанию)";
--   Buf[4]="Для кода (по убыванию)";
-- fi;
-- nn=Alternate("Выберите вид сортировки ...", Buf, -1);
-- if nn=0:^false;fi;
-- if Отчет=0:
--   if nn=1:СортироватьСекцию(Отч0,'Наимен',true,false); Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвниз;
--    | nn=2:СортироватьСекцию(Отч0,'Наимен',false,false);Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвверх;
--    | nn=3:СортироватьСекцию(Отч0,'НаименПР',true,false); Sort2='';Sort0='';Sort1=Раб.Нфа.B00.ch_S_wвниз;
--    | nn=4:СортироватьСекцию(Отч0,'НаименПР',false,false);Sort2='';Sort0='';Sort1=Раб.Нфа.B00.ch_S_wвверх;
--   fi;
--  | true:
--   if nn=1:СортироватьСекцию(Отч4,'Наимен',true,false); Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвниз;
--    | nn=2:СортироватьСекцию(Отч4,'Наимен',false,false);Sort1='';Sort0='';Sort2=Раб.Нфа.B00.ch_S_wвверх;
--    | nn=3:СортироватьСекцию(Отч4,'Наимен',true,false); Sort2='';Sort0='';Sort1=Раб.Нфа.B00.ch_S_wвниз;
--    | nn=4:СортироватьСекцию(Отч4,'Наимен',false,false);Sort2='';Sort0='';Sort1=Раб.Нфа.B00.ch_S_wвверх;
--   fi;
-- fi;


Проц Кнопка3_ПриНажатии(Отправитель: Строка);
  ВосстановитьНастройкиВсе;
end;
---------------------------------------------------------------

var xlEdgeLeft	:I=7;
var xlEdgeTop	:I=8;
var xlEdgeBottom:I=9;
var xlEdgeRight :I=10;

var xlHairline	 :I=1;
var xlMedium	 :I=-4138;
var xlThick	 :I=4;
var xlThin	 :I=2;

var xlGeneral	 :I=1;
var xlCenter	 :I=-4108;
var xlLeft	 :I=-4131;
var xlRight	 :I=-4152;

var xlVAlignBottom	 :I=-4107;
var xlVAlignCenter	 :I=-4108;
var xlVAlignDistributed  :I=-4117;
var xlVAlignJustify	 :I=-4130;
var xlVAlignTop 	 :I=-4160;




Func ВзятьЗначениеЯчейкиС (objSheet :AutoObject; X :Integer; Y :Integer) :String;
  var xlsRange :AutoObject;
  var ret :String;
  xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
  try
    try ret=AsString(xlsRange.Text); except ret=''; end;
  finally
    ClearVariable(xlsRange);
  end;
  return ret;
end;

Func ВзятьЗначениеЯчейкиЧ (objSheet :AutoObject; X :Integer; Y :Integer) :Numeric;
  var xlsRange :AutoObject;
  var ret :Numeric;
  xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
  try 
    try ret=AsReal(xlsRange.Value); except ret=0; end; 
  finally 
    ClearVariable(xlsRange); 
  end;
  return ret;
end;

Proc УстановитьШиринуСтолбца (objSheet :AutoObject; Num :Integer; Val :Numeric);
  var xlsColumn :AutoObject;
  xlsColumn=AsAutoObject(objSheet.Columns[Num]);
  try
    xlsColumn.ColumnWidth=Val;
  finally
    ClearVariable(xlsColumn);
  end;
end;

Proc НарисоватьГраницуЯчейки (objSheet :AutoObject; Border :Integer; Weight :Integer; X :Integer; Y :Integer);
  var xlsRange,xlsBorder :AutoObject;
  xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
  try
    xlsBorder=AsAutoObject(xlsRange.Borders[Border]);
    try
      xlsBorder.Weight=Weight;
    finally
      ClearVariable(xlsBorder);
    end;
  finally
    ClearVariable(xlsRange);
  end;
end;

Proc НарисоватьГраницуЯчейкиДиапазона (objSheet :AutoObject; Border :Integer; Weight :Integer; X1 :Integer; Y1 :Integer; X2 :Integer; Y2 :Integer);
  var xlsRange,xlsRange1,xlsRange2,xlsBorder :AutoObject;
  var ret :String;
  xlsRange1=AsAutoObject(objSheet.Cells[X1,Y1]);
  xlsRange2=AsAutoObject(objSheet.Cells[X2,Y2]);
  xlsRange=AsAutoObject(objSheet.Range[xlsRange1,xlsRange2]);
  try
    xlsBorder=AsAutoObject(xlsRange.Borders[Border]);
    try
      xlsBorder.Weight=Weight;
    finally
      ClearVariable(xlsBorder);
    end;
  finally
    ClearVariable(xlsRange);
    ClearVariable(xlsRange1);
    ClearVariable(xlsRange2);
  end;
end;

Proc УстановитьТекстЯчейки (objSheet :AutoObject; X :Integer; Y :Integer; Text :String; FontSize :Integer; Bold :Logical; Alignment :Integer);
  var xlsRange,xlsFont :AutoObject;
  xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
  try
    xlsRange.NumberFormat='@';
    xlsRange.Value=Text;
    xlsRange.HorizontalAlignment=Alignment;
    xlsFont=AsAutoObject(xlsRange.Font);
    try
      xlsFont.Bold=Bold;
      xlsFont.Size=FontSize;
    finally
      ClearVariable(xlsFont);
    end;
  finally
    ClearVariable(xlsRange);
  end;
end;

Proc УстановитьТекстЯчейки2 (objSheet :AutoObject; X :Integer; Y :Integer; Text :String; FontSize :Integer; Bold :Logical; AlignmentH :Integer; AlignmentV :Integer; WrapText :Logical);
  var xlsRange,xlsFont :AutoObject;
  xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
  try
    xlsRange.Value=Text;
    xlsRange.HorizontalAlignment=AlignmentH;
    xlsRange.VerticalAlignment=AlignmentV;
    xlsRange.WrapText=WrapText;
    xlsFont=AsAutoObject(xlsRange.Font);
    try
      xlsFont.Bold=Bold;
      xlsFont.Size=FontSize;
    finally
      ClearVariable(xlsFont);
    end;
  finally
    ClearVariable(xlsRange);
  end;
end;

Proc УстановитьЧислоЯчейки (objSheet :AutoObject; X :Integer; Y :Integer; Значение_ :Numeric; FontSize :Integer; Bold :Logical; Alignment :Integer);
  var xlsRange,xlsFont :AutoObject;
  xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
  try
    xlsRange.NumberFormat='# ##0,00';
    xlsRange.Value=Значение_;
    xlsRange.HorizontalAlignment=Alignment;
    xlsFont=AsAutoObject(xlsRange.Font);
    try
      xlsFont.Bold=Bold;
      xlsFont.Size=FontSize;
    finally
      ClearVariable(xlsFont);
    end;
  finally
    ClearVariable(xlsRange);
  end;
end;


Func ОбъединитьЯчейки (objSheet :AutoObject; X1 :Integer; Y1 :Integer; X2 :Integer; Y2 :Integer) :String;
  var xlsRange,xlsRange1,xlsRange2 :AutoObject;
  var ret :String;
  xlsRange1=AsAutoObject(objSheet.Cells[X1,Y1]);
  xlsRange2=AsAutoObject(objSheet.Cells[X2,Y2]);
  xlsRange=AsAutoObject(objSheet.Range[xlsRange1,xlsRange2]);
  try
    --try ret=AsString(xlsRange.Text); except ret=''; end;
    xlsRange.Merge;
  finally
    ClearVariable(xlsRange);
    ClearVariable(xlsRange1);
    ClearVariable(xlsRange2);
  end;
  return ret;
end;
var Exel_nn[]:n;
Proc УстановитьЧислоЯчейкиПоСтолбцу (objSheet :AutoObject; X :Integer; Y :Integer;Z :Integer; Значение_ :Numeric; FontSize :Integer; Bold :Logical; Alignment :Integer);
  var xlsRange,xlsFont,xlsRange1,xlsRange2 :AutoObject;
  var j:i;
    --xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
      for j=1..z do
	try
	xlsRange=AsAutoObject(objSheet.Cells[X-1+j,Y]);
--	xlsRange.NumberFormat='# ##0,00';
	xlsRange.Value=Exel_nn[j];
  --	xlsRange.HorizontalAlignment=Alignment;
  --	xlsFont=AsAutoObject(xlsRange.Font);
  --	try
  --	  xlsFont.Bold=Bold;
  --	  xlsFont.Size=FontSize;
  --	finally
  --	  ClearVariable(xlsFont);
  --	end;
	finally
	  ClearVariable(xlsRange);
	end;
      od;
  exit;-- выход без формата клеток
  xlsRange1=AsAutoObject(objSheet.Cells[X,Y]);
  xlsRange2=AsAutoObject(objSheet.Cells[X+Z,Y]);
  xlsRange=AsAutoObject(objSheet.Range[xlsRange1,xlsRange2]);
  try
    xlsRange.NumberFormat='# ##0,00';
--    xlsRange.HorizontalAlignment=Alignment;
--    xlsFont=AsAutoObject(xlsRange.Font);
--    try
--	xlsFont.Bold=Bold;
--	xlsFont.Size=FontSize;
--    finally
--	ClearVariable(xlsFont);
--    end;
  finally
    ClearVariable(xlsRange);
    ClearVariable(xlsRange1);
    ClearVariable(xlsRange2);
  end;
end;
var Exel_ss[]:s;
Proc УстановитьТекстЯчейкиПоСтолбцу (objSheet :AutoObject; X :Integer; Y :Integer;Z :Integer; Text :String; FontSize :Integer; Bold :Logical; Alignment :Integer);
  var xlsRange,xlsFont,xlsRange1,xlsRange2 :AutoObject;
  var j:i;
  --xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
    for j=1..z do
      try
      xlsRange=AsAutoObject(objSheet.Cells[X-1+j,Y]);
      xlsRange.Value=Exel_ss[j];
      finally
	ClearVariable(xlsRange);
      end;
    od;
  xlsRange1=AsAutoObject(objSheet.Cells[X,Y]);
  xlsRange2=AsAutoObject(objSheet.Cells[X+Z,Y]);
  xlsRange=AsAutoObject(objSheet.Range[xlsRange1,xlsRange2]);
  try
    xlsRange.NumberFormat='@';
--    xlsRange.Value=Text;
    xlsRange.HorizontalAlignment=Alignment;
    xlsFont=AsAutoObject(xlsRange.Font);
    try
      xlsFont.Bold=Bold;
      xlsFont.Size=FontSize;
    finally
      ClearVariable(xlsFont);
    end;
  finally
    ClearVariable(xlsRange);
    ClearVariable(xlsRange1);
    ClearVariable(xlsRange2);
  end;
end;

Proc УстановитьЦветЯчейкиДиапазона (objSheet :AutoObject; Color :Integer; X1 :Integer; Y1 :Integer; X2 :Integer; Y2 :Integer);
  var xlsRange,xlsRange1,xlsRange2,xlsInterior :AutoObject;
  var ret :String;
  xlsRange1=AsAutoObject(objSheet.Cells[X1,Y1]);
  xlsRange2=AsAutoObject(objSheet.Cells[X2,Y2]);
  xlsRange=AsAutoObject(objSheet.Range[xlsRange1,xlsRange2]);
  try
    xlsInterior=AsAutoObject(xlsRange.Interior);
    try
      xlsInterior.ColorIndex=Color;
    finally
      ClearVariable(xlsInterior);
    end;
  finally
    ClearVariable(xlsRange);
    ClearVariable(xlsRange1);
    ClearVariable(xlsRange2);
  end;
end;


Proc УстановитьШрифтЛиста (objSheet :AutoObject; Font :String; FontSize :Integer);
  var xlsRange,xlsFont :AutoObject;
  xlsRange=AsAutoObject(objSheet.Cells);
  try
    xlsFont=AsAutoObject(xlsRange.Font);
    try
      xlsFont.Name=Font;
      xlsFont.Size=FontSize;
    finally
      ClearVariable(xlsFont);
    end;
  finally
    ClearVariable(xlsRange);
  end;
end;


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

var Exp_col[]:i;
var Exp_col_UP1[]:s;
var Exp_col_UP2[]:s;
var Exp_col_UP_N[]:i;
var Exp_col_typ[]:i;
var Exp_col_var[]:s;
var Exp_col_width[]:i;
var Exp_col_left[]:i;
var Exp_col_fmt[]:S;
var Exp_col_cur:i;
Proc ExportToExcel;
  var ll :l;
  var отч_секц,ПЕР_СЕКЦИЯ :Объект;
  var отч_позиции,отч_столбцы,пер_столбцы,j,j0,k :i;
  var sXLSFile :String;
  var xlsApp,xlsBooks,xlsBook,xlsSheet,xlsRange :AutoObject;
  var i,iCurPos,iBeginPos :Integer;
  var filename_,ss,s0,s1 :String;
  var nn :n;
  var продолжить :l;

  var tmpS:S;
  var tmpF:S;
  var tmpI:I;

  продолжить=true;
--  if не ЕстьПапка(папка):папка='c:\';fi;
  filename_=BlankFileName('B');
  ss='';
  if pos('\\',filename_)=1:ss='\\';filename_=SubStr(filename_,3,255);fi;
  i=КоличествоСлов(filename_,'\')-1;
  папка=ss+ВыделитьСлова(1,i,filename_,'\')+'\';
  filename_='ОБОРОТЫ_НФА_'+Схема;
  filename_=РАБ.НФА.B01.abl(filename_,'_',ДопПр);
  filename_=filename_+'_'+datetostring(Дат)+'.xls';
  filename_=папка+filename_;
  if existfile(filename_):
     try
       DeleteFile(filename_);
     except
       message('Экспорт невозможен!^MПредварительно закройте EXEL=^M'+filename_);
       exit;
     end;
  fi;

--var Пользователь:s;
--var Схема:s;
  ss='ОТЧ0_СЕКЦИЯ ОТЧ0_СЕКЦИЯ_Ц ОТЧ4_СЕКЦИЯ';
  s0='ПЕР10_СЕКЦИЯ ПЕР10_СЕКЦИЯ_Ц ПЕР4_СЕКЦИЯ';
  k=КоличествоСлов(ss,' ');
  отч_позиции=0;ll=false;
  for j=1..k do
      if not ll:
	 if FindObject(ВыделитьСлово(j,ss,' '),отч_секц):
	    ll=FindObject(ВыделитьСлово(j,s0,' '),ПЕР_СЕКЦИЯ);
	    ll=AsLogical(отч_секц.visible);
	    if ll:ll=AsInteger(отч_секц.КоличествоКадров)>0;fi;
	 fi;
      fi;
  od;
  if not ll:exit;fi;
  iBeginPos=9;

  отч_позиции=AsInteger(отч_секц.КоличествоКадров);
  отч_столбцы=AsInteger(отч_секц.КоличествоСтб);
  пер_столбцы=AsInteger(ПЕР_СЕКЦИЯ.КоличествоСтб);
  ClearVariable(Exp_col_cur);
  ClearVariable(Exp_col    );
  ClearVariable(Exp_col_typ);
  ClearVariable(Exp_col_var);
  ClearVariable(Exp_col_width);
  ClearVariable(Exp_col_left);
  ClearVariable(Exp_col_UP1);
  ClearVariable(Exp_col_UP2);
  ClearVariable(Exp_col_UP_N);
  ClearVariable(Exp_col_fmt);

  for j=1..отч_столбцы do
--  AsInteger(Sect1.Column(3, ColLeft,''));
    if AsLogical(отч_секц.Column(j,ColVisible,'')):
       Exp_col_cur=Exp_col_cur+1;
       Exp_col	    [Exp_col_cur]=j;
       Exp_col_width[Exp_col_cur]=AsInteger(отч_секц.Column(j,ColWidth,''));
       Exp_col_typ  [Exp_col_cur]=AsInteger(отч_секц.Cell(1, j, CellFieldType, ''));
       Exp_col_var  [Exp_col_cur]=AsString(отч_секц.Cell(1, j, CellContents, ''));
       Exp_col_left [Exp_col_cur]=AsInteger(отч_секц.Column(j,ColLeft,''));
       Exp_col_fmt  [Exp_col_cur]=AsString(отч_секц.Cell(1, j, CellFormat, ''));

    fi;
  od;
  for j=1..пер_столбцы do
    if AsLogical(ПЕР_СЕКЦИЯ.Column(j,ColVisible,'')):
       k=AsInteger(ПЕР_СЕКЦИЯ.Column(j,ColLeft,''));
       k=SearchInArray(Exp_col_left,k,true);
       if k>0:-- нашли столбец в шапке
	  Exp_col_UP_N[k]=j;
	  Exp_col_UP1[k]=AsString(ПЕР_СЕКЦИЯ.Cell(1, j, CellText, ''));
	  Exp_col_UP2[k]=AsString(ПЕР_СЕКЦИЯ.Cell(2, j, CellText, ''));
	  if Exp_col_UP2[k]=Exp_col_UP1[k]:Exp_col_UP2[k]='';fi;
       fi;
    fi;
  od;

--cftStaticText | ктпСтатическийТекст	   = 1
--cftCommonField | ктпОбщееПоле 	 = 2
--cftStringField | ктпСтроковоеПоле	     = 3
--cftNumericField | ктпЧисловоеПоле	  = 4
--cftDateField | ктпПолеДаты		       = 5
--cftEnumField | ктпПеречислимоеПоле   = 6
--cftReferenceField | ктпСсылочноеПоле	= 7
--cftCalcField | ктпВычислимоеПоле	  = 8
--  copyarray('Exp_col_typ',Exp_col_var);
--  exit;
  --
  --if ChooseFile(sXLSFile,'Сохранение документа в формате MS Excel','Файл MS Excel (*.xls)|*.xls') <> cmOK: Exit; fi;
  --
--  exit;
  if Раб.Python.LOAD(True):
    try
      if Раб.Python.Import("xlwt,tb_dbt"):
	 Раб.Python.EXEC("wb=xlwt.Workbook(encoding='cp1251')");
	 Раб.Python.EXEC("ws=wb.add_sheet('Обороты')"); --
	 Раб.Python.EXEC("style_B=xlwt.easyxf('''font: name Times New Roman, height 200; alignment: horz center; borders: left medium, right medium, top medium, bottom medium''')");
	 Раб.Python.EXEC("style0=xlwt.easyxf('''font: name Times New Roman, height 200; alignment: horz center''')");
	 ss='отчет по НФА с '+datetostring(ДатНач)+' по '+datetostring(Дат);
	 Раб.Python.EXEC("ws.write(1,5,'"+ss+"',style0)");
	 Раб.Python.EXEC("ws.write(2,1,'НФА',style_B)");
	 Раб.Python.EXEC("ws.write(3,1,'МЕСТО',style_B)");
	 Раб.Python.EXEC("ws.write(4,1,'МОЛ',style_B)");
	 Раб.Python.EXEC("ws.write(5,1,'ДОП_ПРИЗНАК',style_B)");
	 Раб.Python.EXEC("ws.write(6,1,'СЧЕТ',style_B)");

	 Раб.Python.EXEC("ws.write(2,2,'"+МАТЕРИАЛ+"',style_B)");
	 Раб.Python.EXEC("ws.write(3,2,'"+СКЛАД+"',style_B)");
	 Раб.Python.EXEC("ws.write(4,2,'"+ПОКУПАТЕЛЬ+"',style_B)");
	 Раб.Python.EXEC("ws.write(5,2,'"+ДопПр+"',style_B)");
	 Раб.Python.EXEC("ws.write(6,2,'"+СчетОтчета+"',style_B)");

	 ShowProgress(Exp_col_cur,'Экспорт...');
	 tmpF=Раб.Бюджет2005.tempfile("","dbt");
	 if WriteVarInDBT(tmpF,False):
	    tmpF=tmpF;
	 fi;

	 j0 = 1;
	 for j=1..Exp_col_cur do
	    Раб.Python.EXEC("j="+Str(j-1)); --Смена контекста и точки отсчета одновременно
	    --Ширины столбцов
	    Раб.Python.EXEC("ws.col(j).width="+str(Exp_col_width[j]*20));
	    --Пишем верхний заголовок, он может сливаться.
	    if j < Exp_col_cur:
	       if Exp_col_UP1[j+1]=Exp_col_UP1[j] and trim(Exp_col_UP1[j+1])<>'':
		  j0 = j0; -- Если ячейка та же, то пропускаем (левая граница записи остается где была)
	       else
		  --Если новая ячейка - пишем и сбрасываем левую границу на следующую ячейку.
		  Раб.Python.EXEC("ws.write_merge("+Str(iBeginPos-1)+","+Str(iBeginPos-1)+", "+Str(j0-1)+",j ,'"+Exp_col_UP1[j]+"',style_B)");
		  j0 = j + 1;
	       fi;
	     | true:
	       --когда пишем последнюю сбрасывать границу необязательно
	       Раб.Python.EXEC("ws.write_merge("+Str(iBeginPos-1)+","+Str(iBeginPos-1)+", "+Str(j0-1)+",j ,'"+Exp_col_UP1[j]+"',style_B)");
	    fi;

	    --Пишем нижний заголовок
	    Раб.Python.EXEC("ws.write("+Str(iBeginPos)+",j ,'"+Exp_col_UP2[j]+"',style_B)");

	    --Вычисляем стиль клетки
	    Раб.Python.EXEC("style_b=xlwt.easyxf('''font: name Times New Roman, height 200''')");
	    Раб.Python.XLWT.ВзятьСтильКлетки(отч_секц, 1, Exp_col[j], "style_b");
	    --Пишем столбец таблицы
	    if Exp_col_typ[j]=ктпЧисловоеПоле:

	       tmpS = РАБ.Python.XLWT.КОНВЕРТФОРМАТ(Exp_col_fmt[j]);
	       if tmpS <> '':
		  Раб.Python.EXEC("style_b.num_format_str=r'''"+tmpS+"'''");
	       fi;
	       Раб.Python.EXEC("col_values = tb_dbt.read_array(r'"+tmpF+"','"+Up(Exp_col_var[j])+"',float)");
	       Раб.Python.EXEC("for k in range(1,"+str(отч_позиции)+"):"+
		       chr(10)+"  ws.write("+Str(iBeginPos)+" + k, j, col_values.get(k,0), style_b)");
	      -------------------------------
	      |Exp_col_typ[j]=ктпСтроковоеПоле:

	       Раб.Python.EXEC("col_values = tb_dbt.read_array(r'"+tmpF+"','"+Up(Exp_col_var[j])+"')");
	       Раб.Python.EXEC("for k in range(1,"+str(отч_позиции)+"):"+
		       chr(10)+"  ws.write("+Str(iBeginPos)+" + k, j, col_values.get(k,''), style_b)");
	      -----------------------------------------
	     | true:
	       for k=1..отч_позиции do
		   Раб.Python.AssignS("_s_tmp_", AsString(отч_секц.Cell(k, Exp_col[j], CellText, '')));
		   Раб.Python.EXEC("ws.write("+Str(iBeginPos+k)+",j , _s_tmp_, style_b)");
	       od;
	    fi;
	    ProgressPos(j);
	 od;
--	   Раб.Python.EXEC("wb.countrycode=1");
	 CloseProgress;
	 Раб.Python.EXEC("wb.save(r'"+filename_+"')");

      fi;
    finally
      Раб.Python.UNLOAD;
    end;
    продолжить=false;
  fi;
  if продолжить:
  if РАБ.Yoksel.YokselReady:

    xlsApp=CreateAutoObject('Yoksel');

    try
	  xlsSheet=AsAutoObject(xlsApp.CreateSpreadsheetDocument);
	  try
	    РАБ.Yoksel.УстановитьШрифтЛиста(xlsSheet,'Times New Roman',10);
	    ss='отчет по НФА с '+datetostring(ДатНач)+' по '+datetostring(Дат);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,1,6,ss ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,2,2,'НФА' ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,3,2,'МЕСТО' ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,4,2,'МОЛ' ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,5,2,'ДОП ПРИЗНАК' ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,6,2,'СЧЕТ' ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);

	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,2,3,МАТЕРИАЛ ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,3,3,СКЛАД ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,4,3,ПОКУПАТЕЛЬ ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,5,3,ДопПр ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,6,3,СчетОтчета ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	    РАБ.Yoksel.НарисоватьГраницуЯчейкиДиапазона(xlsSheet,12,2,2,6,3);
	    --РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,2,2,6,3,true,true,true,true,true,true,false,false,xlEdgeBottom,xlThin);

	    for j=1..Exp_col_cur do
--		   УстановитьШиринуСтолбца(xlsSheet,j,Exp_col_width[j]/20);
		 РАБ.Yoksel.УстановитьШиринуСтолбца(xlsSheet,j,Exp_col_width[j]);
	    od;
  1	    ShowProgress(0Exp_col_cur1,'Экспорт...');

	    for j=1..Exp_col_cur do
	       РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,iBeginPos  ,j,Exp_col_UP2[j] ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	       if j>1:
		  if Exp_col_UP1[j-1]=Exp_col_UP1[j] and trim(Exp_col_UP1[j])<>'':
		     РАБ.Yoksel.ОбъединитьЯчейкиДиапазона(xlsSheet,iBeginPos-1,j-1,iBeginPos-1,j);
		   | true:
		     РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,iBeginPos-1,j,Exp_col_UP1[j] ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
		  fi;
		| true:
		     РАБ.Yoksel.УстановитьТекстЯчейки(xlsSheet,iBeginPos-1,j,Exp_col_UP1[j] ,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
	       fi;

		if Exp_col_typ[j]=ктпЧисловоеПоле:
		   ClearVariable(РАБ.Yoksel.Exel_nn);
		   for k=1..отч_позиции do
		       ss=AsString(отч_секц.Cell(k, Exp_col[j], CellText, ''));
		       nn=round(ss,6);
		       РАБ.Yoksel.Exel_nn[k]=nn;
		   od;
		   iCurPos=1+iBeginPos;
		   РАБ.Yoksel.УстановитьЧислоЯчейкиПоСтолбцу(xlsSheet,iCurPos,j,отч_позиции,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
		 | true:
		     ClearVariable(РАБ.Yoksel.Exel_ss);
		     for k=1..отч_позиции do
			 ss=AsString(отч_секц.Cell(k, Exp_col[j], CellText, ''));
			 РАБ.Yoksel.Exel_ss[k]=ss;
		     od;
		     РАБ.Yoksel.УстановитьТекстЯчейкиПоСтолбцу(xlsSheet,iCurPos,j,отч_позиции,10,false,РАБ.Yoksel.КлеткаВыравнивание_центр);
		fi;
  1		ProgressPos(0j1);
	    od;
	      РАБ.Yoksel.НарисоватьГраницуЯчейкиДиапазона(xlsSheet,12,iBeginPos-1,1,отч_позиции+iBeginPos,Exp_col_cur);
--	    РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,iBeginPos-1,1,отч_позиции+iBeginPos,Exp_col_cur,true,true,true,true,true,true,false,false,xlEdgeBottom,xlThin);
  1	      CloseProgress;

	  finally
	    xlsSheet.Save(filename_,1);  -- закрыть книгу
	    xlsSheet.Clear;
	    ClearVariable(xlsSheet);
	  end;
    finally
      ClearVariable(xlsApp); -- освободить объект Excel
    end;
    --message('yoksel');
    продолжить=false;
  fi;
  fi;
  if продолжить:
  if РАБ.Yoksel.ExcelReady:
    xlsApp=CreateAutoObject('Excel.Application');
    try
      xlsApp.EnableEvents=false;   -- отключить события
      --xlsApp.AutomationSecurity=3; -- отключить макросы
      xlsBooks=AsAutoObject(xlsApp.Workbooks); -- получить объект Workbooks
      try
	xlsBook=AsAutoObject(xlsBooks.Add); -- добавить книгу
	try
	  xlsSheet=AsAutoObject(xlsBook.Worksheets[1]); -- получить объект Worksheet первого листа
	  try
	    УстановитьШрифтЛиста(xlsSheet,'Times New Roman',10);
	    ss='отчет по НФА с '+datetostring(ДатНач)+' по '+datetostring(Дат);
	    УстановитьТекстЯчейки(xlsSheet,1,6,ss ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,2,2,'НФА' ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,3,2,'МЕСТО' ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,4,2,'МОЛ' ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,5,2,'ДОП ПРИЗНАК' ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,6,2,'СЧЕТ' ,10,false,xlCenter);

	    УстановитьТекстЯчейки(xlsSheet,2,3,МАТЕРИАЛ ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,3,3,СКЛАД ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,4,3,ПОКУПАТЕЛЬ ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,5,3,ДопПр ,10,false,xlCenter);
	    УстановитьТекстЯчейки(xlsSheet,6,3,СчетОтчета ,10,false,xlCenter);
	    РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,2,2,6,3,true,true,true,true,true,true,false,false,xlEdgeBottom,xlThin);

	    for j=1..Exp_col_cur do
		 УстановитьШиринуСтолбца(xlsSheet,j,Exp_col_width[j]/20);
	    od;
  1	    ShowProgress(0Exp_col_cur1,'Экспорт...');

	    for j=1..Exp_col_cur do
	       УстановитьТекстЯчейки(xlsSheet,iBeginPos  ,j,Exp_col_UP2[j] ,10,false,xlCenter);
	       if j>1:
		  if Exp_col_UP1[j-1]=Exp_col_UP1[j] and trim(Exp_col_UP1[j])<>'':
		     ОбъединитьЯчейки(xlsSheet,iBeginPos-1,j-1,iBeginPos-1,j);
		   | true:
		     УстановитьТекстЯчейки(xlsSheet,iBeginPos-1,j,Exp_col_UP1[j] ,10,false,xlCenter);
		  fi;
		| true:
		     УстановитьТекстЯчейки(xlsSheet,iBeginPos-1,j,Exp_col_UP1[j] ,10,false,xlCenter);
	       fi;
  --		     for k=1..отч_позиции do
  --			 iCurPos=k+iBeginPos;
  --			 ss=AsString(отч_секц.Cell(k, Exp_col[j], CellText, ''));
  --			 УстановитьТекстЯчейки(xlsSheet,iCurPos,j,ss ,10,false,xlCenter);
  --		     od;

		if Exp_col_typ[j]=ктпЧисловоеПоле:
		   ClearVariable(Exel_nn);
		   for k=1..отч_позиции do
  --			 iCurPos=k+iBeginPos;
		       ss=AsString(отч_секц.Cell(k, Exp_col[j], CellText, ''));
		       nn=round(ss,6);
		       Exel_nn[k]=nn;
  --			 nn=AsReal  (отч_секц.Cell(k, Exp_col[j], CellValue, ''));
  --			 УстановитьЧислоЯчейки(xlsSheet,iCurPos,j,nn ,10,false,xlGeneral); -- сумма всего
		   od;
		   iCurPos=1+iBeginPos;
		   УстановитьЧислоЯчейкиПоСтолбцу(xlsSheet,iCurPos,j,отч_позиции,0 ,10,false,xlGeneral);
		 | true:
		     ClearVariable(Exel_ss);
		     for k=1..отч_позиции do
			 --iCurPos=k+iBeginPos;
			 ss=AsString(отч_секц.Cell(k, Exp_col[j], CellText, ''));
			 Exel_ss[k]=ss;
		     od;
  --		     for k=1..отч_позиции do
  --			 iCurPos=k+iBeginPos;
  --			 ss=AsString(отч_секц.Cell(k, Exp_col[j], CellText, ''));
  --			 УстановитьТекстЯчейки(xlsSheet,iCurPos,j,ss ,10,false,xlCenter);
  --		     od;
		     УстановитьТекстЯчейкиПоСтолбцу(xlsSheet,iCurPos,j,отч_позиции,'' ,10,false,xlCenter);
		fi;
  1		ProgressPos(0j1);
	    od;
	    РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,iBeginPos-1,1,отч_позиции+iBeginPos,Exp_col_cur,true,true,true,true,true,true,false,false,xlEdgeBottom,xlThin);
  1	      CloseProgress;

  --	      УстановитьТекстЯчейки2(xlsSheet,11,6,'Примечание',10,false,xlCenter,xlVAlignCenter,true);

  --	      ОбъединитьЯчейки(xlsSheet,1,5,1,6);
  --	      НарисоватьГраницуЯчейкиДиапазона(xlsSheet,xlEdgeTop,xlThin,7,1,7,17);

  --	      НарисоватьГраницуЯчейкиДиапазона(xlsSheet,xlEdgeBottom,xlThin,7,11,7,12);
  --	      НарисоватьГраницуЯчейкиДиапазона(xlsSheet,xlEdgeBottom,xlThin,7,14,7,15);

  --	      УстановитьЦветЯчейкиДиапазона(xlsSheet,35,7,1,8,17);

  --	      ОбъединитьЯчейки(xlsSheet,9,2,9,9);

  --	      УстановитьЦветЯчейкиДиапазона(xlsSheet,34,9,1,9,17);

  1--		РАБ.EXCEL.УстановитьВсеГраницыОднойЯчейки(xlsSheet,iCurPos+1,5,true,true,true,true,false,false,xlEdgeBottom,xlThin);
  1--		РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,iBeginPos-2,1,позиции+iBeginPos-1,6,true,true,true,true,true,true,false,false,xlEdgeBottom,xlThin);

  --	      УстановитьТекстЯчейки(xlsSheet,iCurPos+4,2,'Руководитель предприятия',10,false,xlLeft);
  --	      УстановитьТекстЯчейки(xlsSheet,iCurPos+6,2,'Главный бухгалтер',10,false,xlLeft);
	  finally
	    ClearVariable(xlsSheet);
	  end;
	finally
  --	    filename_=''+папка+'111.xls';
	  xlsBook.SaveAs(filename_); --xlsBook.Close(true,sXLSFile); -- закрыть книгу
	  xlsBook.Close; --xlsBook.Close(true,sXLSFile); -- закрыть книгу
	  ClearVariable(xlsBook); -- освободить объект книги
	end;
      finally
	xlsBooks.Close; --xlsBook.Close(true,sXLSFile); -- закрыть книгу
	ClearVariable(xlsBooks); -- освободить объект книг
      end;
    finally
  --	xlsApp.Close; --xlsBook.Close(true,sXLSFile); -- закрыть книгу
      ClearVariable(xlsApp); -- освободить объект Excel
    end;
    продолжить=false;
  fi;
  fi;

  if existfile(filename_):
     ExecuteProgram(filename_,false);
  fi;
end;

Проц В_EXEL_ПриНажатии(Отправитель: Строка);
  var tt:i;
  tt=time;
  ExportToExcel;
  РАБ.НФА.B01.РасчетЗавершен('Выгрузка завершена!^MВремя выгрузки: ',time-tt);
end;

КОНЕЦ