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

БланкСШаблоном "Работа со сверткой журналов";
var СПРОБ []:s;-- обязательные справочники объединенные в группы СП1|СП2|СП3&СП4|СП5&СП1
var НОМГРОБ[]:i;-- номера начал следующих групп обязательных справочников СП1|СП2|СП3&СП4|СП5&СП6 => 1;4;6
var СПРДОП[]:s;-- дополнительные справочники
var ПланСч[]:s;
var АНОБ []:s;-- обязательные справочники
var АНДОП[]:s;-- обязательные справочники
var РабОбл[]:i;
var Карт[]:s;
var КартUkey[]:s;
var tempS[]:s;
var tempSError[]:s;
func СменаПорядкаСлов(ss:s;порядок:s;Разделитель:s):s;
        var ii,j,k:i;
        var ss0:s;
        ss0='';
        ii=КоличествоСлов(порядок,',');
        for j=1..ii do
                ss0=ss0+Разделитель+ВыделитьСлово(int(ВыделитьСлово(j,порядок,',')),ss,Разделитель);
        od;
        j=КоличествоСлов(ss,Разделитель)-ii;
        if j>0:
                 ss0=ss0+Разделитель+ВыделитьСлова(ii+1,КоличествоСлов(ss,Разделитель)-ii,ss,Разделитель);
        fi;
        ^Удалить(ss0,1,Длина(Разделитель));
end;


2Func0 НаитиПервыйПризнакИзНабораПоСправочникуUP (СтрокаАн:S; Разделитель:S;СПР:S):S;--СтрокаАн,Разделитель1,СПР в верхнем регистре!
2 --СПР=справочник с точкой на конце и содержит Разделитель в начале
2 --СтрокаАн с Разделитель1 в начале и в конце!
var n,nn,len:i;
 n=pos(СПР,СтрокаАн);
 if n>0:СтрокаАн=SubStr(СтрокаАн,n+1,255);^SubStr(СтрокаАн,1,pos(Разделитель,СтрокаАн)-1);
        | true:^"";
 fi;
2End0;

2Func0 УслОстВстр(Усл:S):S;--Усл в верхнем регистре!Преобразует строку вида счет{ан1&ан2...&ан64} в строку счет&ан1&ан2...&ан64
        var ss:s;
                ss=ВыделитьСлово(2,Усл,'{');
                ss=Удалить(ss,Длина(ss),1);
                ^ВыделитьСлово(1,Усл,'{')+'&'+ss;
2End0;

2func0 ПроводкуВтекст(nf:i;t:i;БазВал:s;dd0:d;ВставлятьДаты:l;ВыводитьПривязкуКпроводкам:l;ВыводитьКомментарий:l;допкмнт:s;ДНФАID:l):d;
var ss,ss1,ss2,s1,ДНФАIDV,formats:s;
var p,z:i;
            if БазВал=ПроводВалюта(t):-- 1 сумма в базовой валюте
               ss=Format("%17.2F",ПроводСумма(t));
--               ss=Format("%17.2F^%S",ПроводСумма(t,БазВал),БазВал);
             | ПроводВалюта(t)='':-- 1 сумма в базовой валюте
               ss=Format("%17.2F",ПроводСумма(t));
             | true:
               ss1=trim(up(ПроводВалюта1(t)));
               ss2=trim(up(ПроводВалюта2(t)));
               if ss1=ПроводВалюта(t): ss=Format("%17.2F^%S",ПроводСумма(t,'ВАЛ'),ss1); if ss2<>'':ss=ss+Format("%17.2F^%S",ПроводСумма(t,ss2),ss2);fi;
                | ss2=ПроводВалюта(t): ss=Format("%17.2F^%S",ПроводСумма(t,'ВАЛ'),ss2); if ss1<>'':ss=ss+Format("%17.2F^%S",ПроводСумма(t,ss1),ss1);fi;
               fi;
--             if ss1=ПроводВалюта(t):ss=Format("%17.2F^%S",ПроводСумма(t,'ВАЛ'),ss1);if ПроводСумма(t,ss2)<>0:ss=ss+Format("%17.2F^%S",ПроводСумма(t,ss2),ss2);fi;

--              | ss2=ПроводВалюта(t):ss=Format("%17.2F^%S",ПроводСумма(t,'ВАЛ'),ss2);if ПроводСумма(t,ss1)<>0:ss=ss+Format("%17.2F^%S",ПроводСумма(t,ss1),ss1);fi;
--             fi;
            fi;

            s1=trim(up(ПроводКоличПризнак(t)));
            ss2=up(ПроводАналитика(t));
            if s1<>'':
              p=pos(s1,ss2)+length(s1);
              ss2=SubStr(ss2,1,p-1)+':'+str(ПроводСумма(t,'КОЛ'),ПроводТочность(t))+SubStr(ss2,p,255);
            fi;
            if ВставлятьДаты:
               if dd0<>ПроводДата(t):dd0=ПроводДата(t);
                  ТекстФайлЗаписатьСтроку(nf, Датувстроку(dd0));
               fi;
            fi;
            if ДНФАID:ДНФАIDV='ДНФАID.'+стр16(recordtointeger(ПроводЗапись(t)));fi;

            formats=':%S %40S      %40S';
            ТекстФайлДописатьСтроку(nf, format(formats,ss,ПроводДеб(t),ПроводКре(t)));
            formats='       {%S}';
            ТекстФайлДописатьСтроку(nf, format(formats,ss2));
            formats='';
            if ВыводитьКомментарий:formats=formats+'--%S';fi;
            if ВыводитьПривязкуКпроводкам:
               if ВыводитьКомментарий:formats=formats+' [%d,%d]';
                | true: formats=formats+'-- [%d,%d]';
               fi;
            fi;
            if ДНФАID:ТекстФайлЗаписатьСтроку(nf, format(formats,ПроводКоммент(t)+допкмнт+' '+ДНФАIDV,ПроводЖурнал(t),t));z=z+1;
             | true  :ТекстФайлЗаписатьСтроку(nf, format(formats,ПроводКоммент(t)+допкмнт,ПроводЖурнал(t),t));z=z+1;
            fi;
 ^dd0;
2End0;

2Func0 ПроводкиВтекст(ВременныйФайл:s;Дата0:d;Дата1:d;УслСчета:s;УслАн:s;УслКарт:s;ВставлятьДаты:l;ВыводитьПривязкуКпроводкам:l;ВыводитьКомментарий:l;допкмнт:s;ДНФАID:l):i;-- количество проводок
var Продолжим,БратьВсеПроводки:l;
var ii,j,p,k,t,z,nf:i;
var s1,ss,ss1,ss2,s0,f,БазВал,formats,ДНФАIDV:s;
var ds:l;
var dd0:d;
    ClearVariable(Раб.НФА.Свертка.РабОбл);
    ClearVariable(Раб.НФА.Свертка.Карт);
    ClearVariable(Раб.НФА.Свертка.КартUkey);
    УслКарт=trim(up(УслКарт));
    БратьВсеПроводки=false;
    if УслКарт<>'':
       ii=КоличествоСлов(УслКарт,'|');
       for j=1..ii do
        s1=ВыделитьСлово(j,УслКарт,'|');
        s0=ВыделитьСлово(1,s1,'{');
        s0=ВыделитьСлово(1,s0,'#');-- имя картотеки
        if s0='*':БратьВсеПроводки=true;
         | true:
           if s0='TABLE_OPER':Продолжим=ЕстьКартотека('TABLE_OPER');
            | true:Продолжим=ЕстьКартотека(s0);
           fi;
           if Продолжим:
              p=ВставитьВмассивСорт(Карт,s0);
              ВставитьВмассив(РабОбл,p,0);
              ВставитьВмассив(КартUkey,p,'');
              s1=s1+' ';
              if КоличествоСлов(s1,'#')=3:-- выборка фильтра и открытие wa
                f=ВыделитьСлово(2,s1,'#');
                s1=trim(ВыделитьСлово(1,s1,'#')+ВыделитьСлово(3,s1,'#'));
                РабОбл[p]=OpenWorkArea(Карт[p],'',f);
              fi;
              s1=trim(s1);
              k=КоличествоСлов(s1,'{');
              if k>1:КартUkey[p]='{'+ВыделитьСлова(2,k-1,s1,'{')+'{';fi;
              if pos('{*{',КартUkey[p])>0:КартUkey[p]='';fi;
           fi;
        fi;
       od;
    fi;
    s0=УслСчета;
    if УслАн<>'':s0=s0+'{'+УслАн+'}';fi;
    z=0;
    БазВал=up(БазоваяВалюта);
    try
      nf=ТекстФайлСоздать(ВременныйФайл);
      ТекстФайлВКонец(nf);
      ds=false;
      dd0=1.1.100;
      for transaction t=s0, Дата0, Дата1 do
          Продолжим=true;
          if length(УслКарт)>0:
             ss=up(ПроводКартотека(t));
             p=ПоискВмассиве(Карт,ss,true);
             if p>0:
                if length(КартUkey[p])>0:
                  ss1='{'+str(ЗаписьКЧислу(ПроводЗапись(t)))+'{';
                  Продолжим=pos(ss1,КартUkey[p])>0;
                fi;
                if Продолжим:
                  if РабОбл[p]<>0:
                     Продолжим=ВзятьНомерЗаписи(РабОбл[p],ПроводЗапись(t))>0;
                  fi;
                fi;
              | true:Продолжим=БратьВсеПроводки;
             fi;
          fi;

          if Продолжим:
            dd0=ПроводкуВтекст(nf,t,БазВал,dd0,ВставлятьДаты,ВыводитьПривязкуКпроводкам,ВыводитьКомментарий,допкмнт,ДНФАID);
            z=z+1;
