-- Шаблон создан мастером бланков
-- 02.03.2011 19:05:22
--
БланкСШаблоном "Печать";
S1:Section;
TmpT:Section;
TmpFmt:Section;
var ValueN:N;

wrk:Section;
var SecList[]:S;--Список передаваемых секций
var SecWlin[]:S;--Ширина столбцов через @ в десятых долях мм
var SecWcol[]:S;--Ширина столбцов через @ в числе переобъединяемых столбцов
var SecPos[]:i;--Позиция при подборе


УпрСек:Упр;
var selfBln:S="РАБ.ВСПОМ.ПЕЧАТЬ2";
var Init:L;
var NextPageNew:L;
var ForceHeight:I;
var selfCfg:S;
var selfCfg_:S="ТББ.ПЕЧАТЬ2.cfg";
var XS:I=2100; --Размер листа чистый
var YS:I=2970; --Размер листа чистый
var NowRow:I;
var Pages:I;
var myBlank:S;
var Capa[]:N;--аккумулятор
var CapaF[]:N=Capa[$];--Копия аккумулятора для итоговых значений


func ОтКраяДоПоз(n:I;ДоПоз:I):I;--вычисляет ширину до правого края столбца ДоПоз
var Res,i:i;
Res=0;
for i=1..ДоПоз do
  Res=Res+Int(ExtractWord(i,SecWlin[n],"@"));
od;
^Res;
end;

func МинКрай(максКрай:I):I;
var n,nn,tmpI:I;
var res:i;
 res=максКрай;
 nn=LengthOfArray(SecList);
 for n=1..nn do
   if SecPos[n]<>0 then--WordsCount(SecWlin[n],"@") then
      tmpI=ОтКраяДоПоз(n,SecPos[n]);
      if res>tmpI then res=tmpI; fi;
   fi;
 od;
 ^res;
