Код: Выделить всё
interface CheckOborot 'Обороты и остатки по счётам';
Show at (1,1,200,40);
 table struct tmain       //Таблица
 (
    cmc  : comp
   ,cpodr: comp
   ,mc   : string
   ,kod  : string
   ,edizm: string
   ,kolsopr: double //Количество из накладной
   ,sumsopr: double //Сумма из накладной
   ,schet: string
   ,subsch:string
   ,podr : string
   ,kauall: string
   ,ckauks1: comp
   ,ckauks2: comp
   ,ckauks3: comp
   ,sumbeg : double  //Cумма на начало
   ,kolbeg: double //Количество на начало
   ,sumobr: double  //Сумма проводки
   ,kolobr: double  //Количество проводки
   ,sumend: double  //Сумма на конец
   ,kolend: double //Количество на конец
   ,nrec: comp
 ) with index ( i1 = mc, i2 = cmc
              );
create view
var
     wVidSopr : longint; //параметр
     stmt,stmt_str,frmHandle,i : longint ;
     atrkod, cCotv, cNazn, cMySopr: comp;
   as select *
    from tmain
        ,katsopr, soprhoz, spsopr, pick, katpodr, katmc, kated, oborot, saldonm
order oMc          by tmain.mc
;
Parameters wVidSopr, cMySopr;
Panel Panel_ ;
  Table tmain;
  Screen scMain_
  show at (, , , 2);
  Buttons
   cmRaspr,,,;
   cmCalc,,,;
   cmGo,,,;
<<
        <.1..>  <.2..> <.3..>
>>
  end;
  browse bmnpl (,,sci178InsPM) ;
  show at (, 3, , );
  fields
      tmain.Mc       'Матценность','сортировка' : [30], protect;
      tmain.kod      'Код Мц' : [10], protect;
      tmain.edizm    'Единица','измерения','учётная' :[8], protect;
      tmain.kolsopr  'Количество','по накладной'  :[10.4] , noprotect;
      tmain.sumsopr  'Сумма', 'по накладной':[10.4], protect;
      tmain.schet    'Счёт'   : [5], protect;
      tmain.subsch   'Субсчёт'   : [5], protect;
      tmain.podr     'Подразделение'  : [20], protect;
      tmain.kauall   'КАУ'   : [50], protect;
      tmain.sumbeg    'Сумма','на начало'  :[10.4] , protect;
      tmain.kolbeg    'Количество', 'на начало':[10.4], protect;
      tmain.sumobr    'Сумма', 'проводки' :[5], protect;
      tmain.kolobr   'Количество', 'проводки' :[5], protect;
      tmain.sumend    'Сумма', 'на конец'  :[10.4] , noprotect;
      tmain.kolend    'Количество', 'на конец':[10.4], protect;
//      string(tmain.nrec)  'Nrec' :[12], protect;
  end;
