-- Шаблон создан мастером бланков
-- 03.01.2005 18:02:20
--

БланкСШаблоном "Работа с системой отчетов";
var РабОбл[]:i;
var Карт[]:s;
var КартUkey[]:s;
var tempS[]:s;
var tempSError[]:s;
var сетевая:l;
---------------------------
var current_РПО_ОТЧЕТЫ_СТРОКА:record;
var current_РПО_ОТЧЕТЫ_СТРОКА_str:s;
var wa_РПО_ОТЧЕТЫ_ГРУППЫ:i;
var wa_РПО_ОТЧЕТЫ_СТРОКИ:i;
--var wa_РПО_ОТЧЕТЫ_ГРУППЫ_open:l;
--var wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:l;
--var rs_wa_РПО_ОТЧЕТЫ_ГРУППЫ:i=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,records(wa_РПО_ОТЧЕТЫ_ГРУППЫ),0);
--var NN_[]:i=$;
--var УСЛ_ПРИЗН   []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_ПРИЗН'),'');
--var КАРТ        []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'КАРТ'),'');
--var УСЛ_КАРТ    []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_КАРТ'),'');
--var АВТОГРУППА  []:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'АВТОГРУППА'),false);
--var СЧИТАТЬАВТОГРУППУ  []:i=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,if(АВТОГРУППА[$],getfieldi(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'СЧИТАТЬАВТОГРУППУ'),4),4);
---- 0-расчет автогруппы+константы по автогруппе;1-считать только автогруппу без констант;2-автогруппа закрыта, считать только константы;3-не считать автогруппу и ее константы
--var УСЛ_ПРИЗН_ГР[]:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_ПРИЗН_ГР'),'');

--var Поле1         []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'Поле1'),'');
--var УСЛ_Поле1соотв[]:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_Поле1соотв'),false);
--var УСЛ_Поле1     []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_Поле1'),'');
--var Усл1_2        []:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'Усл1_2'),false);
--var Поле2         []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'Поле2'),'');
--var УСЛ_Поле2соотв[]:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_Поле2соотв'),false);
--var УСЛ_Поле2     []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_Поле2'),'');


var СписокПризн[]:s;
var СписокПризн_rec[]:s;
var СписокПризнВсе[]:s;
var СписокПризн_было_карт_дубль[]:s;
var СписокПризн_было_карт_лишн[]:s;
var st[]:s;
var дополе1ст[]:s;
var дополе2ст[]:s;
var БУ_автогруппа[]:s;
var BufS[]:s;

func ВыборКорня(crd:s;field_cmnt:s;ff:s):i;
  var wa,rs,j:i;
  var rec:record;
  ff=trim(ff);
  if ff<>'': ff='('+ff+') and ';fi;
  ff=ff+'GroupDoc=nil and GroupAttr<>0';
  wa=OpenWorkArea(crd,'',ff);
    rs=records(wa);
    if rs=1:rec=GetRecordKey(wa,1);
     | rs=0:rec=nil;
     | true:
       ClearVariable(РАБ.НФА.ОТЧЕТЫ.BufS);
       for j=1..rs do
         BufS[j]=str(RecordToInteger(GetRecordKey(wa,j)))+'--'+GetFieldS(wa,j,field_cmnt);
       od;
    fi;
  closeworkarea(wa);
  if rs=0:^0;fi;
  if rs=1:^RecordToInteger(rec);fi;
  j=alternate('Выбор отчета...',BufS,-1,1,10);
  if j>0:^int(ВыделитьСлово(1,BufS[j],'--'));fi;
  ^0;
end;
func ВыборРасчета(ff:s):i;
  ^ВыборКорня('РПО_ОТЧЕТЫ','ИМЯ',ff);
end;


func ВыборОтчета(ff:s):i;
  ^ВыборКорня('РПО_ОТЧЕТЫ_СТРОКИ','ИМЯ',ff);

end;