--            if БазВал=ПроводВалюта(t):-- 1 сумма в базовой валюте
--               ss=Format("%17.2F",ПроводСумма(t));
--             | ПроводВалюта(t)='':-- 1 сумма в базовой валюте
--               ss=Format("%17.2F",ПроводСумма(t));
--             | true:
--               ss1=trim(up(ПроводВалюта1(t)));
--               ss2=trim(up(ПроводВалюта2(t)));
--               if ss1=ПроводВалюта(t): ss=Format("%17.2F^%S",ПроводСумма(t,'ВАЛ'),ss1); if ss2<>'':ss=ss+Format("%17.2F^%S",ПроводСумма(t,ss2),ss2);fi;
--                | ss2=ПроводВалюта(t): ss=Format("%17.2F^%S",ПроводСумма(t,'ВАЛ'),ss2); if ss1<>'':ss=ss+Format("%17.2F^%S",ПроводСумма(t,ss1),ss1);fi;
--               fi;
--            fi;

--            s1=trim(up(ПроводКоличПризнак(t)));
--            ss2=up(ПроводАналитика(t));
--            if s1<>'':
--              p=pos(s1,ss2)+length(s1);
--              ss2=SubStr(ss2,1,p-1)+':'+str(ПроводСумма(t,'КОЛ'),ПроводТочность(t))+SubStr(ss2,p,255);
--            fi;
--            if ВставлятьДаты:
--               if dd0<>ПроводДата(t):dd0=ПроводДата(t);
--                  ТекстФайлЗаписатьСтроку(nf, Датувстроку(dd0));
--               fi;
--            fi;
--            if ДНФАID:ДНФАIDV='ДНФАID.'+стр16(recordtointeger(ПроводЗапись(t)));fi;

--            formats=':%S %40S      %40S';
--            ТекстФайлДописатьСтроку(nf, format(formats,ss,ПроводДеб(t),ПроводКре(t)));
--            formats='       {%S}';
--            ТекстФайлДописатьСтроку(nf, format(formats,ss2));
--            formats='';
--            if ВыводитьКомментарий:formats=formats+'--%S';fi;
--            if ВыводитьПривязкуКпроводкам:
--               if ВыводитьКомментарий:formats=formats+' [%d,%d]';
--                | true: formats=formats+'-- [%d,%d]';
--               fi;
--            fi;
--            if ДНФАID:ТекстФайлЗаписатьСтроку(nf, format(formats,ПроводКоммент(t)+допкмнт+' '+ДНФАIDV,ПроводЖурнал(t),t));z=z+1;
--             | true  :ТекстФайлЗаписатьСтроку(nf, format(formats,ПроводКоммент(t)+допкмнт,ПроводЖурнал(t),t));z=z+1;
--            fi;

          fi;
      od;
      ТекстФайлЗакрыть(nf);
      p=lengthofarray(РабОбл);
      for k=1..p do
          if РабОбл[k]<>0:CloseWorkArea(РабОбл[p]);fi;
      od;
    except
      ТекстФайлЗакрыть(nf);
      p=lengthofarray(РабОбл);
      for k=1..p do
          if РабОбл[k]<>0:CloseWorkArea(РабОбл[p]);fi;
      od;
      z=0;
    end;
  ^z;