end;
HandleEvent
CmInit:{     if getfirst katsopr where((cMySopr == katsopr.nrec)) <> tsOk {message('Not katsopr..'); exit;}
             var sChetk, MyPlansNo: string;
             sChetk:= '823';
             mtclear(#tmain,fmNormal);
             stmt := sqlAllocStmt;
             sqlbindparam(stmt,1,wVidSopr);
             sqlbindparam(stmt,2,sChetk);
             sqlbindparam(stmt,3,cMySopr);
             sqlAddStr(stmt_str, ' select spsopr.cmcusl as cmc, katsopr.cpodrfrom as cpodr,');
    		     sqlAddStr(stmt_str, '      katmc.name as mc      ');
    		     sqlAddStr(stmt_str, '     ,katmc.barkod as kod    ');
    		     sqlAddStr(stmt_str, '     ,case when spsopr.cotped = #comp(0) then kated.name else katotped.name end as edizm    ');
    		     sqlAddStr(stmt_str, '     ,case when spsopr.cotped = #comp(0) then spsopr.kolfact else spsopr.kolfact * katotped.koef end as kolsopr  ');
    		     sqlAddStr(stmt_str, '     ,spsopr.kolfact * spsopr.rprice as sumsopr  ');
  		       sqlAddStr(stmt_str, '     ,oborot.schetk as schet, oborot.subschk as subsch, katpodr.name as podr ');
  		       sqlAddStr(stmt_str, '     ,coalesce(katmc_kau1.name, '''') || ''\'' || coalesce(spkau.name, '''') || ''\'' || coalesce(izdel.name, '''') as kauall ');
  		       sqlAddStr(stmt_str, '     ,oborot.kauks[1] as ckauks1, oborot.kauks[2] as ckauks2, oborot.kauks[3] as ckauks3 ');
  		       sqlAddStr(stmt_str, '     ,0 as sumbeg, 0 as kolbeg, coalesce(oborot.sumob,0) as sumobr, coalesce(oborot.kol, 0) as kolobr, 0 as sumend, 0 as kolend, izdel.nrec as crec ');
    		     sqlAddStr(stmt_str, ' from spsopr inner join katmc on spsopr.cmcusl = katmc.nrec ');
    		     sqlAddStr(stmt_str, '      left join katotped on spsopr.cmcusl = katotped.cmcusl and 1 = katotped.prmc and spsopr.cotped = katotped.nrec ');
		         sqlAddStr(stmt_str, '      inner join kated on katmc.ced = kated.nrec ');
		         sqlAddStr(stmt_str, '      inner join katsopr on spsopr.csopr = katsopr.nrec ');
		         sqlAddStr(stmt_str, '      inner join katpodr on katsopr.cpodrfrom = katpodr.nrec ');
		         sqlAddStr(stmt_str, '      left join soprhoz  on katsopr.nrec = soprhoz.csoprdoc and soprhoz.tipdoc = ?');
		         sqlAddStr(stmt_str, '      left join oborot   on spsopr.csopr = oborot.csoprdoc AND soprhoz.nrec = oborot.csoprhoz and spsopr.cmcusl = oborot.kauks[1] ');
		         sqlAddStr(stmt_str, '            and oborot.schetk = ? ');
		         sqlAddStr(stmt_str, '      left join katmc katmc_kau1 on oborot.kauks[1] = katmc_kau1.nrec ');
		         sqlAddStr(stmt_str, '      left join spkau on oborot.kauks[2] = spkau.nrec');
		         sqlAddStr(stmt_str, '      left join katmc izdel on oborot.kauks[3] = izdel.nrec ');
		         sqlAddStr(stmt_str, '      ');
    		     sqlAddStr(stmt_str, ' where spsopr.prmc = 1 and spsopr.csopr = ? ');
		         sqlAddStr(stmt_str, '      order by katmc.name ');
 			       sqlPrepare(stmt,stmt_str);
			       sqlExecute(stmt);
 			if (sqlFetchInto(stmt,#tmain) != tsOk)
			      Message('not tsOk select (');
			sqlFreeStmt(stmt);
			if RecordsInTable(#tmain)=0
			 {
			  Message('Не нашлось спецификации в накладной !');
			  exit;
			 }
      //определяем дату сальдо
      MyPlansNo:=coGetTune('FIN.USER.CPLANSSCH')
      var dt_ost,dt_ost1: date;
      dt_ost:=katsopr.dsopr; //sub_day(dtb,1)
      dt_ost1:=dt_ost;
      if dt_ost1>dgettune('DAT_M_OT')
        dt_ost1:= dgettune('DAT_M_OT');
      if day(dt_ost1)<>1
        dt_ost1:=date(1,month(dt_ost1),year(dt_ost1))
        delete all saldonm;
      if getfirst tmain = tsOk {}
      if (Calc_NewSaldo( 0//CalcSaldo // способ расчета сальдо - с учетом групп дексрипторов или без оного (0)
              , MyPlansNo // ссылка на план счетов
              , coSaldoNM // индетификатор таблицы для расчета
              ,sChetk // счет с кодом плана счетов   -823
             , '011'// субсчет
              , katsopr.cpodrfrom  //ссылка на подразделение в сальдо
              ,0 //kau1- Мц
              ,tmain.ckauks2 //kau2- Статьи затрат
              ,tmain.ckauks3 //kau3- изделия собственного производства
              ,0 //kau4
              ,0 //kau5
              ,0 //kau6
              ,dt_ost1 // дата с которой начинать сбор сальдо - то есть берется сальдо на эту дату и к ней добавляются обороты
             ,dt_ost
      ) )
       rereadrecord(#saldonm)
       if getfirst saldonm = tsOk
         {
           _loop saldonm ordered by index SALDONM01
             {
               if getfirst tmain where((saldonm.kauos[1] == tmain.cmc)) = tsOk
                 {
                   if saldonm.viob = 1 {if (update current tmain set tmain.sumend := saldonm.sums, tmain.kolend := saldonm.kol,    //Остаток дебетовый
                                         tmain.sumbeg := saldonm.sums + tmain.sumobr, tmain.kolbeg := saldonm.kol + tmain.kolobr) = tsOk {}}
                   else {if (update current tmain set tmain.sumend := -saldonm.sums, tmain.kolend := -saldonm.kol,
                                         tmain.sumbeg := -saldonm.sums + tmain.sumobr, tmain.kolbeg := -saldonm.kol + tmain.kolobr) = tsOk {}}
                 }
             }
         }
       RunInterface('F_Saldo::Saldonm');
       SetOrder(tioMc);
       reScanPanel(#tmain);
   }
cmCancel:
{
  CloseInterface(cmDone);
  mtChangeRefCount( #tmain,  -1 );
}
end;
end.