ФильрАвтогруппы:i=[1];-- 0- и автогруппы и константы;1-автогруппы;2-константы
func ВзятьФильрАвтогруппы:s;

 if ФильрАвтогруппы=1:^'РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current_РПО_ОТЧЕТЫ_СТРОКА)+' and АВТОГРУППА';
  | ФильрАвтогруппы=2:^'РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current_РПО_ОТЧЕТЫ_СТРОКА)+' and not АВТОГРУППА';
 fi;
 ^'РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current_РПО_ОТЧЕТЫ_СТРОКА);
end;

--Proc cancelchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
--     if wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:if 1=0:beginchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);fi;
--        cancelchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing=false;
--     fi;
--end;

--Proc endchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
--     if wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:if 1=0:beginchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);fi;
--        endchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing=false;
--     fi;
--end;

--Proc Close_wa_РПО_ОТЧЕТЫ_ГРУППЫ(endchanging_wa:l;q:l);
--  if wa_РПО_ОТЧЕТЫ_ГРУППЫ_open:
--     if q и wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:endchanging_wa=ВопрДаОтказ('Сохранить изменения?',mtConfirmation)=кмдВерно;fi;
--     if endchanging_wa:endchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
--      | true:cancelchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
--     fi;
--     CloseWorkArea(wa_РПО_ОТЧЕТЫ_ГРУППЫ);wa_РПО_ОТЧЕТЫ_ГРУППЫ_open=false;
--  fi;
--end;
--Proc Open_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
--  Close_wa_РПО_ОТЧЕТЫ_ГРУППЫ(false,true);
--  wa_РПО_ОТЧЕТЫ_ГРУППЫ=OpenWorkArea('РПО_ОТЧЕТЫ_ГРУППЫ','',ВзятьФильрАвтогруппы);
--  wa_РПО_ОТЧЕТЫ_ГРУППЫ_open=true;
--end;
--Proc beginchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
--     if wa_РПО_ОТЧЕТЫ_ГРУППЫ_open and not wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:beginchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ,false);
--        if 1=0:endchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);fi;
--        wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing=true;
--     fi;
--end;
var ЕстьКартотекаСписок[]:s;
var ЕстьКартотекаINI:l;
func ЕстьКартотека1(Карт_:s):l;
  var ii:i;
     if not ЕстьКартотекаINI: ClearVariable(РАБ.НФА.ОТЧЕТЫ.ЕстьКартотекаСписок);ЕстьКартотекаINI=true;fi;
     ii=searchinarray(ЕстьКартотекаСписок,Карт_,true);
     if ii>0:^true;fi;
     if ЕстьКартотека(Карт_):
        addinarray(ЕстьКартотекаСписок,true,false,Карт_);
        ^true;
     fi;
     ^false;