2End0;
func ОстаткиВразрезеСчетовИаналитики(Кмнт:S;УслСчета:S;УслАн:S;ДатаОстатков:d;СпОб:S;СпДоп:S;ИсклСпр:S;ИтогМассив:S;УслЦена:S;УслСум:S;УслКол:S;УслВал:S;УслКарт:S):i;
-- СпОб='НФА&ИНВ&РСБ|ПД&МОЛ' Через & идут группы справочников(или отдельные справочники),
-- через | идут справочники одной группы с условием обязательности любого справочника из группы.
-- СпДоп='РСБ|ПД|ЦС|М|МОЛ' список необязательных справочников через |
-- ИсклСпр='ДНФА' исключеные справочники или аналитические группы (пока только одного)справочника 'ДНФА.ПРИХ.*|ДНФА.РАСХ.*'
-- ИтогМассив= [короткое имя массива бланка] в который будут копироваться данные из результирующего массива [АНДОП], если это имя не пустая строка
-- УслЦена='Ц>1000' или '(Ц>1000)&(Ц<10001)' или 'Ц<1001' - условие на цену
-- УслСум
-- УслКол
-- УслВал
-- УслКарт=РПО_ОПЕРАЦИИДНФА{17{23|TABLE_OPER{145{146{147|РПО_ОСТНФА|РПО_НАЧ_АМОРТ_TR#ВЕДОМОСТЬ={1}#|*
-- через | идут картотеки со списком ukey в них, если список пуст или содержит {* , то привязка ко всей картотеке
-- если вместо картотеки * то ко всем картотекам и любым проводкам
-- берутся проводки из картотеки РПО_ОПЕРАЦИИДНФА с ukey=17 или 23;из табличного журнала TABLE_OPER с ukey=145,146,147
-- любые проводки из картотеки РПО_ОСТНФА
-- любые проводки из картотеки РПО_НАЧ_АМОРТ_TR с фильтром ВЕДОМОСТЬ={1}
-- при непустом УслКарт используется только цикл по проводкам

 var i0,длНОМГРОБ,ii,t,j,p,k0,k,НФ,длСПРОБ,длСПРДОП,КоличОкноВыполнения,ТекущНомСтр:i;
 var ss,ss1,sp,spr,ан,АнОбИтог,АнДопИтог,ВременныйФайл,УслАнОб:s;
 var ЕстьВсеОбПр,ll:l;
 var цена,сум,кол,nn:n;
 var vDate: Date;
 var vSum1, vSum2: Numeric;
 var vVal1, vVal2: String;
 var vDeb, vCre: String;
 var vComment: String;
 if Кмнт='':Кмнт="Подготовка данных...";fi;

 ClearVariable(Раб.НФА.Свертка.СПРОБ);
 ClearVariable(Раб.НФА.Свертка.СПРДОП);
 ClearVariable(Раб.НФА.Свертка.НОМГРОБ);
 ClearVariable(Раб.НФА.Свертка.АНДОП);
 ClearVariable(Раб.НФА.Свертка.АНОБ);
 УслАнОб='';
2 ------------ заполняем массив обязательных справочников -------------
 ii=КоличествоСлов(СпОб,'&');
 j=0;
 for t=1..ii do
         НОМГРОБ[t]=j+1;
         ss=ВыделитьСлово(t,СпОб,'&');
         i0=КоличествоСлов(ss,'|');
         if i0=1:
                        ss1=ss;
                        j=j+1;
                        СПРОБ[j]=' '+ss1+'.';
                        sp=ss1+'.*';
                | true:
                        sp='';
                        for k=1..i0 do
        ss1=ВыделитьСлово(k,ss,'|');
        j=j+1;
        СПРОБ[j]=' '+ss1+'.';
        sp=sp+'.*|'+ss1;
                        od;
                        sp='('+Удалить(sp,1,3)+'.*)';
         fi;
         УслАнОб=УслАнОб+'&'+sp;
 od;
 УслАнОб=Удалить(УслАнОб,1,1);
 if Длина('('+УслАн+')')+Длина(УслАнОб)<255:
                if УслАн<>'':УслАн='('+УслАн+')&'+УслАнОб;
                 | true:УслАн=УслАнОб;
                fi;
 fi;
 длСПРОБ        =ДлинаМассива(СПРОБ);
 длНОМГРОБ=ДлинаМассива(НОМГРОБ);
 НОМГРОБ[длНОМГРОБ+1]=длСПРОБ+1; -- добавляем крайнюю (нерабочую) группу
 длНОМГРОБ=ДлинаМассива(НОМГРОБ);

 ------------ конец ---------
2 ------------ заполняем массив необязательных(дополнительных) справочников -------------
 ii=КоличествоСлов(СпДоп,'|');
 for t=1..ii do
         СПРДОП[t]=' '+ВыделитьСлово(t,СпДоп,'|')+'.';
 od;
 длСПРДОП=ДлинаМассива(СПРДОП);
 ------------ конец ---------
2 ------------ заполняем массив условий по цене -------------
-- ii=КоличествоСлов(СпДоп,'|');
-- for t=1..ii do
--       СПРДОП[t]=' '+ВыделитьСлово(t,СпДоп,'|')+'.';
-- od;
-- длСПРДОП=ДлинаМассива(СПРДОП);
 ------------ конец ---------


--      Сум+' #'+СумВал+' #'+Вал+' #'+КолАн+' #'+Кол+' #'+Дб+' #'+Кр+' #'+Ан;
--       1                               2              3               4                       5                        6                       7                       8

 --------- формируем ВременныйФайл с результатами свертки -----------
 ВременныйФайл=ПеремПБ('CACHE')+'\ОстаткиВразрезеСчетовИаналитики.jur';                                  --НФА.101.01.ЗДАНИЕ_ОБЩЕЖИТИЯ
 if ЕстьФайл(ВременныйФайл):УдалитьФайл(ВременныйФайл);fi;
-- КоличОкноВыполнения=СверткаЖурналов(ВременныйФайл,01.01.100,ДатаОстатков,УслСчета,'('+УслАн+')&МОЛ.ЕГОРОВА&М.Э.СТРОЙГРУППА&НФА.101.02*',ИсклСпр,'','',TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna,false);
 if trim(УслКарт)='':
                КоличОкноВыполнения=СверткаЖурналов(ВременныйФайл,01.01.100,ДатаОстатков,УслСчета,УслАн,ИсклСпр,'','',TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna,false);
        | true:КоличОкноВыполнения=ПроводкиВтекст(ВременныйФайл,01.01.100,ДатаОстатков,УслСчета,УслАн,УслКарт,false,false,false,'',false);
 fi;
 ------------ конец ---------

-- ii=СверткаЖурналов(,01.01.100,ДатаОстатков,'*.?.101.??.???|*.?.102.??.???|*.?.103.??.???','','ДНФА.*','','',TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna,false);
 ОткрытьТекстовыйЖурнал(ВременныйФайл);
 ОкноВыполненияПоказать(КоличОкноВыполнения,Кмнт);
         i0=0;
        While not ВзятьПроводкуИзТекстовогоЖурнала(vDate, vSum1, vVal1, vSum2, vVal2, vDeb, vCre, Раб.НФА.Свертка.tempS, vComment) do
                ii=ДлинаМассива(tempS);
                ан='';
                for t=1..ii do 
                        p=pos(':',tempS[t]);
                        if p>0:tempS[t]=SubStr(tempS[t],1,p-1);fi;
                        ан=ан+' '+up(tempS[t]);
                od;
                ан=ан+' ';
         ТекущНомСтр=ТекущНомСтр+1;
         ОкноВыполненияПоложение(ТекущНомСтр);
         ЕстьВсеОбПр=true;
         if vDeb='00':ss=vCre;
                | true:ss=vDeb;
         fi;
         if Соотв(ss,'*.?.???.??.???'):ss=SubStr(ss,1,Length(ss)-3)+'???';fi;
         АнОбИтог ='';
         АнДопИтог='';
         длСПРОБ=длСПРОБ+1; -- добавляем пустой элемент(в последней группе хранится ссылка на последний пустой элемент)
         ii=0;k0=1;
         while ii<длСПРОБ do -- нет проверки на последний пустой элемент!
                 ii=ii+1;
                 if ii=НОМГРОБ[k0+1]:k0=k0+1;if not ll:ЕстьВсеОбПр=false;break;fi;ll=false;fi;
                 ss1=НаитиПервыйПризнакИзНабораПоСправочникуUP(ан,' ',СПРОБ[ii]);
                 ll=ss1<>'';-- ll=true => найден признак!

                 if ll:АнОбИтог=АнОбИтог+'&'+ss1;
        ii=НОМГРОБ[k0+1]-1;-- и делаем переход на следующую группу
                 fi;
         od;
         длСПРОБ=длСПРОБ-1;

         if ЕстьВсеОбПр:
                        АнОбИтог=Удалить(АнОбИтог,1,1);
                        for ii=1..длСПРДОП do
        ss1=НаитиПервыйПризнакИзНабораПоСправочникуUP(ан,' ',СПРДОП[ii]);
        if ss1<>'':АнДопИтог=АнДопИтог+'&'+ss1;fi;
                        od;
                        АнДопИтог=ss+'{'+АнОбИтог+АнДопИтог+'}';
                        АнОбИтог=ss+'{'+АнОбИтог+'}';
                        ll=true;
                        if УслЦена<>'' or УслСум<>'' or УслКол<>'':
        сум=Остаток(АнОбИтог,ДатаОстатков+1);
        кол=Остаток(АнОбИтог,ДатаОстатков+1,'КОЛ');
        if УслЦена<>'':Цена=сум/кол;
                 if УслЦена='Ц>10000':ll=Цена>40000;
                        | УслЦена='(Ц>1000)&(Ц<10001)':ll=(Цена>3000)и(Цена<=40000);
                        | УслЦена='Ц<1001':ll=Цена<3001;
                 fi;
        fi;
        if УслСум<>'':
                 if УслСум='С>0':
                        ll=ll и Сум>0;
                 fi;
                 if УслСум='С>=0':
                        ll=ll и Сум>=0;
                 fi;
        fi;
        if УслКол<>'':
                 if УслКол='К>0':
                        ll=ll и Кол>0;
                        if not Кол>0:
                                ss=ВыделитьСлова(3,2,АнДопИтог,'&');
                                if pos('&ИНВ.',ss)>0:
                 if pos('}',ss)>0:ss=Удалить(ss,Длина(ss),1);fi;
                 ss1=ВыделитьСлово(1,АнДопИтог,'{');
                 nn=Остаток(ss1+'{'+ss+'}',ДатаОстатков+1,'КОЛ');
                 if nn=0:
                         nn=-Остаток('*.?.104.??.???{'+ss+'}',ДатаОстатков+1);
                         if nn<>0:
                                ДобавитьВМассив(tempSError,true,false,'Ошибочно начисленая амортизация='+str(nn,2)+' (ОС нет в наличии) Сум='+str(Сум,2)+' Кол='+str(Кол,5)+'  '+ss);
                         fi;
                 fi;
                                fi;
                        fi;
                 fi;
        fi;
                        fi;

 --189.0000.0000000.000.2.105.03.???{М.Х.ГСМ&МОЛ.БУРЦЕВ&НФА.105.03.М6З10В}
2--0      УслЦена:S;УслСум:S;УслКол:S;УслВал
                        if ll:
         ДобавитьВМассив(АНОБ,true,false,АнОбИтог);
         ДобавитьВМассив(АНДОП,true,false,АнДопИтог);
                         | true:if Сум<>0 or Кол<>0:ДобавитьВМассив(tempSError,true,false,'Сум='+str(Сум,2)+' Кол='+str(Кол,5)+'        '+АнОбИтог);fi;
                        fi;
         fi;
        od;
 ЗакрытьТекстовыйЖурнал;
 ОкноВыполненияЗакрыть;
 ii=ДлинаМассива(АНДОП);
 if ИтогМассив<>'':
         for t=1..ii do
                 ЗаписатьПеременнуюС(ИтогМассив+'['+str(t)+']',АНДОП[t]);
         od;
 fi;
 --if ЕстьФайл(ВременныйФайл):УдалитьФайл(ВременныйФайл);fi;
 ^ii;
end;

func СоздатьПланСч(ИмяФайла:s;ДобавитьТолькоНесуществующие:l):i; -- по текстовому файлу с проводками формирует массив [ПланСч]
 var ii,t,НФ:i;
 var vDate: Date;
 var vSum1, vSum2: Numeric;
 var vVal1, vVal2: String;
 var vDeb, vCre: String;
 var vComment: String;
 if не ЕстьФайл(ИмяФайла):^-1;fi;
 ClearVariable(Раб.НФА.Свертка.ПланСч);
 ОткрытьТекстовыйЖурнал(ИмяФайла);
 try
        While not ВзятьПроводкуИзТекстовогоЖурнала(vDate, vSum1, vVal1, vSum2, vVal2, vDeb, vCre, Раб.НФА.Свертка.tempS, vComment) do
                ДобавитьВМассив(ПланСч,true,false,vDeb,vCre);
        od;
 finally
        ЗакрытьТекстовыйЖурнал;
 end;
        if ДобавитьТолькоНесуществующие:
                t=ДлинаМассива(ПланСч)+1;
                while t>0 do t=t-1;if Name_S(ПланСч[t])<>' ':УдалитьИзМассива(ПланСч,t);fi;od;
        fi;
        ii=ДлинаМассива(ПланСч);
^ii;
end;

var ArrayTr[]:s;
var ArraySum[]:n;
var ArrayKol[]:n;
var ArraySrt[]:i;
func ВыбратьАналитикуПоУсловию(УслАнДебКреОбщ:s;TransSign:s;Razd:s):s;
-------- разбор аналитики
-- 1 УслАнДебКреОбщ='+ Ф+|+ П | НФА|- РОСТ|- РАЗМЕР' -- остаются только признаки из справочников [+Ф] или [ Ф], сохраняются как [+Ф]; [+П] или [ П], сохраняются как [ П] и т.д. если после имени справочника и перед [|] пусто, то знак признака остается без измененний :остаются только [-РОСТ] или [ РОСТ] ([+РОСТ] не берется)
-- TransSign=воспринимаются как результат функции ПроводАналитика(t)
-- Razd=символ через который соединяются признаки в результате (если пустая строка - то по умолчанию через пробел)
var ii,j,k,z,p:i;
--var nn,sumt,kolt:n;
var ss,Rzd,s0,s1,s2,s3,s4,s5,s6,spr:s;
   if Razd='':Razd=' ';fi;
   s0=TransSign;
   s6='';-- итог выборки
   j=КоличествоСлов(УслАнДебКреОбщ,'|');
   for ii=1..j do
        s1=ВыделитьСлово(ii,УслАнДебКреОбщ,'|');
        z=length(s1);
        s3=SubStr(s1,z,1);-- нашли знак на замену для справочника
        if pos(s3,'+- ')<1:s3='';-- нет замены знака, т.е. оставляем признак без изменения
         | true:s1=Удалить(s1,z,1);z=z-1;-- есть замена
        fi;
        spr='';
        for k=1..z do -- ищем справочник
            s2=SubStr(s1,k,1);
            if pos(s2,'+- ')>0:
             | true:
                 spr=Удалить(s1,1,k-1); -- нашли!
                 break;
            fi;
        od;
        if length(spr)>0:
            spr=up(spr)+'.';
            for k=1..z do -- выбираем признаки с условием знаков
                s2=SubStr(s1,k,1);
                if pos(s2,'+- ')>0:s2=s2+spr;
                   p=pos(s2,s0);
                   if p>0:-- нашли признак
                      s4=Удалить(s0,1,p);
                      s5=Удалить(s0,p,255);
                      p=pos(' ',s4);
                      if p<1:p=length(s4)+1;fi;
                      s5=s5+Удалить(s4,1,p-1);
                      s4=s3+Удалить(s4,p,255);-- получили признак
                      s0=s5;
                      s6=s6+Razd+trim(s4);
                   fi;
                 | true:
                    break;
                fi;
            od;
        fi;
   od;
   if pos(Razd,s6)=1:s6=Удалить(s6,1,length(Razd));fi;
   s0=trim(s6);
   ^s0;
end;

func LoadArrayTr(УслНаПроводки:s;Д1:d;Д2:d;УслЧисл:s;УслАнДебКреОбщ:s;СортСпр:l;ЦенаУник:l;ДатаУник:l;ДебУник:l;ДебУсл:s;КреУник:l;КреУсл:s):i;
-- УслАнДебКреОбщСортСпр='+ Ф+|+ П | НФА|- РОСТ|- РАЗМЕР' -- остаются только признаки из справочников [+Ф] или [ Ф], сохраняются как [+Ф]; [+П] или [ П], сохраняются как [ П] и т.д. если после имени справочника и перед [|] пусто, то знак признака остается без измененний :остаются только [-РОСТ] или [ РОСТ] ([+РОСТ] не берется)

-- СортСпр=true -- аналитика сортируется по отобранным и отсортированным справочникам

-- ЦенаУник=true -- сворачиваются проводки только с одинаковой ценой(количество=0,то сворачивается отдельно; сумма=0,то сворачивается отдельно)
-- УслЧисл %Сум>1000&%Кол>0&(%Цен>1000|%Ост(НФА&УЧН)>1000)
-- %Сум заменяется на сумму проводки %0:f.2
-- %Кол заменяется на количество проводки %1:f.n , где n=str(точность(НФА))
-- %Цен заменяется на Цену кол признака проводки %2:f.2
-- %Ост(НФА&УЧН) заменяется на расчет ОСТ по счету НФА и условию в скобках      %2:f.2
-- %ОстКол(НФА&УЧН) заменяется на расчет ОСТ по счету НФА и условию в скобках в разрезе кол %2:f.2
-- %ОстВалХХХ(НФА&УЧН) заменяется на расчет ОСТ по счету НФА и условию в скобках в разрезе валюты XXX где XXX символы после слова ОстВал и открытием скобки %2:f.2
--формат
-- 1 УслНаПроводки:s;Д1:d;Д2:d; - первичное условие отбора проводок для цикла

-- 2 УслКарт:s=список картотек с которых берутся проводки (карт1|карт2|карт3)- доп фильтр для проводок
-- 3 УслЧисл[]:s=Условие на комбинаци суммы аналитики счетов остатков оборотов в проводке(вал,базвал,кол) + (суммы остатков или суммы оборотов с усл аналит или счета из проводки) + усл на счет деб + усл на счет кре +усл на аналит из проводки
-- УслЧисл %Сум>1000&%Кол>0&(%Цен>1000|%Ост(НФА&УЧН)>1000)
-- %Сум заменяется на сумму проводки %0:f.2
-- %Кол заменяется на количество проводки %1:f.n , где n=str(точность(НФА))
-- %Цен заменяется на Цену кол признака проводки %2:f.2
-- %Ост(НФА&УЧН) заменяется на расчет ОСТ по счету НФА и условию в скобках      %2:f.2
-- %ОстКол(НФА&УЧН) заменяется на расчет ОСТ по счету НФА и условию в скобках в разрезе кол %2:f.2
-- %ОстВалХХХ(НФА&УЧН) заменяется на расчет ОСТ по счету НФА и условию в скобках в разрезе валюты XXX где XXX символы после слова ОстВал и открытием скобки %2:f.2
-- %ОбоКол(НФА&УЧН) заменяется на расчет ОСТ по счету НФА и условию в скобках в разрезе кол %2:f.2





------ условия на свертку ---------
-- 1 УслАнДебКреОбщ='+ Ф+|+ П | НФА|- РОСТ|- РАЗМЕР' -- остаются только признаки из справочников [+Ф] или [ Ф], сохраняются как [+Ф]; [+П] или [ П], сохраняются как [ П] и т.д. если после имени справочника и перед [|] пусто, то знак признака остается без измененний :остаются только [-РОСТ] или [ РОСТ] ([+РОСТ] не берется)




-- 3
-- остаток
-- 1 валюта, базовая валюта, количество + дата(1=дата указана;2=дата не указана,т.е. берется дата расчета остатков;3=дата=tr, т.е. берется дата проводки)

-- оборот
-- 2 валюта, базовая валюта, количество + дата нач + дата кон(1=дата указана;2=дата не указана,т.е. берется дата расчета оборотовнач или кон;3=дата=tr, т.е. берется дата проводки)


var t,ii,j,k,z,p,kz:i;
var nn,sumt,kolt:n;
var ss,Rzd,s0,s1,s2,s3,s4,s5,s6,kolan,spr:s;
        Rzd='|';
        ClearVariable(Раб.НФА.Свертка.ArrayTr );
        ClearVariable(Раб.НФА.Свертка.ArraySum);
        ClearVariable(Раб.НФА.Свертка.ArrayKol);
        ClearVariable(Раб.НФА.Свертка.ArraySrt);
        kz=0;
        for transaction t=УслНаПроводки,Д1,Д2 do
         sumt =ПроводСумма(t);
         kolt =ПроводСумма(t,'КОЛ');
         kolan=ПроводКоличПризнак(t);
         if ДатаУник:ss=DateToString(ПроводДата(t));fi;
         if ЦенаУник:
            if sumt<>0 and kolt<>0:
               nn=sumt/kolt;
               ss=Раб.НФА.B01.ab(ss,Rzd,str(nn,5));
            fi;
         fi;
         if ДебУник:
            s0=ПроводДеб(t);
            if Длина(ДебУсл)>0:
               z=КоличествоСлов(s0,'.');
               j=КоличествоСлов(ДебУсл,',');
               s1='';
               for ii=1..j do
                s2=ВыделитьСлово(ii,ДебУсл,',');
                k=int(s2);if k<0:k=z+1+k;fi;
                s1=Раб.НФА.B01.ab(s1,'.',ВыделитьСлово(k,s0,'.'));
               od;
               if длина(s1)>0:s0=s1;fi;
            fi;
            ss=Раб.НФА.B01.ab(ss,Rzd,s0);
         fi;
         if КреУник:
            s0=ПроводКре(t);
            if Длина(КреУсл)>0:
            z=КоличествоСлов(s0,'.');
            j=КоличествоСлов(КреУсл,',');
            s1='';
            for ii=1..j do
             k=int(ВыделитьСлово(ii,КреУсл,','));if k<0:k=z+1+k;fi;
             s1=Раб.НФА.B01.ab(s1,'.',ВыделитьСлово(k,s0,'.'));
            od;
            if длина(s1)>0:s0=s1;fi;
         fi;
         ss=Раб.НФА.B01.ab(ss,Rzd,s0);
         fi;
-------- разбор аналитики
-- УслАнДебКреОбщСортСпр='+ Ф+|+ П | НФА|- РОСТ|- РАЗМЕР' -- остаются только признаки из справочников [+Ф] или [ Ф], сохраняются как [+Ф]; [+П] или [ П], сохраняются как [ П] и т.д.

                s0=ПроводАналитика(t);
                s6='';-- итог выборки
                j=КоличествоСлов(УслАнДебКреОбщ,'|');
                for ii=1..j do
                     s1=ВыделитьСлово(ii,УслАнДебКреОбщ,'|');
                     z=length(s1);
                     s3=SubStr(s1,z,1);-- нашли знак на замену для справочника
                     if pos(s3,'+- ')<1:s3='';-- нет замены знака, т.е. оставляем признак без изменения
                      | true:s1=Удалить(s1,z,1);z=z-1;-- есть замена
                     fi;
                     spr='';
                     for k=1..z do -- ищем справочник
                         s2=SubStr(s1,k,1);
                         if pos(s2,'+- ')>0:
                          | true:
                              spr=Удалить(s1,1,k-1); -- нашли!
                              break;
                         fi;
                     od;
                     if length(spr)>0:
                         spr=up(spr)+'.';
                         for k=1..z do -- выбираем признаки с условием знаков
                             s2=SubStr(s1,k,1);
                             if pos(s2,'+- ')>0:s2=s2+spr;
                                p=pos(s2,s0);
                                if p>0:-- нашли признак
                                   s4=Удалить(s0,1,p);
                                   s5=Удалить(s0,p,255);
                                   p=pos(' ',s4);
                                   if p<1:p=length(s4)+1;fi;
                                   s5=s5+Удалить(s4,1,p-1);
                                   s4=s3+Удалить(s4,p,255);-- получили признак
                                   s0=s5;
                                   s6=s6+' '+s4;
                                fi;
                              | true:
                                 break;
                             fi;
                         od;
                     fi;
                od;
                s0=trim(s6);
                ss=Раб.НФА.B01.ab(ss,Rzd,s0);
                k=0;
                z=ПоискВмассиве(ArrayTr,ss,true,1);
                if z<1:z=ВставитьВмассивСорт(ArrayTr,ss);
                         ВставитьВмассив(ArraySum,z,0);
                         ВставитьВмассив(ArrayKol,z,0);
                         kz=kz+1;
                         ВставитьВмассив(ArraySrt,z,kz);
                fi;
                ArraySum[z]=ArraySum[z]+sumt;
                ArrayKol[z]=ArrayKol[z]+kolt;
        od;
        for t=1..kz do
                z=ПоискВмассиве(ArraySrt,t);
                trace(ArrayTr[z]);
        od;

^ii;
end;
func TransactionDistinct(УслНаПроводки:s):i; --
 ^0;
end;
var TransTextJur:s;
var any_ref_list:s;-- список дополнительных справочников для расчета

var Ref                 []:S;-- Справочники(References)/сортированный
var Acc                 []:S;-- индексный список Счетов(Accounts)/сортированный
var sig                 []:S;-- индексный список аналитических признаков/сортированный
var sigt                []:S;-- аналитические признаки в соответствии с массивом Ref
var sigtx       []:i;-- индексы аналитических признаков в соответствии с массивом sigt и массивом индексов аналитики sig
var salddata[]:S;-- массив для расчета остатков, состоящий из индексов счета остатков и аналитики(на каждый индекс по 5 десятичных знаков)
var turndata[]:S;-- массив для расчета оборотов, состоящий из индексов счетов дебета, кредита и аналитики(на каждый индекс по 5 десятичных знаков)
var Koldata[]:n;
var Sumdata[]:n;
var Koldata0[]:n;
var Sumdata0[]:n;
var salddata0[]:S;-- массив для расчета остатков, состоящий из индексов счета остатков и аналитики(на каждый индекс по 5 десятичных знаков)
var tAna[]:S;
var trDataDeb []:S;
var trDataCre []:S;
var trDataSum1[]:n;
var trDataVal1[]:s;
var trDataSum2[]:n;
var trDataVal2[]:s;
var trDataAna []:s;
var trDataKol []:n;

func ReplAcc(Ac:s):s;
var ss:s;
var z:i;
 z=WordsCount(Ac,'.');
 ss=ExtractWords(z-3,4,Ac,'.');
 if match(ss,'.?.???.??.???'):Ac=ExtractWords(1,z-1,Ac,'.')+'.???';
 fi;
 ^Ac;
end;
proc clearvar_index;
        ClearVariable(Раб.НФА.Свертка.Ref  );
        ClearVariable(Раб.НФА.Свертка.Acc  );
        ClearVariable(Раб.НФА.Свертка.sig  );

        ClearVariable(Раб.НФА.Свертка.trDataDeb );
        ClearVariable(Раб.НФА.Свертка.trDataCre );
        ClearVariable(Раб.НФА.Свертка.trDataSum1);
        ClearVariable(Раб.НФА.Свертка.trDataVal1);
        ClearVariable(Раб.НФА.Свертка.trDataSum2);
        ClearVariable(Раб.НФА.Свертка.trDataVal2);
        ClearVariable(Раб.НФА.Свертка.trDataAna );
        ClearVariable(Раб.НФА.Свертка.trDataKol );
end;
proc CreateIndex(typCreateIndexSald:l;len:i;ПроверкаУчн:l);
var tSum1, tSum2,tkol:N;
var tDate:Date;
var tVal1,tVal2,tDeb, tCre,tComment,tacc,znak,znak1,tAnaS,st2,УЧН_новый:String;
var ii,xx,j,p,t,znakt,x:i;
var НетУЧН:l;
--2TransTextJur='test.jur';
  if len>0:ShowProgress(len,'Создание индексов...');fi;
  clearvar_index;
  OpenTextJur(TransTextJur);
  Try
      t=0;
      while not GetTransFromTextJur(tDate, tSum1, tVal1, tSum2, tVal2, tDeb, tCre, Раб.НФА.Свертка.tAna, tComment) do
         if len>0:progresspos(t);fi;
         t=t+1;tDeb=ReplAcc(tDeb);tCre=ReplAcc(tCre);
         if ПроверкаУчн:
            НетУЧН=Соотв(tDeb,'ЗАБ.??.???.??') или Соотв(tCre,'ЗАБ.??.???.??');
          | true:НетУЧН=false;
         fi;
         if typCreateIndexSald:-- данные текстового журнала типа журнал свертки  - остатки
                        if tDeb='00' or tDeb='00Z':tacc=tCre;znak='-';znakt=-1;
                         | true:tacc=tDeb;znak='+';znakt=1;
                        fi;
                        trDataDeb[t]=tacc;
                | true:
                        znakt=1;
                        trDataDeb[t]=tDeb;
                        trDataCre[t]=tCre;
         fi;
         addinarray(Acc,true,false,tDeb,tCre);
         xx=LengthOfArray(tAna);
         tkol=0;
         tAnaS='';
         УЧН_новый='';
         for x=1 to xx do
             znak1=SubStr(tAna[x],1,1);
             if pos(znak1,'+-')>0:
                if typCreateIndexSald:
                   if znak1=znak:tAna[x]=substr(tAna[x],2,255);
                    | true:tAna[x]='';
                   fi;
                 | true:tAna[x]=substr(tAna[x],2,255);
                fi;
              | true:znak1='';
             fi;
             znak1=' '+znak1+' ';
             p=Pos(':', tAna[x]);
             if p>0:
                st2=trim(substr(tAna[x],p+1,255));
                tkol=round(st2,length(ВыделитьСлово(2,st2,'.')));
                tAna[x]=substr(tAna[x],1,p-1);
             fi;
             if ПроверкаУчн:
                if соотв(tAna[x],'УЧН.*'):
                   if НетУЧН:УЧН_новый='УЧН.НЕТ';tAna[x]=УЧН_новый;
                    | true:УЧН_новый=tAna[x];
                   fi;
                fi;
             fi;
             tAnaS=tAnaS+znak1+tAna[x];
             addinarray(sig,true,false,tAna[x]);
             addinarray(ref,true,false,ВыделитьСлово(1,tAna[x],'.'));

--             if not ПроверкаУчнЗаб or не(НетУЧН and соотв(tAna[x],'УЧН.*')):
--             fi;
         od;
         if ПроверкаУчн:
            if УЧН_новый='':
               УЧН_новый='УЧН.НЕТ';
                tAnaS=tAnaS+'  '+УЧН_новый;
                addinarray(sig,true,false,УЧН_новый);
                addinarray(ref,true,false,ВыделитьСлово(1,УЧН_новый,'.'));
            fi;
         fi;
         trDataAna[t]=tAnaS;
         trDataVal1[t]=tVal1;
         trDataVal2[t]=tVal2;
         if not typCreateIndexSald:znakt=1;fi;
         trDataSum1[t]=tSum1*znakt;
         trDataSum2[t]=tSum2*znakt;
         trDataKol [t]=tkol*znakt;
      od;
 Finally
   if len>0:CloseProgress;fi;
   CloseTextJur;
 end;
--               xx=LengthOfArray(Ref);for j=1 to xx do trace('Ref='+Ref[j]);od;
--               xx=LengthOfArray(Acc);for j=1 to xx do trace('Acc='+Acc[j]);od;
--               xx=LengthOfArray(sig);for j=1 to xx do trace('sig='+sig[j]);od;
end;
var parSaldoList[]:s;-- входящие параметры для функции SaldoList
var SortRef[]:i;-- порядок сортировки справочников для salddata или turndata
var SortRefLen:i;
var SortRef1[]:i;-- индексы начал блоков обработки в parSaldoList
var SortRef2[]:i;-- длина блоков обработки в parSaldoList
var SortRef3[]:i;-- индексы справочников в блоках обработки в parSaldoList

proc ini_SortRef_parSaldoList;
var z,j,k,t:i;
var st1:s;
var СписокНаПроверку,СписокНаПроверку1,СписокНаПроверку2:i;

    ClearVariable(Раб.НФА.Свертка.SortRef);
    k=КоличествоСлов(parSaldoList[1],'|');
    for t=1..k do
        st1=ВыделитьСлово(t,parSaldoList[1],'|');
        if st1='СЧЕТ':SortRef[t]=-1;
         | true:SortRef[t]=searchinarray(Ref,st1,true);
        fi;
    od;-- заполняем индексы порядка выборки справочников из проводки
    ClearVariable(Раб.НФА.Свертка.SortRef1); -- индексы начал блоков обработки в parSaldoList
    ClearVariable(Раб.НФА.Свертка.SortRef2); -- длина блоков обработки в parSaldoList
    ClearVariable(Раб.НФА.Свертка.SortRef3); -- индексы справочников в блоках обработки в parSaldoList

    СписокНаПроверку1=3;СписокНаПроверку2=1;
    t=0;
    z=LengthOfArray(parSaldoList);
    for j=2..z do -- заполняем индексы выборок СписокНаПроверку
        if j>СписокНаПроверку2:
           t=t+1;
           СписокНаПроверку=j;
           СписокНаПроверку1=j+1;SortRef1[t]=СписокНаПроверку1;SortRef2[t]=КоличествоСлов(parSaldoList[j],'|');
           СписокНаПроверку2=j+SortRef2[t];
         | true:СписокНаПроверку1=j;--проверяем текущий блок проверки
           st1=ВыделитьСлово(СписокНаПроверку1-SortRef1[t]+1,parSaldoList[СписокНаПроверку],'|');
           if st1='СЧЕТ':SortRef3[j]=-1;
            | true:SortRef3[j]=searchinarray(Ref,st1,true);
           fi;
        fi;
    od;
    SortRefLen=LengthOfArray(SortRef);
end;

func SaldoList(typCreateIndexSald:l):i;
var z,j,k,t,xx,x,p,znakt,tra,traz,zz,jj:i;
var st1,st2,st3:s;
var СписокНаПроверку,СписокНаПроверку1,СписокНаПроверку2:i;
var tSum1, tSum2:N;
var kol:N;
var tDate:Date;
var tVal1,tVal2,tDeb, tCre,tComment:String;
var tacc,znak,znak1,tAnaS:s;
var l:l;
    ClearVariable(Раб.НФА.Свертка.salddata);
    ClearVariable(Раб.НФА.Свертка.Koldata);
    ClearVariable(Раб.НФА.Свертка.Sumdata);
    z=LengthOfArray(parSaldoList);
    if z<1:^0;fi;
    ini_SortRef_parSaldoList;
    t=LengthOfArray(SortRef1);
    traz=lengthofarray(trDataDeb);
    ShowProgress(traz,'Расчет остатков...');
    for tra=1..traz do
        ProgressPos(tra);
        if typCreateIndexSald:
           tacc=trDataDeb[tra];
         | true:trace('======== не оптиминизированны как остатки ========');
        fi;
        tAnaS=' '+trim(trDataAna[tra])+' ';
        ClearVariable(Раб.НФА.Свертка.sigtx);
        for k=1..t do -- условные блоки
            for j=1..SortRef2[k] do
               l=false;
               z=SortRef1[k]+j-1;--номер строки в parSaldoList
               if SortRef3[z]=-1:-- счет
               zz=КоличествоСлов(parSaldoList[z],'#');
               for jj=1..zz do
                 if match(tacc,ВыделитьСлово(jj,parSaldoList[z],'#')):
                    l=true;
                    break;
                 fi;
--                    l=match(tacc,parSaldoList[z]);
               od;
               if l:sigtx[SearchInArray(SortRef,SortRef3[z])]=SearchInArray(Acc,tacc,true);fi;
                | true:-- аналитика
                   p=pos(' '+Ref[SortRef3[z]]+'.',tAnaS);
                   if p>0 :st2=SubStr(tAnaS,p+1,255);st2=SubStr(st2,1,pos(' ',st2)-1);l=match(st2,parSaldoList[z]);if l:sigtx[SearchInArray(SortRef,SortRef3[z])]=SearchInArray(Sig,st2,true);                             fi;
                    | true:st2='';l=parSaldoList[z]='*';
                   fi;
               fi;
               if not l:ClearVariable(Раб.НФА.Свертка.sigtx);break;fi;
            od;
            if l:break;fi;
        od;-- условные блоки
-------------- собираем salddata --------------------
        st2='';
        for x=1..SortRefLen do
            st2=st2+'|'+format('%.5d',sigtx[x]);
        od;
        p=SearchInArray(salddata,st2,true);
        if p<1:p=InsertInArraySort(salddata,st2);
               InsertInArray(Koldata,p,0);
               InsertInArray(Sumdata,p,0);
--             InsertInArray(Sumdata2,p,0);
        fi;
        Koldata[p]=Koldata[p]+trDataKol[tra];
        Sumdata[p]=Sumdata[p]+trDataSum1[tra];

--      Koldata[p]=Koldata[p]+znakt*kol;
--      Sumdata[p]=Sumdata[p]+znakt*tSum1;
-----------------------------------------------------
    od;-- текстовые проводки
    traz=lengthofarray(salddata);
    ShowProgress(traz,'Удаление нулевых остатков...');
    ClearVariable(Раб.НФА.Свертка.Koldata0);
    ClearVariable(Раб.НФА.Свертка.Sumdata0);
    ClearVariable(Раб.НФА.Свертка.salddata0);
    p=0;
    for tra=1..traz do
        if Koldata[tra]<>0 or Sumdata[tra]<>0:
           p=p+1;
           Koldata0 [p]=Koldata [tra];
           Sumdata0 [p]=Sumdata [tra];
           salddata0[p]=salddata[tra];
        fi;
--       p=traz-tra+1;
--       if Koldata[p]=0 and Sumdata[p]=0:
--                      УдалитьИзМассива(Koldata,p);
--                      УдалитьИзМассива(Sumdata,p);
--                      УдалитьИзМассива(salddata,p);
--       fi;
        ProgressPos(tra);
    od;-- текстовые проводки
    CopyArray(Раб.НФА.Свертка.Koldata0 ,Раб.НФА.Свертка.Koldata );
    CopyArray(Раб.НФА.Свертка.Sumdata0 ,Раб.НФА.Свертка.Sumdata );
    CopyArray(Раб.НФА.Свертка.salddata0,Раб.НФА.Свертка.salddata);
    ClearVariable(Раб.НФА.Свертка.Koldata0);
    ClearVariable(Раб.НФА.Свертка.Sumdata0);
    ClearVariable(Раб.НФА.Свертка.salddata0);
    CloseProgress;
^lengthofarray(salddata);
end;
func SaldoList0:i;
var z,j,k,t,xx,x,p,znakt:i;
var st1,st2,st3:s;
var СписокНаПроверку,СписокНаПроверку1,СписокНаПроверку2:i;
var tSum1, tSum2:N;
var kol:N;
var tDate:Date;
var tVal1,tVal2,tDeb, tCre,tComment:String;
var tacc,znak,znak1,tAnaS:s;
var l:l;
                 ClearVariable(salddata);
                 ClearVariable(Koldata);
                 ClearVariable(Sumdata);
                 z=LengthOfArray(parSaldoList);
                 if z<1:^0;fi;
                 ini_SortRef_parSaldoList;
                 t=LengthOfArray(SortRef1);
                 OpenTextJur(TransTextJur);
                 Try
--       СписокНаПроверку1=3;СписокНаПроверку2=2;
                         while not GetTransFromTextJur(tDate, tSum1, tVal1, tSum2, tVal2, tDeb, tCre, tAna, tComment) do
         ClearVariable(sigtx);tAnaS='';
         if tDeb='00' or tDeb='00Z':tacc=ReplAcc(tCre);znak='-';znakt=-1;
                | true:tacc=ReplAcc(tDeb);znak='+';znakt=1;
         fi;
         xx=LengthOfArray(tAna);
         kol=0;
         for x=1 to xx do
                         znak1=SubStr(tAna[x],1,1);
                         if pos(znak1,'+-')>0:
                if znak1=znak:tAna[x]=substr(tAna[x],2,255);
                 | true:tAna[x]='';
                fi;
--              | true:znak1='';
                         fi;
                         p=Pos(':', tAna[x]);
                         if p>0:
                st2=trim(substr(tAna[x],p+1,255));
                kol=round(st2,length(ВыделитьСлово(2,st2,'.')));
                tAna[x]=substr(tAna[x],1,p-1);
                         fi;
--                               tAnaS=tAnaS+' '+znak1+tAna[x];
                         tAnaS=tAnaS+' '+tAna[x];
         od;
         tAnaS=' '+trim(tAnaS)+' ';
         ClearVariable(sigtx);
         for k=1..t do -- условные блоки
                 for j=1..SortRef2[k] do
                         l=false;
                         z=SortRef1[k]+j-1;--номер строки в parSaldoList
                         if SortRef3[z]=-1:-- счет
                l=match(tacc,parSaldoList[z]);if l:sigtx[SearchInArray(SortRef,SortRef3[z])]=SearchInArray(Acc,tacc,true);fi;
                                | true:-- аналитика
                p=pos(' '+Ref[SortRef3[z]]+'.',tAnaS);
                if p>0 :st2=SubStr(tAnaS,p+1,255);st2=SubStr(st2,1,pos(' ',st2)-1);l=match(st2,parSaldoList[z]);if l:sigtx[SearchInArray(SortRef,SortRef3[z])]=SearchInArray(Sig,st2,true);fi;
                 | true:st2='';l=parSaldoList[z]='*';
                fi;
                         fi;
                         if not l:ClearVariable(sigtx);break;fi;
                 od;
                 if l:break;fi;
         od;-- условные блоки
-------------- собираем salddata --------------------
         st2='';
         for x=1..SortRefLen do
                st2=st2+'|'+format('%.5d',sigtx[x]);
         od;
         p=SearchInArray(salddata,st2,true);
         if p<1:p=InsertInArraySort(salddata,st2);
                        InsertInArray(Koldata,p,0);
                        InsertInArray(Sumdata,p,0);
--                              InsertInArray(Sumdata2,p,0);
         fi;
         Koldata[p]=Koldata[p]+znakt*kol;
         Sumdata[p]=Sumdata[p]+znakt*tSum1;
-----------------------------------------------------
                         od;-- текстовые проводки
                 Finally
                         CloseTextJur;
                 end;



^lengthofarray(salddata);
end;
Proc SaveDataAs;
 var t,xx,z,zz:i;
 var ss:s;
 xx=lengthofarray(salddata);
 for t=1..xx do
--      zz=количествослов(salddata[t],'|');
        ss='';
        for z=1..SortRefLen do
                if SortRef[z]=-1: ss=ss+' '+acc[int(выделитьслово(z,salddata[t],'|'))];
                 | true: ss=ss+' '+sig[int(выделитьслово(z,salddata[t],'|'))];
                fi;
        od;
                ss=str(Sumdata[t],2)+' '+ss;
                ss=str(Koldata[t],2)+' :'+ss;
        trace(ss);
 od;

end;

Proc ini_parSaldoList(Способ:s);
 var t,k,z:i;
 var any_ref_list0,ss:s;
        Способ=up(Способ);
        if Способ='':exit;fi;
        clearvariable(Раб.НФА.Свертка.parSaldoList);
        t=0;
        z=количествослов(any_ref_list,'|');
        if Способ='ОСТАТКИ ВСЕ':
                 for t=1..z do
                   ss='|'+up(ВыделитьСлово(t,any_ref_list,'|'))+'|';
                   if pos(ss,'|НФА|УЧН|СЧЕТ|МОЛ|М|')<1:
                      any_ref_list0=Раб.НФА.B01.ab(any_ref_list0,'|',ss);
                   fi;
                 od;
                 z=количествослов(any_ref_list0,'|');t=0;
                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('НФА|УЧН|СЧЕТ|МОЛ|М','|',any_ref_list0);-- первый элемент=порядок сортировки

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН|МОЛ|М','|',any_ref_list0);-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.???.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН|МОЛ|М','|',any_ref_list0);-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.??.???.??';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;
         | Способ='ОСТАТКИ ЗАБ':
                 for t=1..z do
                   ss=up(ВыделитьСлово(t,any_ref_list,'|'));
                   if pos('|'+ss+'|','|НФА|СЧЕТ|МОЛ|М|')<1:
                      any_ref_list0=Раб.НФА.B01.ab(any_ref_list0,'|',ss);
                   fi;
                 od;
                 z=количествослов(any_ref_list0,'|');t=0;
                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('НФА|СЧЕТ|МОЛ|М','|',any_ref_list0);-- первый элемент=порядок сортировки

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|МОЛ|М','|',any_ref_list0);-- список на проверку
--                 t=t+1;parSaldoList[t]='*.106.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='ЗАБ.??.???.??';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;

         | Способ='ОСТАТКИ ВСЕ СРАЗУ':
                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('НФА|УЧН|СЧЕТ|МОЛ|М','|',any_ref_list);-- первый элемент=порядок сортировки

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН|МОЛ|М','|',any_ref_list);-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.101.??.???#???.????.??????*.???.?.102.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН|МОЛ|М','|',any_ref_list);-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.105.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН|МОЛ|М','|',any_ref_list);-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.??.???.??';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.104.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.ДУЧЕТ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.ДЭКСПЛ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.НЕТМЕСАМОРТ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

         | Способ='ОСТАТКИ НФА 101':
                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('НФА|УЧН|СЧЕТ|МОЛ|М','|',any_ref_list);-- первый элемент=порядок сортировки

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН|МОЛ|М','|',any_ref_list);-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.101.??.???#???.????.??????*.???.?.102.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.104.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.ДУЧЕТ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.ДЭКСПЛ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.НЕТМЕСАМОРТ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
         | Способ='ОСТАТКИ НФА 101 148':
                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('НФА|УЧН|СЧЕТ','|',any_ref_list);-- первый элемент=порядок сортировки

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН','|',any_ref_list);-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.101.??.???#???.????.??????*.???.?.102.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.104.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.ДУЧЕТ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.ДЭКСПЛ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку

                 t=t+1;parSaldoList[t]='СЧЕТ|НФА|УЧН';-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.НФА.НЕТМЕСАМОРТ*';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
         | Способ='ОСТАТКИ НФА 104':
                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('НФА|УЧН|СЧЕТ|МОЛ|М','|',any_ref_list);-- первый элемент=порядок сортировки

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН|МОЛ|М','|',any_ref_list);-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.101.??.???#???.????.??????*.???.?.102.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН','|',any_ref_list) ;-- список на проверку
                 t=t+1;parSaldoList[t]='???.????.??????*.???.?.104.??.???';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;
         | Способ='ОСТАТКИ НФА ЗАБ УЧН':
                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('НФА|УЧН|СЧЕТ|МОЛ|М','|',any_ref_list);-- первый элемент=порядок сортировки

                 t=t+1;parSaldoList[t]=Раб.НФА.B01.ab('СЧЕТ|НФА|УЧН|МОЛ|М','|',any_ref_list);-- список на проверку
                 t=t+1;parSaldoList[t]='ЗАБ.??.101.??';-- проверка по списку
                 t=t+1;parSaldoList[t]='НФА.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='УЧН.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='МОЛ.*';-- проверка по списку
                 t=t+1;parSaldoList[t]='М.*';-- проверка по списку
                 for k=1..z do t=t+1;parSaldoList[t]='*';od;
         | true:
        fi;

end;
func CreateJurSaldo(УслСчет:s;УслАналит:s;УслИсклАналит:s;ДАТА_ОСТ:d):i;
         ^TujReport(TransTextJur, 1.1.100, ДАТА_ОСТ, УслСчет, УслАналит, УслИсклАналит, "", "", TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna, False);
end;
proc СправкаОС_25_148(ДАТА_ОСТ:d);
var УслСчет,УслАналит,УслИсклАналит:s;
var len:i;
         УслСчет        ='*.?.101.??.???|*.?.104.??.???|ЗАБ.НФА.НЕТМЕСАМОРТ|ЗАБ.НФА.ДЭКСПЛ|ЗАБ.НФА.ДУЧЕТ';
         УслАналит      ='НФА.*&УЧН.*';
--       УслАналит              ='НФА.101.04._АППАРАТ_СВАРОЧНЫЙ&УЧН.0000000003';
--       НФА.101.09.ТЕРВЮРЕН_ЛЭСИ&УЧН.0000000003
         УслИсклАналит='ДНФА|ПЕРИОД|КОСГУ|ФКР|ГГ|ММДД|ДОК|ДВИЖ_НФА';
--       УслИсклАналит='ДНФА|МОЛ|М|ПЕРИОД|КТ|П|КОСГУ|ФКР|ГГ|ММДД|ДОК|ДВИЖ_НФА';
         ShowProgress(0,'Формирование журнала остатков...');
         TransTextJur =PlanVar('CACHE')+"\"+GetGUID;
         len            =CreateJurSaldo(УслСчет,УслАналит,УслИсклАналит,ДАТА_ОСТ);
         CloseProgress;
         CreateIndex(true,len,false);
         ini_parSaldoList('ОСТАТКИ НФА 101');
--       ini_parSaldoList('ОСТАТКИ НФА 101 148');
         len=SaldoList(true);
-- SaveDataAs;

end;
proc СправкаОС_148_104(ДАТА_ОСТ:d);
var УслСчет,УслАналит,УслИсклАналит:s;
var len:i;
         УслСчет        ='*.?.101.??.???|*.?.102.??.???|*.?.104.??.???';
         УслАналит      ='НФА.*&УЧН.*';
--       УслАналит  ='НФА.102.01.ПРОГРАММНОЕ_ОБЕСПЕЧЕНИЕ&УЧН.*';
--       НФА.101.09.ТЕРВЮРЕН_ЛЭСИ&УЧН.0000000003
         УслИсклАналит='ДНФА|ПЕРИОД|КОСГУ|ФКР|ГГ|ММДД|ДОК|ДВИЖ_НФА';
--       УслИсклАналит='ДНФА|МОЛ|М|ПЕРИОД|КТ|П|КОСГУ|ФКР|ГГ|ММДД|ДОК|ДВИЖ_НФА';
         ShowProgress(0,'Формирование журнала остатков...');
         TransTextJur =PlanVar('CACHE')+"\"+GetGUID;
         len            =CreateJurSaldo(УслСчет,УслАналит,УслИсклАналит,ДАТА_ОСТ);
         CloseProgress;
         CreateIndex(true,len,false);
         ini_parSaldoList('ОСТАТКИ НФА 104');
--       ini_parSaldoList('ОСТАТКИ НФА 101 148');
         len=SaldoList(true);
-- SaveDataAs;

end;
proc СправкаОС_148_ОСТАТКИ(ДАТА_ОСТ:d;УслСчет:s;УслАналит:s;УслИсклАналит:s);
var len:i;
         УслСчет=trim(УслСчет);
         УслАналит=trim(УслАналит);
         УслИсклАналит=trim(УслИсклАналит);
         if УслСчет      ='':УслСчет        ='*.?.101.??.???|*.?.105.??.???|*.?.104.??.???|ЗАБ.??.???.??|ЗАБ.НФА.НЕТМЕСАМОРТ|ЗАБ.НФА.ДЭКСПЛ|ЗАБ.НФА.ДУЧЕТ'              ;fi;
         if УслАналит    ='':УслАналит      ='НФА.*'                                ;fi;
         if УслИсклАналит='':УслИсклАналит  ='ДНФА|ПЕРИОД|КОСГУ|ФКР|ГГ|ММДД|ДОК|ДВИЖ_НФА' ;fi;
         ShowProgress(0,'Формирование журнала остатков...');
         TransTextJur =PlanVar('CACHE')+"\"+GetGUID;
         len            =CreateJurSaldo(УслСчет,УслАналит,УслИсклАналит,ДАТА_ОСТ);
         CloseProgress;
         CreateIndex(true,len,true);
         ini_parSaldoList('ОСТАТКИ ВСЕ');
--       ini_parSaldoList('ОСТАТКИ НФА 101 148');
         len=SaldoList(true);
-- SaveDataAs;

end;

proc СправкаОС_ЗАБ_ОСТАТКИ(ДАТА_ОСТ:d;УслСчет:s;УслАналит:s;УслИсклАналит:s);
var len:i;
         УслСчет=trim(УслСчет);
         УслАналит=trim(УслАналит);
         УслИсклАналит=trim(УслИсклАналит);
         if УслСчет      ='':УслСчет        ='ЗАБ.??.???.??'              ;fi;
         if УслАналит    ='':УслАналит      ='НФА.*'                                ;fi;
         if УслИсклАналит='':УслИсклАналит  ='ДНФА|ГГ|ММДД|ДОК|ДВИЖ_НФА' ;fi;
         ShowProgress(0,'Формирование журнала остатков...');
         TransTextJur =PlanVar('CACHE')+"\"+GetGUID;
         len            =CreateJurSaldo(УслСчет,УслАналит,УслИсклАналит,ДАТА_ОСТ);
         CloseProgress;
         CreateIndex(true,len,true);
         ini_parSaldoList('ОСТАТКИ ЗАБ');
--       ini_parSaldoList('ОСТАТКИ НФА 101 148');
         len=SaldoList(true);
-- SaveDataAs;

end;

proc СправкаОС_ЗАБ_ОСТАТКИ_УЧН(ДАТА_ОСТ:d;УслСчет:s;УслАналит:s;УслИсклАналит:s);
var len:i;
         УслСчет=trim(УслСчет);
         УслАналит=trim(УслАналит);
         УслИсклАналит=trim(УслИсклАналит);
         if УслСчет      ='':УслСчет        ='ЗАБ.??.???.??'              ;fi;
         if УслАналит    ='':УслАналит      ='НФА.*'                                ;fi;
         if УслИсклАналит='':УслИсклАналит  ='ДНФА|ГГ|ММДД|ДОК|ДВИЖ_НФА' ;fi;
         ShowProgress(0,'Формирование журнала остатков...');
         TransTextJur =PlanVar('CACHE')+"\"+GetGUID;
         len            =CreateJurSaldo(УслСчет,УслАналит,УслИсклАналит,ДАТА_ОСТ);
         CloseProgress;
         CreateIndex(true,len,true);
         ini_parSaldoList('ОСТАТКИ НФА ЗАБ УЧН');
--       ini_parSaldoList('ОСТАТКИ НФА 101 148');
         len=SaldoList(true);
-- SaveDataAs;

end;

var Buf[]:s;
var Buft[]:s;
var aAna[]:s;
var спр_код0[]:s;



Func СписокСПР_ОСТ(днфапризн:s):s;
var RO, OA, num, i, j, len, z,t  :Integer;
var  НЕДЕЙСТВСПР        :STRING; --список скрытых(незадействованных) справочников [через(|)]
var  НЕДЕЙСТВОСТ        :STRING; --список справочников по которым несчитаются остатки [через(|)]
var  spr0,spr:s;
 if картотекапризнака(днфапризн)<>'РПО_ДНФА':^'';fi;
 clearvariable(Раб.НФА.Свертка.aAna);

 RO=OpenWorkArea("РПО_ДНФА", "","UKEY="+recordtostring(признаквзапись(днфапризн)));
 Try
         num=Records(RO);
         if num=1:
            Try
                НЕДЕЙСТВСПР='|'+up(trim(GetFields(RO, 1, "НЕДЕЙСТВСПР")))+'|';
                НЕДЕЙСТВОСТ='|'+up(trim(GetFields(RO, 1, "НЕДЕЙСТВОСТ")))+'|';
                OA=OpenArray(RO, 1, "ЗАПРОС", "", "ОСТАТОК and (ТИППАРАМЕТРА=9 or ТИППАРАМЕТРА=14)");-- аналитика для остатков
                len=Records(OA);
                if len>0:
                   for j=1 to len do
                       spr0=trim(GetFields(OA, j, "ОТВЕТ"));
                       if spr0<>'':
                          spr=trim(GetFields(OA, j, "СПР"));
                          if spr<>'':
                             spr='|'+up(spr)+'|';
                             if pos(spr,НЕДЕЙСТВСПР)<1 and pos(spr,НЕДЕЙСТВОСТ)<1:
                                spr0=Раб.НФА.B01.СписокСправочниковПоМаске(spr0,'|');
                              | true:spr0='';
                             fi;
                           | true:spr0=Раб.НФА.B01.СписокСправочниковПоМаске(spr0,'|');
                          fi;
                          z=количествослов(spr0,'|');
                          for t=1..z do 
                            addinarray(aAna,true,false,выделитьслово(t,spr0,'|'));





                          od;
                       fi;
                   od;
                fi;
                CloseWorkArea(OA);
            Finally
            end;
         fi;
 Finally
         CloseWorkArea(RO);
 end;
 z=LengthOfArray(aAna);
 spr0='';
 for t=1..z do
        spr0=Раб.НФА.B01.ab(spr0,'|',aAna[t]);
 od;
 ^spr0;

end;
--Func ДНФААналитикаУслОст(днфапризн:s;rec:record):s;
--var RO, OA, WA, rs, num, i, j, len, z,t  :Integer;
--var  НЕДЕЙСТВСПР        :STRING; --список скрытых(незадействованных) справочников [через(|)]
--var  НЕДЕЙСТВОСТ        :STRING; --список справочников по которым несчитаются остатки [через(|)]
--var  recNDFA:record;
--var  spr0,spr,ss:s;
--var  LWA:l;
-- recNDFA=nil;
-- if rec<>nil:
--    WA=OpenWorkArea('РПО_ОПЕРАЦИИДНФА','','UKEY='+recordtostring(rec));
--    rs=records(wa);
--    if rs<>1:
--       CloseWorkArea(wa);^'';
--    fi;
--    LWA=true;
--    recNDFA=GetFieldR(wa,1,'ДНФА');
--    ss     =trim(GetFieldS(wa,1,'АН_ДНФА'));
--    if ss='':CloseWorkArea(wa);^'';fi;
--    if recNDFA<>nil:
--    днфапризн     =GetFieldS(wa,1,'ДНФА.ДНФА');
--    if ss<>''
--    if днфапризн
--    АН_ДНФА
-- fi;
-- if картотекапризнака(днфапризн)<>'РПО_ДНФА':^'';
-- fi;
-- clearvariable(Раб.НФА.Свертка.aAna);
-- RO=OpenWorkArea("РПО_ДНФА", "","UKEY="+recordtostring(признаквзапись(днфапризн)));
-- Try
--         num=Records(RO);
--         if num=1:
--            Try
--                НЕДЕЙСТВСПР='|'+up(trim(GetFields(RO, 1, "НЕДЕЙСТВСПР")))+'|';
--                НЕДЕЙСТВОСТ='|'+up(trim(GetFields(RO, 1, "НЕДЕЙСТВОСТ")))+'|';
--                OA=OpenArray(RO, 1, "ЗАПРОС", "", "ОСТАТОК and ТИППАРАМЕТРА=9");-- аналитика для остатков
--                len=Records(OA);
--                if len>0:
--                   for j=1 to len do
--                       spr0=trim(GetFields(OA, j, "ОТВЕТ"));
--                       if spr0<>'':
--                          spr=trim(GetFields(OA, j, "СПР"));
--                          if spr<>'':
--                             spr='|'+up(spr)+'|';
--                             if pos(spr,НЕДЕЙСТВСПР)<1 and pos(spr,НЕДЕЙСТВОСТ)<1:
--                                spr0=Раб.НФА.B01.СписокСправочниковПоМаске(spr0,'|');
--                              | true:spr0='';
--                             fi;
--                           | true:spr0=Раб.НФА.B01.СписокСправочниковПоМаске(spr0,'|');
--                          fi;
--                          z=количествослов(spr0,'|');
--                          for t=1..z do addinarray(aAna,true,false,выделитьслово(t,spr0,'|'));od;
--                       fi;
--                   od;
--                fi;
--                CloseWorkArea(OA);
--            Finally
--            end;
--         fi;
-- Finally
--         CloseWorkArea(RO);
-- end;
-- z=LengthOfArray(aAna);
-- spr0='';
-- for t=1..z do
--        spr0=Раб.НФА.B01.ab(spr0,'|',aAna[t]);
-- od;
-- ^spr0;

--end;

Функ Get_any_ref_list(ДАТАОТЧ:d;УслКонстантаДНФА:s): s;
var Путь,Имяотчета,ss,ss0:s;
var Отч,t,z,zz,tt:i;
var r:report;
var MskНФА,sss :S;
УслКонстантаДНФА=trim(УслКонстантаДНФА);
ClearVariable(Раб.НФА.Свертка.Buf);
ClearVariable(Раб.НФА.Свертка.Buft);
if УслКонстантаДНФА='':
  MskНФА="((*.101.*|*.102.*|*.105.*)&(ЗАБ.??.???.??|???.????.??????*.???.?.???.??.???))";
  Путь=PlanVar("НФА")+"\Отчеты\НФАОТЧ.lst";
  Имяотчета="Отчет (бланки, не менять!!!)";
  r = RepOpen(Путь+"|"+ИмяОтчета,"("+MskНФА+")",'ДНФА.*&МОЛ.*&М.*&НФА.*', 1.1.100, ДАТАОТЧ,'','ДНФА');
  try
          RepReset(r);
          Отч=0;
          while RepNext(r) do
             addinarray(Buf,true,false,RepIdent(r));
          end;
  finally
          r = RepClose(r);
  end;
  for sign sss='ДНФА.РАСХ.*|ДНФА.ВНПР.*' do
      addinarray(Buf,true,false,sss);
  od;
 | true:
  УслКонстантаДНФА='ДНФА.*&'+УслКонстантаДНФА;
  for sign sss=УслКонстантаДНФА do
      addinarray(Buf,true,false,sss);
  od;
fi;
        z=lengthofarray(Buf);
        for t=1..z do
         ss=СписокСПР_ОСТ(Buf[t]);
         zz=количествослов(ss,'|');
         for tt=1..zz do
                 ss0=выделитьслово(tt,ss,'|');
                 if searchinarray(спр_код0,ss0+'.',false)<1:
        addinarray(Buft,true,false,ss0);
                 fi;
         od;
--       trace(ss+'='+Buf[t]);

        od;
        z=lengthofarray(Buft);
        sss='';
        for t=1..z do
                if Buft[t]<>'':
         sss=sss+'|'+Buft[t];
                fi;
        od;
        sss=SubStr(sss,2,255);
        ^sss    ;
end;


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


Конец
