瞎子摸象--年结
由于我对财务一窍不通,如果本文有贻笑大方的地方,还望各位AX财务高手不吝赐教。
业务背景
到年底了,也该清清财务账了,年结说复杂可以非常复杂,说简单也很简单,本文只涉及最简单的部分。
会计科目按其类型分类可以分为资产,负债,所有者权益,成本和损益类(2007年新的会计制度增加了 共同类,我暂时不知道这类科目是做什么用的,对于不懂的东西就不乱写了,等搞懂了再说)。
在年结的时候,逻辑其实很简单:
1.损益类科目的余额清零,余额转到本年利润科目,当年还有传说中的月结,什么表结法和账结法之类,国内习惯用账结法,国外的软件一般采用表结法,所谓的表结法就是月末什么都不做,账结法在每个月的月底把损益类科目的余额转到本年利润科目,其实在本质上是一回事。
2.其余类型的科目,资产,负债,所有者权益,成本把年底的余额转到下一年做为下一年的年初额。
综上所述,自然地把会计科目分为两类,损益类把余额放到本年利润,其余类型的科目余额直接转为自己的期初。
操作步骤:
下面介绍一下在AX里应该怎么做年结的动作:
1.设置总账参数
操作路径:
总账->设置->参数设置
选择 在结转期间删除年末结转交易记录 和 必须填写凭证号。这里暂时不介绍这几个参数是做什么用的,本文后面在介绍代码的时候会一一介绍这几个参数的作用。国内实施的时候一般是这么选择的,所以一般情况下这么选就OK了。
2.运行年结
当然年结是个很复杂的过程,要处理一些账面上的东西,这里只是简单的介绍在AX里的操作步骤而已,在操作这个之前先做好准备工作。当然AX的年结动作相当简单,并且是可以反复运行的,所以也没什么大碍。
总账->期间->会计年度关帐->期初交易记录
结束日期 选择 会计期间的最后一天,如果不是最后一天,系统会提示的。资产负债科目选择 结算->未结算,年结的结转科目 选择 本年利润,输入一个凭证号。如果想在完成后显示生成的交易,则选中 打印创建的交易记录。
选择完成后点击确定即可。
代码分析
接下来我们看一看,AX处理年结的代码。
由于业务本身的逻辑很简单,AX处理年结的代码也极其简单,只用了一个继承自RunbaseBatch的类LedgerTransferOpening来处理所有的事情。先介绍一下AX中跟年结有关的基本概念:
1.科目类型
会计科目对应的表LedgerTable的字段AccountPlType来表示科目类型,正如前面业务背景部分提到的,科目类型在年结的时候分成两种情况来处理,AX在实现的时候必然也要考虑这一点。AccountPlType的类型是枚举类型LedgerAccountType,该枚举类型共有如下几个值:
AccountOperations 损益
AccountRevenue 收入
AccountCost 成本
AccountStatus 所有者权益
AccountActive 资产
AccountLiable 负债
Common 共同
当然后面还有标题,页面标题,还有合计 等,这些科目由于并不发生交易,所以在年结的时候不会处理它们。在前面介绍会计科目类型的时候,并没有 收入 类型的科目,所以这个应该也不需要处理。对于损益类科目,前面介绍的,这些科目的余额应该过账到 本年利润。剩下的几个 成本,所有者权益,资产和负债应该直接转到下一年的年初。
2.期间代码
为了区别年结时生成的交易和正常发生的交易,AX用了一个枚举类型PeriodCode来不同的交易类型。这个枚举类型有如下值:
Opening 开始日期
这个翻译有些问题,不管怎么样翻译成开始日期总还是有些别扭,无所谓了,我们只要知道在什么情况下会生成这种类型的交易就可以了。前面介绍业务背景的时候提到过,要将余额转到下一年,这势必要生成一个期初交易凭证,OK,这个期初交易凭证的类型就是Opening的,只有在年结的时候才会生成这种类型的交易。
Regular 正常
这个就不用解释了,在年中生成的所有的交易,类型都是 正常 的。
Closing 结束日期
我们前面介绍参数设定的时候,有一个参数我们是没有选择的--在结转期间创建期末交易记录。这个参数在国内一般不使用。它会将本年的余额借贷相反冲掉,如果我们没有选择那个选项,当然也就不会有Closing类型的交易出现了。
3.转账方法
前面介绍年结的操作步骤的时候,其中有一个参数 转账方法 资产负债类科目,我们选择了 结算->未结算,对应一个枚举类型OpeningMethod,有两个选项:
Reset 重置
ClosingToOpening 结算->未结算
这两个选项怎么解释那?通过看代码,我们可以看出来端倪:
Reset实际上就是要把自己的余额清零,然后把余额转移到其他科目上去,怎么算清零?很明显,对于某个科目,如果不把这个科目的余额结转到自己身上,而是转移到其他科目上,这就是清零了,因为在这个科目本身上没有生成Opening类型的交易,在下一年查询该科目的余额时,就查不到该科目上一年度的余额了,这个恰好就是损益类科目的逻辑。
ClosingToOpening的意思是把余额还转移到自己身上,对于非损益类科目,按照前面说的逻辑,应该选择这个选项。
对于损益类科目,AX是没有提供选项的,也就是说它都会过账到 本年利润科目。对于资产类科目,它提供了一个选择,可以把余额转到自己身上,也可以转到本年利润科目。但是很明显,我们一般也不会这么选择。
4.期初科目
会计科目表->常规(页签)有一个 期初科目的选项。
这个选项实际上提供了一种灵活性,虽然这种灵活性在大多数情况下并不使用。
我们在上一节介绍了Reset和ClosingToOpening,也介绍了它的使用方法,Reset把余额转移到其他科目,ClosingToOpening把余额转移到自己身上。这种分类是按照科目类型来的,损益类采用Reset,资产负债所有者权益成本类采用ClosingToOpening,如果某个科目想单独定义将余额过账到某个科目的话,就采用这个期初科目的选项。
OK,看代码吧。主要是LedgerTransferOpening的run方法:
需要注意的是它把AX的科目分成了两类,小于或等于成本类科目,根据之前的介绍,包括 损益,收入和成本。但是我们成本类科目的余额是要过账到自己身上的,而这里把它等同于损益类科目了,也就是说它把成本类科目的余额转移到本年利润了。
有三个方法可以更正:
1.把成本类科目的类型改成资产类。成本类科目本来就是核算在制品的,本质上属于存货科目,所以改成资产类也无可厚非;
2.把成本类科目的期初科目都设置成自己,这样不管是Reset还是ClosingToOpening都转移到自己身上了;
3.该代码。这个有修改的代码可能就比较多了,AX的逻辑把损益,收入和成本都看成ProfitLoss科目了,所以可能要伤筋动骨。
综上所述,第一种方式应该是最合理的,我感觉AX的科目类型成本跟我们的会计科目类型 成本 应该是不同的。
从代码上看,如果没有选择 创建期末交易记录,1和2的代码路径是完全一样的,只是在创建期末交易记录的时候有所差异,国内一般不会创建期末交易记录,所以1和2两种方式也就没什么不同了,当然这只是一个财务门外汉的个人之见,不见得合理。
OK,就说写这么多了,更详细的内容,看一下run方法就可以了。