end;
func Раскрыть_условие_автогруппы(ii:i;новая:l;допуслан:s;Расчет_допполе1:l;Расчет_допполе2:l;wa0:i;msg0:s;счетчик:i;счетчиквсего:i):i;-- количество признаков  ii-номер записи в wa_РПО_ОТЧЕТЫ_ГРУППЫ
  var КРТ,УСЛ_КРТ,УСЛ_ПРЗН,ss,Список_Спр,Поле1,Поле2:s;
  var wa1,rs,nr,ni,zz,k:i;
  var rec:record;
  var допполе1,допполе2,ОТ_КАРТ:l;
  if  новая:
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.СписокПризн);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.СписокПризн_rec);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.дополе1ст);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.дополе2ст);
     новая=false;
  fi;
  rs=-1;
  -- проверка на УСЛ_ПРИЗН
     КРТ=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'КАРТ'));УСЛ_КРТ=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'УСЛ_КАРТ'));
     УСЛ_ПРЗН=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'УСЛ_ПРИЗН'));
     if УСЛ_ПРЗН='':^0;fi;
     УСЛ_ПРЗН=РАБ.НФА.B01.abl(УСЛ_ПРЗН,'&',допуслан);
     if КРТ<>'':-- есть картотека
        if ЕстьКартотека1(КРТ):
           Поле1=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'Поле1'));
           Поле2=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'Поле2'));
           допполе1=Поле1<>'';
           допполе2=Поле2<>'';
           if wa0<1:
              wa1=openworkarea(КРТ,'',УСЛ_КРТ);
            | true:wa1=wa0;if 1=0:wa1=openworkarea(КРТ,'',УСЛ_КРТ);fi;
           fi;
              rs=records(wa1);
              if rs=0:
                 if wa0<1:CloseWorkArea(wa1);fi;
                ^0;
              fi;
           ОТ_КАРТ=getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'ОТ_КАРТ');
        fi;
     fi;
     ОкноВыполненияПоказать(счетчиквсего,msg0);ОкноВыполненияПоложение(счетчик);
     if rs>0 and ОТ_КАРТ:
        Список_Спр=Раб.НФА.B01.СписокСправочниковПоМаске(УСЛ_ПРЗН,'|');
        if Список_Спр='':CloseWorkArea(wa1);^0;fi;
        Список_Спр='|'+Список_Спр+'|';
        for nr=1..rs do
          rec=ВзятьКлючЗаписи(wa1,nr);
          zz=ЧислоПризнаковЗаписи(КРТ,rec);
          for k=1..zz do
            ss=ПризнакЗаписи(КРТ, rec, k);
            if pos('|'+ВзятьСправочникАналит(ss)+'|',Список_Спр)>0:
               ni=searchinarray(СписокПризн,ss,true);
               if ni<1:
                  ni=insertinarraysort(СписокПризн,ss);
                  insertinarray(СписокПризн_rec,ni,current_РПО_ОТЧЕТЫ_СТРОКА_str);
                  if Расчет_допполе1:insertinarray(дополе1ст,ni,if(допполе1,getfields(wa1,nr,Поле1),''));fi;
                  if Расчет_допполе2:insertinarray(дополе2ст,ni,if(допполе2,getfields(wa1,nr,Поле2),''));fi;
               fi;
            fi;
          od;

        od;
--        trace(Список_Спр);
      | true:
        for sign ss=УСЛ_ПРЗН do
          if rs>0:
             if КартотекаПризнака(ss,false)=КРТ:
                if сетевая:setfilter(wa1,Раб.НФА.B01.abl(УСЛ_КРТ,' and ','ukey='+recordtostring(ПризнакВЗапись(ss,false))));
                   if records(wa1)>0:nr=1;
                    | true:nr=0;
                   fi;
                 | true:nr=ВзятьНомерЗаписи(wa1,ПризнакВЗапись(ss,false));
                fi;
                if nr>0:
                   rs=rs-1;
                   ni=searchinarray(СписокПризн,ss,true);
                   if ni<1:
                      ni=insertinarraysort(СписокПризн,ss);
                      insertinarray(СписокПризн_rec,ni,current_РПО_ОТЧЕТЫ_СТРОКА_str);
                      if Расчет_допполе1:insertinarray(дополе1ст,ni,if(допполе1,getfields(wa1,nr,Поле1),''));fi;
                      if Расчет_допполе2:insertinarray(дополе2ст,ni,if(допполе2,getfields(wa1,nr,Поле2),''));fi;
                   fi;
   --                addinarray(СписокПризн,true,false,ss);
                fi;
             fi;
           | rs<0:
                   ni=searchinarray(СписокПризн,ss,true);
                   if ni<1:
                      ni=insertinarraysort(СписокПризн,ss);
                      insertinarray(СписокПризн_rec,ni,current_РПО_ОТЧЕТЫ_СТРОКА_str);
                      if Расчет_допполе1:insertinarray(дополе1ст,ni,'');fi;
                      if Расчет_допполе2:insertinarray(дополе2ст,ni,'');fi;
                   fi;
           | rs=0:if wa0<1:CloseWorkArea(wa1);fi;^lengthofarray(СписокПризн);
          fi;
        od;
     fi;
     if rs>-1 and wa0<1:CloseWorkArea(wa1);fi;
     ^lengthofarray(СписокПризн);

end;
--  СЧИТАТЬАВТОГРУППУ:INTEGER;-- 0-расчет автогруппы+константы по автогруппе;1-считать только автогруппу без констант;2-автогруппа закрыта, считать только константы;3-не считать автогруппу и ее константы

