Расчёт бухгалтерских остатков

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Расчёт бухгалтерских остатков

Сообщение zna »

Доброй пятницы, уважаемые. Подскажите, кто в курсе- есть ли в системе функциональность для быстрого расчёта бух. остатков? По аналогии с объектом Store, рассчитывающим складские остатки. Не хочется с нуля всё это писать..
Задача такая- при формировании ордеров производственной накладной (НВС, АСС и т.п.) проверять остатки на 20-м и 23-м счетах.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Расчёт бухгалтерских остатков

Сообщение edward_K »

Код: Выделить всё

  //определяем дату сальдо
var CalcSaldo : word;
  if wGetTune('DOC.VISIBLE')=0
  { CalcSaldo :=  cgCS_NoDesGr //+cgCS_MakeZero
  }
  else
  { CalcSaldo :=0//  cgCS_MakeZero
  }
  MyPlansNo:=coGetTune('FIN.USER.CPLANSSCH')

  dt_ost:=dte //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))
  if (Calc_NewSaldo( CalcSaldo // способ расчета сальдо - с учетом групп дексрипторов или без оного (0)
          , MyPlansNo // ссылка на план счетов
          , coSaldoNM // индетификатор таблицы для расчета
          ,ww_sch // счет с кодом плана счетов
         , ww_sub// субсчет
          , filtr_cPodr  //ссылка на подразделение в сальдо
          ,0 //kau1
          ,0 //kau2
          ,0 //kau3
          ,0 //kau4
          ,0 //kau5
          ,0 //kau6
          ,dt_ost1 // дата с которой начинать сбор сальдо - то есть берется сальдо на эту дату и к ней добавляются обороты
         ,dt_ost
  ) )
  { rereadrecord(#saldonm)
    StopVisual('',0)
    StartNewVisual(vtIndicatorVisual,vfTimer+vfBreak,'Идет печать...', recordsintable(#saldonm)*2);
    mylog('================= Группируем данные ====================')

    iNextVisual ('Группируем данные')
    _LOOP fullcache SALDONM
Ну и можно пользоваться функциями из ТХО. Для патформул тоже есть функция. Я в опыт положил фейс целиком "Бухгалтерский калькулятор"
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение zna »

Ок, спасибо, Эдвард. По параметрам CalcSaldo, coSaldoNM, filtr_cPodr можно комментарии? Так понимаю, что какая- то таблица должна заполниться?


Да, всё понятно теперь :smile:
Последний раз редактировалось zna 19 авг 2016, 13:32, всего редактировалось 1 раз.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Расчёт бухгалтерских остатков

Сообщение edward_K »

Код: Выделить всё

// Перерасчет сальдо на начало месяца - для вызова из Vip
function Calc_NewSaldo(     ModeCulc : word;
                              cPlans : comp;
                            coPutTab : integer;
                                 Sch : tSchet3;
                                 Sub : tSubSch;
                                Podr : tNRec;
  Kau1, Kau2, Kau3, Kau4, Kau5, Kau6 : tKodKau;
                         dStart,dEnd : Date) : boolean;
в куске кода я специально захватил, чтобы видели что с такими параметрами расчет идет в SaldoNM. Остальное - это соовт. поля из сальдо
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение Den »

при формировании ордеров производственной накладной (НВС, АСС и т.п.) проверять остатки на 20-м и 23-м счетах
а рассчитывать зачем ,если проверить только нужно ?
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение zna »

Den писал(а):
при формировании ордеров производственной накладной (НВС, АСС и т.п.) проверять остатки на 20-м и 23-м счетах
а рассчитывать зачем ,если проверить только нужно ?
А как проверить остатки на произвольную дату на бух.счёте без расчёта? К сальдо на 1 число месяца добавляем обороты этого месяца до данной даты - это и есть остатки
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение Den »

Ну если так, то да, нужно считать логический остаток от даты бух контора (т.е. подразумевается что в этой точки отсчета лежат правильные остатки) + все обороты от сальдо по нужной даты посредством Calc_NewSaldo через SaldoNm. А что этим добиваетесь то ? Вроде все ли складские движения отражены по регистру учета ?
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение zna »

Den писал(а):... А что этим добиваетесь то ? Вроде все ли складские движения отражены по регистру учета ?
Да, типа того. Бухгалтера хотят доп.контроль по накладным.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение Den »

Для этого, логичнее сверять отчетность из складского учета с оборотно-сальдовыми по счету учета движения материалов по итогам месяца например.
А вешать на каждую проводимую операцию в складе еще такой чек, не знаю..сомнительно как то. Ну или если складское движение небольшое совсем то может и оправдано
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение zna »

Вот как раз они и не хотят откладывать сверку БУ и КОУ на конец месяца. Зачем копить ошибки? Даже странно, что стандартом такой чек не предусмотрен.
Мария_Ф
Местный житель
Сообщения: 1044
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Иркутская область

Re: Расчёт бухгалтерских остатков

Сообщение Мария_Ф »

А как можно проверку такую предусмотреть, если каждое предприятие по-своему работает? В бухгалтерию может только в конце месяца/начале следующего месяца документы попадут.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение zna »

Да, Мария, по- разному- в части субсчетов/ аналитики, но некоторые общие правила есть. Учёт МЦ на складе- это 10 счёт, на производство- 20 и 23. Когда бухгалтер привязывает ТХО к акту на списание МЦ в производстве, к примеру, он не контролирует остатки 20/23 бухсчёта, которые получатся в результате проведения ТХО. Получать аналитический отчёт после каждой накладной бухгалтера не хотят- долго. Краснота на счёте обнаружится позже, когда они месяц в целом будут смотреть.
Поэтому есть мысль сделать так: бухгалтер привязывает ТХО и открывается browse, в котором отражаются обороты и остатки по счёту по данной ТХО. Пока только для просмотра, а позже можно какие- нить действия сделать..
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение zna »

Получилось в первом варианте:Изображение

Код: Выделить всё

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.     
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Re: Расчёт бухгалтерских остатков

Сообщение Max_Fin »

Если на преприятии используется платформа Oracle или MS SQL, то лучше использовать для расчета остатков БУ функциональность DSQL.
Жду выхода Вселенная 2.12!
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Расчёт бухгалтерских остатков

Сообщение Алексей »

Max_Fin писал(а):Если на преприятии используется платформа Oracle или MS SQL, то лучше использовать для расчета остатков БУ функциональность DSQL.
А пример можно, для MS SQL.
Ответить