БЛАНКСШАБЛОНОМ "Отчет по неединичным УЧН (в комбинации с НФА)";

btnВыйти :Object; btnРасчет :Object; cbСтрогоОдинУЧН :Object; cbУчитВыбывшНФА :Object; секцЗТ :Object; секцДТ :Object;
Позиции       :Integer;
СтрогоОдинУЧН :Logical=[False];
УчитВыбывшНФА :Logical=[False];

var тНОМ[]    :Integer=$;
var тУЧН[]    :String;
var тКОЛ[]    :Numeric;
var тНФАк[]   :String;
var тНФАи[]   :String;
var тДЕТ      :String="р";

var LSTНФА[]  :String;
var LSTСУМ[]  :Numeric;
var LSTКОЛ[]  :Numeric;
var aAna[]    :String;

Proc Очистить;
 ClearVariable(тНОМ);
 ClearVariable(тУЧН);
 ClearVariable(тКОЛ);
 ClearVariable(тНФАк);
 ClearVariable(тНФАи);
 ClearVariable(тДЕТ);
 ClearVariable(Позиции);
 ClearVariable(LSTНФА);
 ClearVariable(LSTСУМ);
 ClearVariable(LSTКОЛ);
 ClearVariable(aAna);
end;

Proc ВидимостьСтолбцов;
var num, ii :Integer;
 if СтрогоОдинУЧН:
  aAna[1]="1"; aAna[3]="1"; aAna[5]="0"; aAna[7]="1";
  aAna[2]="1"; aAna[4]="0"; aAna[6]="1";
 else
  aAna[1]="1"; aAna[3]="1"; aAna[5]="1"; aAna[7]="1";
  aAna[2]="1"; aAna[4]="1"; aAna[6]="1";
 fi;
 num=LengthOfArray(aAna);
 if num>0:
   for ii=1 to num do
     секцЗТ.Column(ii, ColVisible, if(aAna[ii]="1", True, False));
     секцДТ.Column(ii, ColVisible, if(aAna[ii]="1", True, False));
   od;
 fi;
end;

Proc ВнешнийВид;
var FF :Logical;
 if Позиции>0: FF=True; else FF=False; fi;
 секцЗТ.Visible=FF;
 секцДТ.Visible=FF;
 ВидимостьСтолбцов;
end;

Proc ВнешнийВидБоксов(ЕстьУник:Logical);
 if ЕстьУник: УчитВыбывшНФА=False; fi;
 cbУчитВыбывшНФА.State   = УчитВыбывшНФА;
 cbУчитВыбывшНФА.Enabled = not ЕстьУник;
end;

Proc РасчетНЕединУЧН_строгий;
var Путь, КОДУЧН, услАНА :String;
var num, ii, jj :Integer;
var KOL :Numeric;
var Отч1 :Report;
 ShowProgress(0, "Подготовка...");
 Try
   Путь=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst";
   if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
   if Name_A("УЧН.ДО3000")=" ": услАНА="УЧН.*"; else услАНА="УЧН.*&~УЧН.ДО3000"; fi;
   Try
     Очистить;
     Отч1=RepOpen(Путь+"|Проверка_УЧН", "*.?.101.??.310|*.?.102.??.320|*.?.103.??.330", услАНА, 1.1.100, 1.1.3000, "", "УЧН");
     RepReset(Отч1);
     Try
       num=RepRowsCount(Отч1);
       ii=0; jj=0;
       ShowProgress(num, "Отбор данных...");
       while RepNext(Отч1) do
         ii=ii+1;
         ProgressPos(ii);
         КОДУЧН=RepIdent(Отч1);
         KOL=RepSaldoF(Отч1, отчСверн, "КОЛ");
         if KOL>1.00:
           jj=jj+1;
           тУЧН[jj]=КОДУЧН;
           тКОЛ[jj]=KOL;
         fi;
       end; -- while
     Finally
       Отч1=RepClose(Отч1);
     end;
     Позиции=LengthOfArray(тУЧН);
     ВнешнийВид;
     if not Позиции>0: Message("Дважды и более присвоенных^Mучетных номеров (УЧН) - нет!", mtInformation); Template.Object="btnВыйти"; Exit; fi;
   Except
     Message("Ошибка создания отчета!", mtError);
     Raise;
   end;
 Finally
   CloseProgress;
 end;
end;