func Раскрыть_условие_по_аналитике(допуслан:С;ii:i;новая:l;Расчет_допполе1:l;Расчет_допполе2:l;msg0:s;счетчик:i;счетчиквсего:i): i;
  var АВТОГРУППА:l;
  var СЧИТАТЬАВТОГРУППУ:i;
  var КРТ,УСЛ_КРТ,УСЛ_ПРЗН,ss,поле1,поле2,msg:s;
  var j,wa,wa1,rs,z,лишн,дубль:i;
  var f0,f1,f:s;
  var допполе1:l;
  var допполе2:l;
  if новая:
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.БУ_автогруппа);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.СписокПризн);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.СписокПризн_rec);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.дополе1ст);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.дополе2ст);
     новая=false;
  fi;
  АВТОГРУППА       =getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'АВТОГРУППА');
  СЧИТАТЬАВТОГРУППУ=getfieldi(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'СЧИТАТЬАВТОГРУППУ');
  КРТ=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'КАРТ'));УСЛ_КРТ=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'УСЛ_КАРТ'));
  УСЛ_ПРЗН=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'УСЛ_ПРИЗН'));
  if УСЛ_ПРЗН='':^0;fi;
  f1=УСЛ_ПРЗН+'|'+КРТ+'|'+УСЛ_КРТ;
  if searchinarray(БУ_автогруппа,f1,true)>0:^0;fi;
  if АВТОГРУППА:
     addinarray(БУ_автогруппа,true,false,f1);
     if СЧИТАТЬАВТОГРУППУ=0 or СЧИТАТЬАВТОГРУППУ=1: --считать автогруппу
        msg=Format('%s/автогруппа %s',msg0,f1);
--        ОкноВыполненияПоказать(1,msg);
        j=Раскрыть_условие_автогруппы(ii,новая,допуслан,Расчет_допполе1,Расчет_допполе2,0,msg,счетчик,счетчиквсего);
     fi;
     if СЧИТАТЬАВТОГРУППУ=0 or СЧИТАТЬАВТОГРУППУ=2: --считать константы
--        ОкноВыполненияПоказать(1,'Построение списка...'); -- синхронизация с уже раскрытой группой
        f0='РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current_РПО_ОТЧЕТЫ_СТРОКА);
        f0=f0+" and КАРТ='"+КРТ+"' and УСЛ_КАРТ='"+УСЛ_КРТ+"' and УСЛ_ПРИЗН_ГР='"+УСЛ_ПРЗН+"' and not автогруппа";
        wa=OpenWorkArea('РПО_ОТЧЕТЫ_ГРУППЫ','',f0);
        rs=records(wa);
        if rs>0:
           wa1=openworkarea(КРТ,'',УСЛ_КРТ);
--           ОкноВыполненияПоказать(счетчиквсего,msg0);ОкноВыполненияПоложение(счетчик);
           for z=1..rs do
--             ОкноВыполненияПоложение(z);
             msg=Format('%s/константы[%d/%d]-%s',msg0,z,rs,f1);
             j=Раскрыть_условие_автогруппы(z,новая,допуслан,Расчет_допполе1,Расчет_допполе2,wa1,msg,счетчик,счетчиквсего);
           od;
           CloseWorkArea(wa1);
        fi;
        CloseWorkArea(wa);