end;
--/****if* Раб.Вспом.Печать2/ПодготовкаСекции
--* SYNOPSIS
proc ПодготовкаСекции;
--* FUNCTION
--* Создает столбцы общей секции бланка ПЕЧАТЬ2 так, чтобы их объединением
--* можно было получить столбцы секций печатаемого бланка
--* SOURCE
var n,nn,tmpI,ii,MyPos:integer;
var maxw,curw,prew:integer;--максимальная ширина, текущая и предыдущая при подборе
var tmpS:S;
var tmpL:L;
var MySect:Object;
  tmpL=FindObject(selfBln+".S1",MySect);
  nn=LengthOfArray(SecList);
  maxw=0;
  for n=1..nn do
    tmpI=ОтКраяДоПоз(n,SecPos[n]);
    if tmpI>maxw then maxw=tmpI; fi;
    SecPos[n]=1;--сбрасываем позицию для переразбивки;
  od;
  MyPos=1; curw=0;
  while curw<maxw do
    curw=МинКрай(maxw);
    MySect.ColsCount=MyPos;
    prew=AsInteger(MySect.Column(MyPos,ColLeft,""));
    MySect.Column(MyPos,ColWidth,curw-prew);
    for n=1..nn do
       while Int(ExtractWord(SecPos[n],SecWlin[n],"@"))=0 do
           if SecPos[n]=WordsCount(SecWlin[n],"@") or SecPos[n]=0 then --выключить из поиска, если дошли до конца строки
              SecPos[n]=0; Break;
             else         --для остальных (равен) - сдвинуть курсор
              SecPos[n]=SecPos[n]+1;
           fi;
      od;
      if SecPos[n]<>0 then --отключенных пропускаем
         if ОтКраяДоПоз(n,SecPos[n])>curw then --для тех, кто за границей
            --Увеличить число в столбцах
            ii=WordsCount(SecWcol[n],"@");
            tmpI=Int(ExtractWord(SecPos[n],SecWcol[n],"@"));
            tmpI=tmpI+1;
            tmpS=ExtractWords(1,SecPos[n]-1,SecWcol[n],"@");
            tmpS=Раб.Бюджет2005.Объединить(tmpS,str(tmpI),"@");
            tmpS=Раб.Бюджет2005.Объединить(tmpS,ExtractWords(SecPos[n]+1,ii-SecPos[n],SecWcol[n],"@"),"@");
            SecWcol[n]=tmpS;
           else
            if SecPos[n]=WordsCount(SecWlin[n],"@") then --выключить из поиска, если дошли до конца строки
               SecPos[n]=0;
              else         --для остальных (равен) - сдвинуть курсор
               SecPos[n]=SecPos[n]+1;
            fi;
         fi;
      fi;
    od;
    MyPos=MyPos+1;
  od;
  MySect.RowsCount=1;
  MySect.Row(1,RowHeight,0);
end;
--*****

--/****if* Раб.Вспом.Печать2/ШиринаВСтолбцах
--* SYNOPSIS
func ШиринаВСтолбцах(SecN:I;Cfrom:I;Cto:I):I;
--* FUNCTION
--* Определение ширины столбцов печатаемой секции в столбцах бланка ПЕЧАТЬ2
--* INPUTS
--* SecN - номер секции в списке секций
--* Cfrom - с какого столбца
--* Cto - до какого столбца
--* SOURCE
var Res:I;
var i:I;
Res=0;
for i=Cfrom..Cto do
  res=res+Int(ExtractWord(i,SecWcol[SecN],"@"));
od;
^Res;
end;
--*******

--/****f* Раб.Вспом.Печать2/ЛинкПров
--* SYNOPSIS
func ЛинкПров(Obj:Object;R:I;C:I;Rc:I;Cc:I;Iter:I):L;
--* FUNCTION
--* Проверяет по косвенным признакам объединенность ячеек
--* INPUTS
--* Obj - Объект секции
--* R,C - координаты (строка, столбец) первой (верхней левой) ячейки
--* Rс,Cс - координаты (строка, столбец) второй (нижней правой) ячейки
--* * промежуточные ячейки не проверяются, предполагается, что это делает вызывающая функция
--* * нумрация строк повторяющейся секции сквозная
--* Iter - Номер итерации повторяющейся секции (чтобы не выйти за границу секции)
--* SOURCE
var Cont:S;
  if R<>Rc:
     try
       --if AsInteger(Obj.RowsCount)*Iter<Rc then ^False; fi;
       if AsInteger(Obj.RowsCount)<Rc - R + 1 then ^False; fi;
       if Iter = 1: --Оно сбоит на повторяющихся секциях
         if not AsLogical(Obj.Row(Rc,RowVisible,"")) then ^False;     fi;
         if not AsLogical(Obj.Row(Rc,RowPrinted,"")) then ^False;     fi;
       fi;
     except
       ^False;
     end;
  fi;
  if C<>Cc:
     try
       if AsInteger(Obj.ColsCount)<Cc then ^False; fi;
       if not AsLogical(Obj.Column(Cc,ColVisible,"")) then ^False;     fi;
       if not AsLogical(Obj.Column(Cc,ColPrinted,"")) then ^False;     fi;
     except
       ^False;
     end;
  fi;
  Cont=AsString(Obj.Cell(R,C,CellContents,""));
  if Cont<>AsString(Obj.Cell(Rc,Cc,CellContents,"")) then ^False; fi;
  if AsString(Obj.Cell(R,C,CellBorder,""))<>AsString(Obj.Cell(Rc,Cc,CellBorder,"")) then ^False;     fi;
  if Cont<>"":
     if AsString(Obj.Cell(R,C,CellText,""))<>AsString(Obj.Cell(Rc,Cc,CellText,"")) then ^False; fi;
     if AsInteger(Obj.Cell(R,C,CellAlignment,""))<>AsInteger(Obj.Cell(Rc,Cc,CellAlignment,"")) then ^False;     fi;
     if AsInteger(Obj.Cell(R,C,CellFontSize,""))<>AsInteger(Obj.Cell(Rc,Cc,CellFontSize,"")) then ^False;     fi;
     if AsInteger(Obj.Cell(R,C,CellLinesCount,""))<>AsInteger(Obj.Cell(Rc,Cc,CellLinesCount,"")) then ^False;     fi;
  fi;
  if AsString(Obj.Cell(R,C,CellHint,""))<>AsString(Obj.Cell(Rc,Cc,CellHint,"")) then ^False;     fi;
  ^true;
end;
--************

var NormCV[]:L;
--/****f* Раб.Вспом.Печать2/НормализацияСекции
--* SYNOPSIS
func НормализацияСекции(Was:Object):object;
--* FUNCTION
--* Объединяет повторяющуюся секцию в неповторяющуюся (служебная секция бланка ПЕЧАТЬ2)
--* INPUTS
--* Was - Секция, которую надо объединить
--* RESULT
--* Секция TmpT бланка ПЕЧАТЬ2 в которую объединили исходную секцию
--* SOURCE
var res:Object;
var i,ii,r,rr,r1,rl,c,cc,cl:I;
var tmpI:I;
var tmpL:L;
var tmpS,CelT:S;
  if FindObject(selfBln+".TmpT",res) then
     res.colscount=1;
     res.rowscount=1;
     res.Cell(r,c,CellContents,"",True);
     cc=asInteger(Was.ColsCount);
     res.colscount=cc;
     for i = 1 to cc do
         NormCV[i]=AsLogical(Was.Column(i,ColVisible,"")) and AsLogical(Was.Column(i,ColPrinted,""));
         tmpI=AsInteger(Was.Column(i,ColWidth,""));
         res.Column(i,ColWidth,tmpI);
     od;
     ii=AsInteger(Was.framecount);
     rr=AsInteger(Was.RowsCount);
     res.rowscount=ii*rr;
     ShowProgress(ii,"Подготовка строк");
     try
       for i = 1 to ii do
         ProgressPos(i);
         for r1 = 1 to rr do
           r=r1+(i-1)*rr;
           for c = 1 to cc do
              if NormCV[c]:
                 CelT=AsString(Was.Cell(r,c,CellText,""));
                 rl=r;cl=c;
                 if cl<cc:
                    while ЛинкПров(Was,rl,cl,rl,cl+1,i) do
                      cl=cl+1;
                      if cl+1>cc then
                        break;
                      fi;

                    od;
                 fi;
                 if r1<rr:
                    while ЛинкПров(Was,rl,cl,rl+1,cl,i) do
                      rl=rl+1;
                      --r=r1+(i-1)*rr; r1=r-(i-1)*rr
                      if rl-(i-1)*rr+1>rr then
                        break;
                      fi;
                    od;
                 fi;
                 tmpI=AsInteger(Was.Cell(r,c,CellFontStyle,""));
                 res.Cell(r,c,CellFontStyle,tmpI);
                 tmpI=AsInteger(Was.Cell(r,c,CellFontSize,""));
                 res.Cell(r,c,CellFontSize,tmpI);
                 tmpL=AsLogical(Was.Cell(r,c,CellBevel,""));
                 res.Cell(r,c,CellBevel,tmpL);
                 tmpS=AsString(Was.Cell(r,c,CellBorder,""));
                 res.Cell(r,c,CellBorder,tmpS);
                 tmpI=AsInteger(Was.Cell(r,c,CellAlignment,""));
                 res.Cell(r,c,CellAlignment,tmpI);
                 tmpL=AsLogical(Was.Cell(r,c,CellWrap,""));
                 res.Cell(r,c,CellWrap,tmpL);
                 res.Cell(r,c,CellFieldType,cftStaticText);
                 res.Cell(r,c,CellContents,CelT);
                 res.CellLinks(c,r,cl,rl);
              fi;
           od;
         od;
       od;
     finally
       CloseProgress;
     end;
  fi;
  ^res;
end;
--****

var SkipColS[]:I;--Пропускаемые столбцы начало
var SkipColL[]:I;--Пропускаемые столбцы протяженность
var SkipRows[]:I;--Осталось строк пропуска           
--/****if* Раб.Вспом.Печать2/ПровСкип
--* SYNOPSIS
func ПровСкип(From:I):I;
--* FUNCTION
--* Проверяет по кешу слинкованных ячеек на необходимость заполнения
--* INPUTS
--* From - столбец с которого начинаем проверку
--* RESULT
--* Количество пропускаемых столбцов
--* SOURCE
var i,res:I;
  i=SearchInArray(SkipColS,From);
  if i>0 then
     res=SkipColL[i]+1;
     SkipRows[i]=SkipRows[i]-1;
     if SkipRows[i]=0 then
        DeleteFromArray(SkipRows,i);
        DeleteFromArray(SkipColL,i);
        DeleteFromArray(SkipColS,i);
     fi;
   else
    res=0;
  fi;
  ^res;
end;
--***********

--/****if* Раб.Вспом.Печать2/СкипСкип
--* SYNOPSIS
proc СкипСкип;
--* FUNCTION
--* Прокручивает кеш слинкованных ячеек на одну строку
--* SOURCE
var i,ii:I;
ii=LengthofArray(SkipRows);
i=1;
  while i<=ii do
     SkipRows[i]=SkipRows[i]-1;
     if SkipRows[i]=0 then
        DeleteFromArray(SkipRows,i);
        DeleteFromArray(SkipColL,i);
        DeleteFromArray(SkipColS,i);
        ii=ii-1;
       else
        i=i+1;
     fi;
  od;
end;
--*************

proc СкипСкип1(From_:I;To_:I);
var i,j:I;
  --Ищем, если уже есть и все что есть - удаляем (потом само добавится)
  for j=from_ to to_ do
    i=SearchInArray(SkipColS,j);
    if i>0 then
        DeleteFromArray(SkipRows,i);
        DeleteFromArray(SkipColL,i);
        DeleteFromArray(SkipColS,i);
    fi;
  od;
end;

Proc ДобСкип(From:I;Len:I;Rows:I);
var i:I;
  i=LengthOfArray(SkipRows);
  i=i+1;
  SkipColS[i]=From;
  SkipColL[i]=Len;
  SkipRows[i]=Rows;
end;

func ФорматКакВКлеткеN(value:N;form:S):S;
var TmpSect:Object;
var res:S;
if form=",##0.00;;-":
   if value=0: res="-";
     else
      res=Format("%.2n",value);
   fi;
  else
   --Этот код все равно не работает, но пусть будет на всякий случай
   if FindObject(selfBln+".TmpFmt",TmpSect):
      TmpSect.Cell(1,1,CellFormat,form);
      valueN=value;
      res=AsString(TmpSect.Cell(1,1,CellText,""));
   fi;
fi;
^res;

end;

func ВывестиСтроку(SSrc:Object;RFrom:Object;MySect:Object;SecInd:I;Iter:I;HWas:I):I;
var r1,r,rr,rto,rl,c,c1,cc,cto,cl:I;
var rb:I;
var ar:I;
var tmpI:I;
var tmpL:L;
var tmpS,CelT:S;
var ResH:I;
var SpecS,SpecF:S;
var SpecT:I;


--  if FindObject(selfBln+".S1",MySect):
     rb=AsInteger(MySect.RowsCount);
     MySect.RowsCount=rb+1;
     if NextPageNew then
        MySect.Row(rb+1,RowNewPage,True);
        NextPageNew=False;
     fi;
     cc=AsInteger(SSrc.ColsCount);
     rr=AsInteger(SSrc.RowsCount);
     ar=(Iter-1)*rr;
     if HWas=0 then
        ResH=AsInteger(MySect.Row(rb+1,RowTop,""));
       else resH=HWas;
     fi;

      for r1=1 to rr   do
        r=r1+ar;
        rto=r1+rb;--В эту строку мы будем писать
        if rto+10>AsInteger(MySect.RowsCount): MySect.RowsCount=rto+50; fi;--добавляем, если не хватает!!!OPTI

        if AsLogical(SSrc.Row(r1,RowVisible,"")) and AsLogical(SSrc.Row(r1,RowPrinted,"")):
          tmpI=AsInteger(RFrom.Row(r,RowHeight,""));
          if ForceHeight<>-1 then
             tmpI=tmpI+ForceHeight;
             ForceHeight=-1;
          fi;
          MySect.Row(rto,RowHeight,tmpI);
          c=1;
          while c<=cc do
           --Проверка на скип-зону
           c1=ПровСкип(c);
           while c1>0 do
             c=c+c1;
             c1=ПровСкип(c);
           od;
           if c>cc then break; fi;
           if AsLogical(SSrc.Column(c,ColVisible,"")) and AsLogical(SSrc.Column(c,ColPrinted,"")) then
          --for c=1..cc do
             tmpI=AsInteger(SSrc.Cell(r,c,CellFieldType,""));
             if tmpI=cftStaticText then
                SpecT=0;
                CelT=AsString(SSrc.Cell(r,c,CellText,""));
               else
                tmpS=AsString(SSrc.Cell(r,c,CellContents,""));
                if tmpS="Page" then SpecS=Str(Pages); SpecT=cftStaticText; SpecF="";
                  |tmpS="Pages" then SpecS="Pages"; SpecT=cftNumericField; SpecF="";
                  |Match(tmpS,"Capa[*") then SpecS=ФорматКакВКлеткеN(GetVariableN(SelfBln+"."+tmpS),AsString(SSrc.Cell(r,c,CellFormat,""))); SpecT=cftStaticText; SpecF="";
                  |Match(tmpS,"CapaF[*") then SpecS=tmpS; SpecT=cftNumericField; SpecF=AsString(SSrc.Cell(r,c,CellFormat,""));
                  |tmpS="" then
                   SpecT=0;
                   CelT="";
                  |True: 
                   SpecT=0;
                   CelT=AsString(SSrc.Cell(r,c,CellText,""));
                fi;
             fi;
             --if CelT<>"" then
                rl=r;cl=c;
                if cl<cc then
                  while ЛинкПров(SSrc,rl,cl,rl,cl+1,Iter) do
                      cl=cl+1;
                      if cl+1>cc then
                        break;
                      fi;

                  od;
                fi;
                if r1<rr:
                   while ЛинкПров(SSrc,rl,c,rl+1,c,Iter) do
                       rl=rl+1;
                       if rl-(Iter-1)*rr+1>rr then
                         break;
                       fi;

                   od;
                fi;
                if cl>c then
                   СкипСкип1(c,cl);
                fi;
                if rl>r then
                   ДобСкип(c,cl-c,rl-r);
                fi;

                cto=ШиринаВСтолбцах(SecInd,1,c-1)+1;
                if CelT<>"":
                   tmpI=AsInteger(SSrc.Cell(r,c,CellFontStyle,""));
                   MySect.Cell(rto,cto,CellFontStyle,tmpI);
                   tmpI=AsInteger(SSrc.Cell(r,c,CellAlignment,""));
                   MySect.Cell(rto,cto,CellAlignment,tmpI);
                   tmpL=AsLogical(SSrc.Cell(r,c,CellWrap,""));
                   MySect.Cell(rto,cto,CellWrap,tmpL);
                fi;
                tmpI=AsInteger(SSrc.Cell(r,c,CellFontSize,""));
                MySect.Cell(rto,cto,CellFontSize,tmpI);
                tmpL=AsLogical(SSrc.Cell(r,c,CellBevel,""));
                MySect.Cell(rto,cto,CellBevel,tmpL);
                tmpS=AsString(SSrc.Cell(r,c,CellBorder,""));
                MySect.Cell(rto,cto,CellBorder,tmpS);
                if SpecT=0 then
                   MySect.Cell(rto,cto,CellFieldType,cftStaticText);
                   MySect.Cell(rto,cto,CellContents,CelT);
                  else
                   MySect.Cell(rto,cto,CellFieldType,SpecT);
                   MySect.Cell(rto,cto,CellFormat,SpecF);
                   MySect.Cell(rto,cto,CellContents,SpecS);

                fi;

                MySect.CellLinks(cto,rto,cto+ШиринаВСтолбцах(SecInd,c,cl)-1,rl+rb-ar);
            else
             cl=c;
           fi;
           c=cl+1;
          od;
         else
          rb=rb-1; rto=rto-1;
          СкипСкип;
        fi;--if AsLogical(SSrc.Row(r,RowVisible,"")):
      od;
      MySect.RowsCount=rto+1;
      ResH=AsInteger(MySect.Row(rto+1,RowTop,""))-ResH;
      MySect.RowsCount=rto;
      Раб.Вспом.Печать2.NowRow=rto;
--    else
--      ResH=0;
 -- fi;
  ^ResH;
end;

func ВывестиСекцию(vБланк:S;vСекция:S):I;
var SecInd:I;
var SecO:Object;
var MySect:Object;
  SecInd=SearchInArray(SecList,vСекция);
  if FindObject(vБланк+"."+vСекция,SecO) and SecInd<>-1 and FindObject(selfBln+".S1",MySect):
     ^ВывестиСтроку(SecO,SecO,MySect,SecInd,1,0);
    else
     ^0;
  fi;
end;

func ВывестиСекции(vБланк:S;vСекции:S):I;
var Res,n,nn:I;
var SecInd:I;
var SecO:Object;
var MySect:Object;
   res=0;
   if FindObject(selfBln+".S1",MySect):
      nn=WordsCount(vСекции,"@");
      for n=1 to nn do
          SecInd=SearchInArray(SecList,ExtractWord(n,vСекции,"@"));
          if FindObject(vБланк+"."+ExtractWord(n,vСекции,"@"),SecO) and SecInd<>-1:
             res=res+ВывестиСтроку(SecO,SecO,MySect,SecInd,1,0);
          fi;
      od;
   fi;
  ^res;
end;

proc НоваяСтраница;
  NExtPageNew=True;
  Pages=Pages+1;
end;

func СекцииПоТипу(vСекции:S;vТип:I):S;
var i,j,e:I;
var lТип:I;
var lПара,lСекции:S;
var res:S;
  res="";
  for i = 1 .. WordsCount(vСекции,"@") do
    lПара=ExtractWord(i,vСекции,"@");
    lСекции=ExtractWord(1,lПара,"#");
    lТип=Int(ExtractWord(2,lПара,"#"));
    if BitAnd(vТип,lТип)=vТип:
       res=res+"@"+lСекции;
    fi;
  od;
  if res<>"":
     res=substr(res,2,255);
  fi;
  ^res;
end;

var CapaNames[]:S;
func ВзятьЭлТN(vName:S;Iter:I):N;
var t:I;
var Name_:S;
var res:N;
--  t= Pos("[].",vName);
--  if t>0:
--     Name_= Substr(vName,1,t)+str(Iter)+"]."+Substr(vName,t+3,255);
--    else
     Name_=vName+"["+str(Iter)+"]";
--  fi;
  Name_= Раб.Вспом.Печать2.MyBlank+"."+Name_;
  try
    res=GetVariableN(Name_);
  except
    res=0;
  end;
  ^res;
end;

func ВывестиТаблицу(vБланк:S;vШапка:S;vТаблица:S;vПодвал:S;vПодвалAl:S;vОтНачала:I;vАккум:S):I;--Возвращает число страниц
--var Pages:I;
var yy,y,y0,h,r,r0:I;
var hlast,hsub:I;
var n,nn,i,ii:I;
var MySect:Object;
var Norm,SSrc:Object;
var SecInd:I;
var corrH,bckpH:I;
var bckpNP:L;
var Подвал,ПодвалПо,ПодвалПо2:S;
var Шапка,ШапкаПе:S;
--Формат шапки/подвала секция#тип@и т.д.
--Тип: 1-таблица, 2-первая страница, 4-последняя страница, 8-Последняя после выравнивания
--Соответственно первая и далее - 3, кроме первой - 5, первая и последняя - 6, на всех - 7
--!!флаг 4 в шапке не обрабатывается
--vПодвалAl - первой строкой этой секции страница будет подгоняться под полную высоту. если секций несколько - первой строкой первой секции
--vОтНачала - расстояние от начала страницы (если уже есть). -1 для автоопределения, но оно работает только когда таблица начинается с первой страницы.
  clearVariable(Раб.Вспом.печать2.CapaNames);
  clearVariable(Раб.Вспом.печать2.Capa);
  for n=1 .. WordsCount(vАккум,"@") do
    Раб.Вспом.печать2.CapaNames[n]=ExtractWord(n,vАккум,"@");
    if Pos("#",CapaNames[n])>0:
       Раб.Вспом.печать2.CapaNames[n]=ExtractWord(1,Раб.Вспом.печать2.CapaNames[n],"#");
       Раб.Вспом.печать2.Capa[n]=GetVariableN(Раб.Вспом.Печать2.MyBlank+"."+ExtractWord(2,Раб.Вспом.печать2.CapaNames[n],"#"));
     else
       Раб.Вспом.печать2.Capa[n]=0;
    fi;
  od;
  --Вычисляем число фреймов
  if FindObject(vБланк+"."+vТаблица,SSrc) and SecInd<>-1 then
     nn=AsInteger(SSrc.FrameCount);
    else
     nn=0;
     Pages=-1;
  fi;

  Подвал=СекцииПоТипу(vПодвал,1);
  ПодвалПо=СекцииПоТипу(vПодвал,4);
  ПодвалПо2=СекцииПоТипу(vПодвал,8);
  Шапка=СекцииПоТипу(vШапка,1);
  ШапкаПе=СекцииПоТипу(vШапка,2);

  bckpNP=NextPageNew;
  NextPageNew=False;
  Раб.Настр_Печать.ReadCfg("",Раб.Вспом.Печать2.SelfCfg);
  yy=Раб.Настр_Печать.Sheet(XS,YS); --размер рабочей области
  r=Раб.Вспом.Печать2.NowRow;

  hlast=ВывестиСекции(vБланк,ПодвалПо)+ВывестиСекции(vБланк,ПодвалПо2)+ВывестиСекции(vБланк,vПодвалAl);--Высота низа последней страницы
  hsub=ВывестиСекции(vБланк,Подвал)+ВывестиСекции(vБланк,vПодвалAl); --Высота низа каждой страницы

  --Отматываем предыдущую строку
  if FindObject(selfBln+".S1",MySect) then
     if vОтНачала=-1 then
        MySect.RowsCount=r+1;
        y=AsInteger(MySect.Row(r+1,RowTop,""));
       else
        y=vОтНачала;
     fi;
     MySect.RowsCount=r;
    else
     nn=-1;
     Pages=-1;
  fi;
  SecInd=SearchInArray(SecList,vТаблица);
  Norm=НормализацияСекции(SSrc);
  NextPageNew=bckpNP;
  y=y+ВывестиСекции(vБланк,ШапкаПе);
  ShowProgress(nn,"Разбивка на страницы");
  try
    for n=1..nn do
      ProgressPos(n);
      if n>1 then r=Раб.Вспом.Печать2.NowRow; fi;
      bckpH=y;
      y=y+ВывестиСтроку(SSrc,Norm,MySect,SecInd,n,0);
      for i=1 .. LengthofArray(Раб.Вспом.печать2.CapaNames) do
        Раб.Вспом.печать2.Capa[i]=Раб.Вспом.печать2.Capa[i]+ВзятьЭлТN(Раб.Вспом.печать2.CapaNames[i],n);--GetVariableN(Раб.Вспом.Печать2.MyBlank+"."+Раб.Вспом.печать2.CapaNames[i]+"["+str(n)+"]");
      od;
      if y>yy-hsub then--Если вышли за границу - значит новая страница
         --Отматываем предыдущую строку
         MySect.RowsCount=r;
         for i=1 .. LengthofArray(Раб.Вспом.печать2.CapaNames) do
           Раб.Вспом.печать2.Capa[i]=Раб.Вспом.печать2.Capa[i]-ВзятьЭлТN(Раб.Вспом.печать2.CapaNames[i],n);--GetVariableN(Раб.Вспом.Печать2.MyBlank+"."+Раб.Вспом.печать2.CapaNames[i]+"["+str(n)+"]");
         od;

         y=bckpH;
         corrH=yy-hsub-y;
         --прописываем шапки;
         y=y+ВывестиСекции(vБланк,Подвал);
         ForceHeight=corrH;
         y=y+ВывестиСекции(vБланк,vПодвалAl);

         Раб.Вспом.Печать2.НоваяСтраница;
         --Pages=Pages+1;
         y=ВывестиСекции(vБланк,Шапка);
         y=y+ВывестиСтроку(SSrc,Norm,MySect,SecInd,n,0);
         for i=1 .. LengthofArray(CapaNames) do
           Раб.Вспом.печать2.Capa[i]=Capa[i]+ВзятьЭлТN(Раб.Вспом.печать2.CapaNames[i],n);--GetVariableN(Раб.Вспом.Печать2.MyBlank+"."+CapaNames[i]+"["+str(n)+"]");
         od;

      fi;
    od;
    --Таблица закончилась
    bckpH=y;
    --y=y+ВывестиСекции(vБланк,vПодвалPre)+ВывестиСекции(vБланк,vПодвалEach)+ВывестиСекции(vБланк,vПодвалPost)+ВывестиСекции(vБланк,vПодвалAl);
    if y>yy-hlast then --Если вышли за границу - значит новая страница
         --Отматываем предыдущую строку
         MySect.RowsCount=r;
         y=bckpH;
         corrH=yy-hsub-y;
         --прописываем шапки;
         y=ВывестиСекции(vБланк,Подвал);
         ForceHeight=corrH;
         y=y+ВывестиСекции(vБланк,vПодвалAl);

         Раб.Вспом.Печать2.НоваяСтраница;
         --Pages=Pages+1;
         y=ВывестиСекции(vБланк,vШапка);
         y=y+ВывестиСтроку(SSrc,Norm,MySect,SecInd,nn,0);
         --конец таблицы
    fi;
    corrH=yy-hlast-y;
    y=y+ВывестиСекции(vБланк,ПодвалПо);
    ForceHeight=corrH;
    y=y+ВывестиСекции(vБланк,vПодвалAl);
    y=y+ВывестиСекции(vБланк,ПодвалПо2);
  finally
    CloseProgress;
  end;
  ^Pages;
end;


Proc ПередатьСекции(vБланк:S;vСекции:S);--на входе - список чекций через @
var SSrc:Object;
var n,nn,i,ii,w:integer;
var SWidth,sCol:S;
  nn=WordsCount(vСекции,"@");
  for n=1..nn do--для всех переданных секций
    --подгружаем секцию в объект
    if FindObject(vБланк+"."+ExtractWord(n,vСекции,"@"),SSrc):
       ii=AsInteger(SSrc.ColsCount);
       SWidth="";SCol="";
       --по всем столбцам
       for i=1..ii do
         if AsLogical(SSrc.Column(i,ColVisible,"")) and AsLogical(SSrc.Column(i,ColPrinted,"")):
            --собираем ширины в псевдомассив
            w=AsInteger(SSrc.Column(i,ColWidth,""));
            SCol=Раб.Бюджет2005.Объединить(SCol,"1","@");
            SWidth=Раб.Бюджет2005.Объединить(SWidth,str(w),"@");
           else
            SCol=Раб.Бюджет2005.Объединить(SCol,"0","@");
            SWidth=Раб.Бюджет2005.Объединить(SWidth,"0","@");
          fi;
       od;
       InsertInArray(SecList,n,ExtractWord(n,vСекции,"@"));
       InsertInArray(SecWlin,n,SWidth);
       InsertInArray(SecWcol,n,SCol);
       InsertInArray(SecPos,n,ii);-- сначала пишем последний столбец, чтобы считалась макс. ширина
     else
       Message("Не найдена секция "+ExtractWord(n,vСекции,"@"),mtError);
       Break;
    fi;
  od;
end;

--func ВывестиТаблицу(vБланк:S;vШапкаPre:S;vШапкаFirst:S;vШапкаPost:S;vТаблица:S;vПодвалPre:S;vПодвалEach:S;vПодвалPost:S;vПодвалAl:S;vОтНачала:I):I;--Возвращает число страниц
----Тут будет заглушка для совместимсоти...
----Первая страница vШапкаPre:S;vШапкаFirst:S;vШапкаPost:S;vТаблица:S;vПодвалEach:S;vПодвалAl
----Каждая страница vШапкаPre:S;vШапкаPost:S;vТаблица:S;vПодвалEach:S;vПодвалAl
----Последняя страница vШапкаPre:S;vШапкаPost:S;vТаблица:S;vПодвалPre:S;vПодвалEach:S;vПодвалPost:SvПодвалAl
--^0;
--end;

Proc Инит;
  ClearBlank(SelfBln,True);
  OpenBlank(SelfBln,False);
end;

Proc Инициализация(vБланк:S;vСекции:S);
var MySect_:Object;
var CPath,Ctmp:S;
--var tmpL:L
  CTmp=Раб.Вспом.Печать2.SelfCfg;
  ClearBlank(SelfBln,True);
  OpenBlank(SelfBln,False);
  OpenBlank(vБланк,False);--Возвращаем фокус, чтобы не мерцать

  Раб.Вспом.Печать2.MyBlank=vБланк;
  Раб.Вспом.Печать2.SelfCfg=CTmp;
  Раб.Вспом.Печать2.NextPageNew=False;
  Раб.Вспом.Печать2.ForceHeight=-1;
  Раб.Вспом.Печать2.Pages=1;
  Раб.Вспом.Печать2.ПЕРЕДАТЬСЕКЦИИ(vБланк,vСекции);
  Раб.Вспом.Печать2.ПодготовкаСекции;
  if SelfCfg<>"" then
     CPath=Раб.Бюджет2005.Контроль2Слэш(PlanVar("INI")+"\");
     if not ExistFile(CPath+SelfCfg):
        Раб.Настр_Печать.CreateCfg("",SelfCfg);
     fi;
     CopyFile(CPath+SelfCfg,CPath+SelfCfg_);
  fi;


end;

Proc btnPrint_OnClick(Sender: String);
  Раб.Настр_Печать.Prn("Раб.Вспом.Печать2","",Раб.Вспом.Печать2.SelfCfg,"",1);
end;


Proc OnClose(Destroy: Logical);
var CPath:S;
  if SelfCfg<>"":
     CPath=Раб.Бюджет2005.Контроль2Слэш(PlanVar("INI")+"\");
     CopyFile(CPath+SelfCfg_,CPath+SelfCfg);
  fi;
end;


Конец