Proc РасчетНЕединУЧН_сНФА;
var nameFile, Путь, aVal1, aVal2, aDeb, aCre, aComment, услАНА, КОДСЧТ, КОДНФА, КОДУЧН, svrANA, tmp :String;
var FF, kk, len, ii, xx, jj, pp, hh  :Integer;
var aSum1, aSum2, SUM, QUA, KOL :Numeric;
var aDate :Date;
var БЕЗУЧН, СЧДЕБ :Logical;
 nameFile=PlanVar('CACHE')+"\"+GetGUID;
 if ExistFile(nameFile): Try DeleteFile(nameFile); Except Raise; end; fi;
 if Name_A("УЧН.ДО3000")=" ": услАНА="НФА.*&УЧН.*"; else услАНА="НФА.*&(УЧН.*&~УЧН.ДО3000)"; fi;
 len=TujReport(nameFile, 1.1.100, 1.1.3000, "*.?.101.??.310|*.?.102.??.320|*.?.103.??.330", услАНА, "ДНФА", "", "", TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna, False);
 ShowProgress(0, "Подготовка...");
 Try
   if len>0:
      OpenTextJur(nameFile);
      Try
        ShowProgress(len, "Поиск данных...");
        Очистить;
        ii=1;
        while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
          ProgressPos(ii);
          ii=ii+1;
          xx=LengthOfArray(aAna);
          КОДСЧТ=""; SUM=0.00;
          if xx>0:
             if aDeb="00" or aDeb="00Z": КОДСЧТ=aCre; СЧДЕБ=False; fi;
             if aCre="00" or aCre="00Z": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
             if Match(КОДСЧТ, "???.????.???????.???.?.101.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False;
             |  Match(КОДСЧТ, "???.????.???????.???.?.105.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=True;
             |  Match(КОДСЧТ, "???.????.???????.???.?.102.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False;
             |  Match(КОДСЧТ, "ЗАБ.??.10?.??")                       : КОДСЧТ=КОДСЧТ;                      БЕЗУЧН=True;
--             |  Match(КОДСЧТ, "???.??.??.??.??.??.????.?.101.08.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 33)+"???"; БЕЗУЧН=False;
             |  Match(КОДСЧТ, "???.??.??.??.??.??.????.?.103.??.???"): КОДСЧТ=SubStr(КОДСЧТ, 1, 33)+"???"; БЕЗУЧН=False;
             else КОДСЧТ="";
             fi;
             if КОДСЧТ<>"":
               if (aVal1="" or aVal1="РУБ") and aSum1<>0: if СЧДЕБ: SUM=aSum1; else SUM=-aSum1; fi;
               |  (aVal2="" or aVal2="РУБ") and aSum2<>0: if СЧДЕБ: SUM=aSum2; else SUM=-aSum2; fi;
               else SUM=0;
               fi;
               -- очистка аналитики
               КОДНФА=""; КОДУЧН=""; QUA=0.00; KOL=0.00;
               for jj=1 to xx do
                 pp=Pos(":", aAna[jj]);
                 if pp>0:
                   QUA=StringToNumeric(SubStr(aAna[jj], pp+1, Length(aAna[jj])-pp));
                   svrANA=SubStr(aAna[jj], 1, pp-1);
                 else
                   svrANA=aAna[jj];
                 fi;
                 tmp=SubStr(svrANA, 1, 1);
                 if tmp="+" or tmp="-": svrANA=SubStr(svrANA, 2, 255); fi;
                 if Match(svrANA, "НФА.*"): КОДНФА=svrANA; KOL=if(СЧДЕБ, QUA, -QUA);
                 |  Match(svrANA, "УЧН.*"): КОДУЧН=svrANA;
                 fi;
               od;
               if БЕЗУЧН or Trim(КОДУЧН)="": КОДУЧН=" "; fi;
               tmp="";
               if КОДНФА<>"":
                  tmp=КОДСЧТ+"|"+КОДНФА+"|"+КОДУЧН;
                  -- КОДСЧТ|КОДНФА|КОДУЧН
                  hh=SearchInArray(LSTНФА, tmp, True, 1);
                  if hh=-1:
                     pp=InsertInArraySort(LSTНФА, tmp);
                     InsertInArray(LSTСУМ, pp, SUM);
                     InsertInArray(LSTКОЛ, pp, KOL);
                  else
                     LSTСУМ[hh]=LSTСУМ[hh]+SUM;
                     LSTКОЛ[hh]=LSTКОЛ[hh]+KOL;
                  fi;
               fi;
             fi; -- КОДСЧТ<>""
          fi; -- xx>0
        end; -- while
      Finally
        CloseTextJur;
      end; -- Try
   fi; -- len>0
   len=LengthOfArray(LSTНФА);
   if len>0:
      ShowProgress(len, "Обработка...");
      jj=0;
      for ii=1 to len do
        ProgressPos(ii);
        -- КОДСЧТ|КОДНФА|КОДУЧН
        КОДСЧТ=Trim(ExtractWord(1, LSTНФА[ii], "|"));
        КОДНФА=Trim(ExtractWord(2, LSTНФА[ii], "|"));
        КОДУЧН=Trim(ExtractWord(3, LSTНФА[ii], "|"));
        if Trim(КОДУЧН)<>"" and LSTКОЛ[ii]>1:
           if УчитВыбывшНФА:
             if Saldo(КОДСЧТ+"{"+КОДНФА+"&"+КОДУЧН+"}", 1.1.3000, "РУБ")>0.00 and 
                Saldo(КОДСЧТ+"{"+КОДНФА+"&"+КОДУЧН+"}", 1.1.3000, "КОЛ")>0.00:
               jj=jj+1;
               тУЧН[jj]  = КОДУЧН;
               тКОЛ[jj]  = LSTКОЛ[ii];
               тНФАк[jj] = КОДНФА;
               тНФАи[jj] = Trim(Name_A(КОДНФА));
             fi;
           else
             jj=jj+1;
             тУЧН[jj]  = КОДУЧН;
             тКОЛ[jj]  = LSTКОЛ[ii];
             тНФАк[jj] = КОДНФА;
             тНФАи[jj] = Trim(Name_A(КОДНФА));
           fi;
        fi;
      od;
   fi;
 Finally
   CloseProgress;
 end;
 Позиции=LengthOfArray(тУЧН);
 ВнешнийВид;
 if not Позиции>0: Message("Дважды и более присвоенных^Mучетных номеров (УЧН) - нет!", mtInformation); Template.Object="btnВыйти"; Exit; fi;
end;

Proc РасчетНЕединНФА;
 if СтрогоОдинУЧН: РасчетНЕединУЧН_строгий; else РасчетНЕединУЧН_сНФА; fi;
end;

Proc ДетализацияУЧНonly(КОДУЧН:String);
var Путь :String;
 Путь=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst";
 if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
 Try
   Report(Путь+"|По_проводкам", 1.1.100, 1.1.3000, "*.?.101.??.310|*.?.102.??.320|*.?.103.??.330", КОДУЧН);
 Except
   Message("Ошибка создания детализированного отчета!", mtError);
   Raise;
 end;
end;

Proc ДетализацияУЧН_НФА(КОДУЧН:String; КОДНФА:String);
var Путь :String;
 Путь=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst";
 if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
 Try
   Report(Путь+"|По_проводкам", 1.1.100, 1.1.3000, "*.?.101.??.310|*.?.102.??.320|*.?.103.??.330", КОДУЧН+"&"+КОДНФА);
 Except
   Message("Ошибка создания детализированного отчета!", mtError);
   Raise;
 end;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
 if Field="тДЕТ": if СтрогоОдинУЧН: ДетализацияУЧНonly(тУЧН[Iter]); else ДетализацияУЧН_НФА(тУЧН[Iter], тНФАк[Iter]); fi; ^False;
 fi;
 ^True;
end;

Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnВыйти"  : Close;
 |  Sender="btnРасчет" : РасчетНЕединНФА;
 fi;
end;

Proc cbСтрогоОдинУЧН_OnChange(Sender: String);
var Flag, Old :Logical;
 Flag=СтрогоОдинУЧН; -- текущий статус;
 Old = not Flag;     -- предыдущий статус
 if Позиции>0: if EnqOkCancel("Флаг изменен.^MНеобходимо очистить отчет.^MОчистить?", mtWarning)=cmCancel: Flag=Old; fi; fi;
 СтрогоОдинУЧН=Flag;
 cbСтрогоОдинУЧН.State=Flag;
 if Flag<>Old:
   Очистить;
   ВнешнийВид;
   ВнешнийВидБоксов(Flag);
 fi;
end;

Proc cbУчитВыбывшНФА_OnChange(Sender: String);
var Flag, Old :Logical;
 Flag=УчитВыбывшНФА; -- текущий статус;
 Old = not Flag;     -- предыдущий статус
 if Позиции>0: if EnqOkCancel("Флаг изменен.^MНеобходимо очистить отчет.^MОчистить?", mtWarning)=cmCancel: Flag=Old; fi; fi;
 УчитВыбывшНФА=Flag;
 cbУчитВыбывшНФА.State=Flag;
 if Flag<>Old:
   Очистить;
   ВнешнийВид;
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 Очистить;
 ВнешнийВид;
 ВнешнийВидБоксов(СтрогоОдинУЧН);
 Template.Object="btnВыйти";
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 Очистить;
end;


КОНЕЦ -- конец бланк