--      | true:-- сохраняем пропущенные константы автогрупп, чтобы не мешать с константами не автогрупп
--        ОкноВыполненияПоказать(1,'Построение списка...'); -- синхронизация с уже раскрытой группой
--        f0='РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current_РПО_ОТЧЕТЫ_СТРОКА);
--        f0=f0+" and КАРТ='"+КРТ+"' and УСЛ_КАРТ='"+УСЛ_КРТ+"' and УСЛ_ПРИЗН_ГР='"+УСЛ_ПРЗН+"' and not автогруппа";
--        wa=OpenWorkArea('РПО_ОТЧЕТЫ_ГРУППЫ','',f0);
--        rs=records(wa);
----        clearvariable(СписокПризн_было_карт_дубль);
----        clearvariable(СписокПризн_было_карт_лишн);
--        ОкноВыполненияПоказать(rs,'Построение списка...'); -- синхронизация с уже раскрытой группой
--        for z=1..rs do
--            ОкноВыполненияПоложение(z);
--            ss=getfields(wa,z,'УСЛ_ПРИЗН');
--            if trim(ss)<>'':
--               addinarray(СписокПризнНетЗап,true,false,ВзятьКлючЗаписи(wa,z));
----               if поисквмассиве(СписокПризн,ss,true)<1:addinarray(СписокПризн_было_карт_лишн,true,false,ss);
----    --            | true:addinarray(СписокПризн_было_карт_дубль,true,false,ss);
----               fi;
--            fi;
--        od;
--        CloseWorkArea(wa);
--        if searchinarray(СписокПризнНетЗап,ВзятьКлючЗаписи(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii),true)<1:-- добавляем константу
--           addinarray(СписокПризн,true,false,УСЛ_ПРЗН);
--        fi;
     fi;
   | true:-- не автогруппа (константа)
     f1=trim(getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'УСЛ_ПРИЗН_ГР'))+'|'+КРТ+'|'+УСЛ_КРТ;
     if searchinarray(БУ_автогруппа,f1,true)>0:^0;fi;
     msg=Format('%s/свободные константы',msg0);
     j=Раскрыть_условие_автогруппы(ii,новая,допуслан,Расчет_допполе1,Расчет_допполе2,0,msg,счетчик,счетчиквсего);
  fi;
--автогруппу+константы
--автогруппу без констант
--только константы
--не считать


  ОкноВыполнениязакрыть;
  ^lengthofarray(СписокПризн);
end;
var РПО_ОТЧЕТЫ_СТРОКИ_rec[]:record;
var РПО_ОТЧЕТЫ_СТРОКИ_rec_sort[]:s;
var РПО_ОТЧЕТЫ_СТРОКИ_rec_gr[]:record;
func Заполнить_РПО_ОТЧЕТЫ_СТРОКИ_rec(rec:record;addgr:l):i;
  var j,wa,rs,z:i;
  var nr:record;
  var f:s;
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec_gr);
     РПО_ОТЧЕТЫ_СТРОКИ_rec_gr[1]=rec;
     if addgr:РПО_ОТЧЕТЫ_СТРОКИ_rec[1]=rec;fi;
     wa=openworkarea('РПО_ОТЧЕТЫ_СТРОКИ','','ukey='+recordtostring(rec));
     if getfieldi(wa,1,'GroupAttr')=-1:
        for j=1..lengthofarray(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec_gr) do
          f='GROUPDOC='+recordtostring(РПО_ОТЧЕТЫ_СТРОКИ_rec_gr[j]);
          setfilter(wa,f);
          rs=records(wa);
          for z=1..rs do
            nr=ВзятьКлючЗаписи(wa,z);
            if getfieldi(wa,z,'GroupAttr')=-1:РПО_ОТЧЕТЫ_СТРОКИ_rec_gr[lengthofarray(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec_gr)+1]=nr;
             | true:addinarray(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec,true,false,nr);
            fi;
            if addgr:addinarray(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec,true,false,nr);fi;
          od;
        od;
      | true:addinarray(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec,true,false,ВзятьКлючЗаписи(wa,1));
     fi;
     CloseWorkArea(wa);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec_gr);
     ^lengthofarray(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec);
end;

func Раскрыть_ВсеУсловия_по_аналитике(допуслан:С;rec:record;новая:l;Расчет_допполе1:l;Расчет_допполе2:l;addgr:l): i;
  var АВТОГРУППА:l;
  var СЧИТАТЬАВТОГРУППУ:i;
  var КРТ,УСЛ_КРТ,УСЛ_ПРЗН,ss:s;
  var j,wa,rs,z,лишн,дубль,rs_all,zz:i;
  var f0,f:s;
  var допполе1:l;
  var допполе2:l;
  if новая:
--     ClearVariable(РАБ.НФА.ОТЧЕТЫ.СписокПризнНетЗап);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.СписокПризн);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.СписокПризн_rec);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.БУ_автогруппа);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.дополе1ст);
     ClearVariable(РАБ.НФА.ОТЧЕТЫ.дополе2ст);
     новая=false;
  fi;
  rs_all=Заполнить_РПО_ОТЧЕТЫ_СТРОКИ_rec(rec,addgr);
  ClearVariable(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec_sort);
--  wa=openworkarea('РПО_ОТЧЕТЫ_СТРОКИ','','ukey='+recordtostring(rec));
--  wa=OpenWorkArea('РПО_ОТЧЕТЫ_ГРУППЫ','',f0);
  for zz=1..rs_all do
    ss=trim(GetCardFieldS('РПО_ОТЧЕТЫ_СТРОКИ',РПО_ОТЧЕТЫ_СТРОКИ_rec[zz],'КОД'));
--    rs=КоличествоСлов(ss,'.');
    f='';
    for j=1..3 do
      f0=Trim(ВыделитьСлово(j,ss,'.'));
      f0=Повтор('0',5-Length(f0))+f0;
      f=f+'.'+f0;
    od;
    addinarray(РАБ.НФА.ОТЧЕТЫ.РПО_ОТЧЕТЫ_СТРОКИ_rec_sort,true,false,f+'@'+recordtostring(РПО_ОТЧЕТЫ_СТРОКИ_rec[zz]));
  od;
--  CloseWorkArea(wa);
  for zz=1..rs_all do
    ss=ВыделитьСлово(2,РПО_ОТЧЕТЫ_СТРОКИ_rec_sort[zz],'@');
--    trace(РПО_ОТЧЕТЫ_СТРОКИ_rec_sort[zz]);
--    current_РПО_ОТЧЕТЫ_СТРОКА=РПО_ОТЧЕТЫ_СТРОКИ_rec[zz];
    current_РПО_ОТЧЕТЫ_СТРОКА=StringToRecord(ss);
    current_РПО_ОТЧЕТЫ_СТРОКА_str=recordtostring(current_РПО_ОТЧЕТЫ_СТРОКА);
    f0='РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current_РПО_ОТЧЕТЫ_СТРОКА);
    f0=f0+" and автогруппа";
    wa_РПО_ОТЧЕТЫ_ГРУППЫ=OpenWorkArea('РПО_ОТЧЕТЫ_ГРУППЫ','',f0);
    try
      rs=records(wa_РПО_ОТЧЕТЫ_ГРУППЫ);
      for j=1..rs do
        z=Раскрыть_условие_по_аналитике(допуслан,j,новая,Расчет_допполе1,Расчет_допполе2,'Расчет автогрупп',j,rs);
      od;
    finally
      CloseWorkArea(wa_РПО_ОТЧЕТЫ_ГРУППЫ);
    end;
  --    CloseWorkArea(wa_РПО_ОТЧЕТЫ_ГРУППЫ);
    f0='РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current_РПО_ОТЧЕТЫ_СТРОКА);
    f0=f0+" and not автогруппа";

    wa_РПО_ОТЧЕТЫ_ГРУППЫ=OpenWorkArea('РПО_ОТЧЕТЫ_ГРУППЫ','',f0);
    try
      rs=records(wa_РПО_ОТЧЕТЫ_ГРУППЫ);
      for j=1..rs do
        z=Раскрыть_условие_по_аналитике(допуслан,j,новая,Расчет_допполе1,Расчет_допполе2,'Расчет констант',j,rs);
      od;
    finally
      CloseWorkArea(wa_РПО_ОТЧЕТЫ_ГРУППЫ);
    end;
  od;
--    CloseWorkArea(wa_РПО_ОТЧЕТЫ_ГРУППЫ);
  ^lengthofarray(СписокПризн);
end;
-----------------------------------------------------------
var rep:i;-- Ukey
var ObjectN:s;
var GU_ukey[]:i;
var GU[]:s;
var GU_value1[]:s;
var GU_value2[]:s;
var GU0[]:s;
var MaxLevel[]:i;
var MaxCol:i;
var MaxRow:i;

Proc EvalMaxLevel;
var j,z,k:i;
var ss:s;
 z=LengthOfArray(GU);
 ClearVariable(Раб.НФА.Отчеты.MaxLevel);
 ClearVariable(Раб.НФА.Отчеты.GU0);
 MaxCol=0;
 MaxRow=0;
 for j=1..z do
  k=WordsCount(GU[j],'.');
  MaxRow=max(MaxRow,k);
  if k>1:
    addinarray(GU0,true,false,ВыделитьСлова(1,k-1,GU[j],'.'));
  fi;
 od;
 for j=1..z do
  if SearchInArray(GU0,GU[j],true)<1:
    MaxCol=MaxCol+1;
    MaxLevel[MaxCol]=j;
  fi;
 od;
-- MaxCol=MaxInArray(MaxLevel);
end;
var FindLinks_x:i;
var FindLinks_y:i;

Proc FindLinks(h:Object;col0:i;row0:i;colmax:i;rowmax:i);
var Content:s;
var Content0:s;
var x,y:i;
 y=row0;
 Content0=AsString(h.cell(row0, col0, CellContents, ''));
 FindLinks_x=col0;
 FindLinks_y=row0;
 for y=row0..rowmax do
   for x=col0..colmax do
     Content=AsString(h.cell(y, x, CellContents, ''));
     if Content=Content0:
        FindLinks_x=x;FindLinks_y=y;
      | true:
        if x=col0:FindLinks_y=y-1;rowmax=y-1;
         | true:
           colmax=x-1;
        fi;
     fi;
   od;
 od;
end;

Proc ObjectNCellLinks;
 var h:Object;
 var j,z,k,y:i;
 var hMaxCol,Col0:i;
 var hMaxRow,Row0:i;

 var ss,ss0:s;
 if not FindObject(ObjectN,h):exit;fi;
 hMaxCol=AsInteger(h.ColsCount);
 hMaxRow=AsInteger(h.RowsCount);
 for y=1..hMaxRow do
   FindLinks_x=0;
--   FindLinks (h,1,y,hMaxCol,hMaxRow);
--   h.CellLinks(1,y,FindLinks_x,FindLinks_y);
   while FindLinks_x<hMaxCol do
     Col0=FindLinks_x+1;
     Row0=y;
     FindLinks(h,Col0,Row0,hMaxCol,hMaxRow);
     h.CellLinks(Col0,Row0,FindLinks_x,FindLinks_y);
     h.Cell(Row0,Col0,CellBorder,'1,1,1,1');
     h.Cell(Row0,Col0,CellAlignment,2);
     h.Cell(Row0,Col0,CellFontColor,coBlack );
     h.Cell(Row0,Col0,CellBgColor,coLtGray  );
   od;
 od;

end;

Proc DrowObjectN(addcol:i;Contents_addaddcol:s);
 var h:Object;
 var j,z,k:i;
 var ss,ss0:s;
 if not FindObject(ObjectN,h):exit;fi;
 EvalMaxLevel;
 h.ColsCount=1;
 h.RowsCount=1;
 h.ColsCount=MaxCol+addcol;
 h.RowsCount=MaxRow;
 if addcol>0:
    for j=1..addcol do
      for k=1..MaxRow do
        h.cell(k, j, CellContents, ВыделитьСлово(j,Contents_addaddcol,chr(13)));
      od;
    od;
 fi;
 for j=1..MaxCol do
   h.column(j+addcol, ColWidth, 120);
   ss=GU[MaxLevel[j]];
   z=WordsCount(ss,'.');
   for k=1..z do
     ss0=ВыделитьСлово(k,ss,'.');
     h.cell(k, j+addcol, CellContents, GU_value2[searchinarray(GU_ukey,int(ss0))]);
   od;
   for k=z+1..MaxRow do
     h.cell(k, j+addcol, CellContents, GU_value2[searchinarray(GU_ukey,int(ss0))]);
   od;
 od;
end;

Конец
