资源描述
企业成本核算系列二:批次进价核算理解
批次进价核算,在时空可以有三种核算方法:
一、由批号代替批次,取得一个绝对的价格(sphwph)
在操作时,当确定商品批号后,同时确定了商品的成本价;
优点:操作简单,系统负担小,批号数量等于库存数量(不能绝对保证);
缺点:会出现相同批号的不同采购,导致批号价格可能会被平均;批号本身管理带有不严密性,导致成本价丢失;
二、在销售时由人确定一个绝对批次进价,取这个批次价格(sp_pici)
这时可以忽略批次采购数量,仅仅使用批次价格,而且,价格由操作人员确定;
优点:可以根据一个曾发生过的进价,决定本次销售的商品成本;
缺点:可能一个进价被多次使用,批次序列不管理数量,与库存无关;
三、按采购顺序,匹配批次核算(天时力称呼为“个别计价”,时空系统称呼为“先进先出”)
采用这个方法,在商品采购时登记一个序列,在商品销售时,根据销售数量在采购序列中进行勾销,根据勾销数量计算销售成本,同时,确保采购数量不能被重复勾销;
优点:在销售时,可以由程序自动匹配批次,不需要人的交互,而且,每一个具体单品的价格,通常都不会重复使用,在正常销售环境,销售成本计算接近实际采购成本;
缺点:系统效率会有所降低,如果对于批次数量要求较高的话,可能配合的交互程序非常复杂;从批次序列中统计出的数量,从原理上是无法与库存数量绝对匹配;
在系统中,用第一种和第二种,都要求商品的核算方法为:“个别计价”,但由系统总控来决定当前系统选择哪个“个别计价”方式;总控设置:“由商品批次决定个别计价”,如果为“是”,表示采用第二种方式,如果为“否”,表示采用第一种方式,缺省为“否”。
如果用户在需求中强调,成本要在入库(采购)过程中逐一取得成本(可能用户会称呼为:先进先出、批次进价、个别计价等),我们建议应该采用入库序列记录勾销的方式取实现(第三种)。
设置方法,将用户需要按这个核算方式核算的商品集合,在时空系统中设为:“先进先出”(核算方法的名称,是一个汉字串,带有一定自然语言的含义,但不要就名称而交流,一个名称对应的逻辑,才是我们真正的解决方案对象)
序列勾销库存核算的系统逻辑:
在时空系统,需要按入库序列勾销出库,并在入库序列中计算出库成本价的核算方法,称呼为:先进先出、后进先出、高进先出、低进先出;
这些方法的基本逻辑是一样的,都是在商品入库时,记录其入库序列,在出库时,从入库序列中勾销掉已经使用过的数量;各种称呼的差别,在于勾销是的顺序方式,其他逻辑完全一样;
以“先进先出”模拟:
如果商品设为“先进先出”,在商品发生采购、外调入库(当然,也可以定义其他业务行为)等行为时,系统自动登记rukuxul,记录了每次入库的数量和价格;当商品出库时(销售、外调出或其他的一些认为应该核算的时机),系统会逐一商品在入库序列中进行勾销,用勾销掉的集合,计算当前出库商品的确切成本;
对于非进销的一些业务环节,系统通常不做任何处理(也不建议在现场开发时做更多的维护序列的处理。)
这里的逻辑,有两个表进行支撑:
rukuxul
入库序列
字段名
中文名称
字段类型
字段宽度
字段精度
字段说明
plh
排列号
字符
11
0
主键
在产生新记录时,逐行生成一个唯一的ID,也可以理解为入库批次的概念;
spid
商品内码
字符
11
0
索引
djbh
单据编号
字符
15
0
dj_sn
明细序号
整数
0
0
可以定位到原始票据中的一条绝对记录;
hw
货位
字符
11
0
pihao
批号
字符
15
0
rq
日期
字符
10
0
rkshl
入库数量
实数
14
2
在生成记录时的入库数量,这个值应该忠实记录原始的入库数量,不会由于出库行为而改变。
记录的删除条件为:入库数量=出库数量;
rkdj
入库单价
实数
14
2
用于核算出库成本的入库(采购)价格;
chkshl
出库数量
实数
14
2
当有出库行为发生时,这个数量在不断的累加,直到与入库数量相等时,本记录删除;
在出库数量变动的任何时候,都要登记chukuxul,记录出库数量的变化过程;
chukuxul
出库勾销序列
字段名
中文名称
字段类型
字段宽度
字段精度
字段说明
plh
排列号
字符
11
0
主键
在本记录产生时每条记录获得的唯一定位值。这个值也可以作为出库序列的排序,因为其生成过程是增长型的;
spid
商品内码
字符
11
0
索引
rkplh
入库排列号
字符
11
0
抄录rukuxul的plh,因为rukuxul,在入库数量=出库数量时,记录被删除,如果有一些后续业务,需要将出库行为取消时,这个字段可以用来再造rukuxul的记录;
Rk_dj_sn
入库序号
整数
0
0
入库单的dj_sn,是抄袭rukuxul的值,用于回朔事件时使用;
dj_sn
明细序号
整数
0
0
当前出库单据的定位标志,用于检索时绝对定位某行出库票据的勾销集合;
hw
货位
字符
11
0
从rukuxul中提取出来的hw,如果勾销时超出rukuxul数据集合,这个hw应该记录出库明细的hw。
pihao
批号
字符
15
0
rukuxul中的批号,直接抄过来,可能不是出库业务指定的批号;但由于现在是按批号分摊入库数量,原则上不会出现这里的pihao与出库票据的pihao不一致;
rkkrq
入库日期
字符
10
0
xskrq
销售日期
字符
10
0
rkdjbh
入库单据编号
字符
15
0
xsdjbh
销售单据编号
字符
15
0
rkshl
入库数量
实数
14
2
这是一个历史记载。由于chukuxul将rukuxul的每一条记录可能都拆散为多条,所以,在chukuxul记录入库数量意义不大。但因为rukuxul在完成分摊数量后会将原始记录删除,所以,从查询角度,应该能够具备提取原始入库数量的能力,这是一个方面,另一个方面,在一些特殊情况,rukuxul记录是需要再造的,必须容易获得数据源;
rkdj
入库单价
实数
14
2
chkshl
出库数量
实数
14
2
各种业务行为分析
(红色文字,表示可能出现采购序列库存与库房结存之间产生差异;)
(蓝色部分,表示有些功能必须在现场听用户需求和作业方式来确定如何开发,无法在时空公司事先进行开发。不进行任何开发,应该也不会给系统带来很大的隐患;)
1、 采购:数量大于零的记录,登记入库序列;(由于时空软件允许采购时填写负的数量,而负数量不会登记rukuxul,所以,可能导致两者库存不一致)
2、 采购单冲红:查找原始采购记录,如果记录还在,就试图去减少入库序列(不是勾销),对于已经被勾销的数量,是不能回朔的。当入库数量减少到0的时候,当前入库序列记录删除;(由于存在冲红前被销售勾销的数量,所以,可能导致两者库存不一致)
3、 采购退补价:如果能定位到入库的具体品种,可以考虑在存储逻辑上将差价补充到原采购入库序列记录上。不过,可能需要手工挑选的交互操作,并且补价的正确性要交给操作员,补价在入库序列中,是没有数据痕迹的,换句话,补价过程将是不可逆的,如果出现问题,必须交给手工处理程序;(退补价如果要影响到入库序列单价,必须要在进货退补价单单独写一个小过程,系统缺省不处理,因为入库序列是按数量判断的,所以,单纯价格不能进入序列,这个过程框架在时空输出的过程代码中,目前处于屏蔽状态,需要时可以打开;)
4、 采购退补价冲红:如果采购退补价已经影响过入库序列,那对于采购退补价单冲红,一定要考虑冲红逻辑,一般情况,数据应该是不可逆的,只有非常必要的环节,才需要将差价部分逆算回来,但风险比较大。
5、 采购退出:如果能定位到原始的购进记录,可以进行数量“减少”(不是勾销,不登记出库序列),但对于已经被销售勾销的记录或数量,是不能回朔的。当数量减少到0的时候,本行序列记录也要删除;(同采购冲红。可能导致两者库存不一致)。
6、 采购退出冲红:这要做新的采购处理,入库单号,应该是对应的退货单号。因为从数据关系角度,退货并不一定要针对原始单据退,一次退货也可能涉及不同采购行为,所以,要让退货冲红一定要恢复原始采购数据,接近于不可能。(采购退出的冲红,不能作为一次采购处理,所以,也不能登记rukuxul,所以,肯定会导致两个方面库存不一致。)(时空程序目前无此逻辑。如果一定要做到,就必须要配合很多业务作业规定,业务流程会非常复杂,必须在现场根据用户的操作要求去定制开发。把采购退出冲红反作为采购,是有一定风险的,有时解释工作不一定好做。);
7、 销售:在入库序列中按核算规则(先进先出、后进先出等)进行数量勾销,勾销细节,要记录在chukuxul中;当可勾销数量不足够的时候,要在chukuxul中进行说明,确保数据的完整性和可追朔性;销售时,可能会出现销售数量大于可勾销数量的可能性,这时,不足部分的成本,将采用商品库存加权移动成本价;(对于采购序列集合中数量不足,必然导致库存数量的减少与序列勾销数量不一致,所以,也会导致入库序列库存与总帐库存不符。)(如果用户对批次库存要求比较高,也可以修改成本核算过程,对无勾销数量进行拦截,如果产生无勾销数量,将拦截存盘过程继续。)
8、 销售冲红:可以在出库序列中定位到勾销对象,将勾销对象回填到入库序列中。Chukuxul中记录了rukuxul中的所有信息,从道理上是肯定能回朔的,当然,由于在出库时存在没有勾销对象的情况,所以,冲红时,对于没有勾销对象的数据是不回写的。(如果出现原始数据就没有进行勾销的数量,冲红后肯定会导致两者库存不一致)
9、 销售退回:最好的操作,是由人指定到对应原始采购数据上,如果要依据数据关系回朔,从退货找到对应的销售,再从销售找到曾勾销的进货,应该说难度是很大的,而且,出错的机会会非常多。所以,最好的操作,是由人去指定。对于不能指定的(可能在入库序列中已经不存在了),需要逐条核对可能的进价,之后,将记录按采购方式登记序列。(这样操作,确实会存在风险。)总而言之,尽量保证增加的数量,要表现在入库序列中;(目前时空的程序,没有任何处理逻辑。如果客户有相关要求,必须在现场根据用户可能认同的操作要求而完成。)
10、 销售退回冲红:这个操作就更复杂了,系统唯一能做的,就是在入库序列中,将“销售退回”时机增加的记录给剔除掉,而且,对于这些数据已经产生的勾销,是不能回朔的。(可能导致两者库存不一致)(必须要依据销售退回产生的数据逻辑,才能确定销售退回的冲红逻辑,所以,也必须在现场开发完成)
11、 外调入库: 所有外调逻辑,都如同进销逻辑。
12、 外调入库冲红:
13、 外调退出:
14、 外调退出冲红:
15、 外调出库:
16、 外调出库冲红:
17、 外调退回:
18、 外调退回冲红:
19、 内调:内调,原则上不使用任何成本核算方法,内调,不会使库存价值发生变化;
20、 盘点长货:如果在商品出库勾销时,可能存在入库数量不足的情况,而且,在程序逻辑中,遇到这个情况,会使用库存成本替代没有数量的勾销对象,所以,可以这样认为,在盘点出现多出来的时候,可以不考虑核算方法需要支撑的数据序列;(可能导致两者库存不一致)(时空程序目前暂时不做任何处理)
21、 盘点短货:最好不使用商品自身的核算方法,而是采用内置的“加权移动平均”方法核算盘损,只影响库存结果,不影响核算方法对应的结果;(可能导致两者库存不一致)(如果确实需要在盘点短货时进行成本核算,需要时空开放一个参数即可,通常,这个参数是隐蔽的,避免实施可能导致的混乱。)
22、 商品报溢:同盘长;(可能导致两者库存不一致)
23、 商品报损:同盘短;(可能导致两者库存不一致)
24、 商品初装(数量):如果确实能够对应到采购批次的商品,可以在初装是手工登记入库序列,但不必为一定维护两边库存相同而登记初装数据;(可能导致两者库存不一致)(如果初装一定要登记rukuxul,那前提是一定要按供应商线索初装。)
25、 批号数量调整:对入库序列不影响,如果入库序列与批号数量一致,而批号数量被调整了,也会产生数量差异;(可能导致两者库存不一致)
成本核算,应该是核算什么?
这个问题,可能也需要做一个阐述。我们先进性出这种核算,到底在核算什么?为什么要用进货序列这样的方式来衡量成本呢?
实质上,这种核算方式,就是试图要衡量出一个更接近实际的进价,在确定任何一笔销售分录后,到底成本是否核算的准确,关键是是否能够展现其核算过程使用到的进价。
所谓正确的进价,我们认为,应该是能够表现出以下信息的数据,才算正确核算的结果:
l 单据编号:采购发生在哪个具体单据,应该有能力再现当时的采购单据;
l 日期:这笔采购单价,是在什么时间发生采购的;
l 供应商:这笔采购成本,是分摊哪个供应商的;
l 单价:当时绝对的采购价格是多少,分摊成本的价格,应该是绝对的;
在商业运作过程中,无论我们对进价序列管理的多么严谨,总是难免要发生实际进价序列与当前计算机中的进价序列会有差异(账实不符的假定如果不存在,那商业系统的盘点功能就可以不需要了),如果这个差异发生,都会导致衡量一笔销售的勾销信息,出现不是绝对采购信息的情况,这时,有两个报告方法,我们可以权衡哪个更符合商业实际:
1、 在任何库存变动导致进价序列发生变动时,都把变动记录添加进去,由系统随意找一个可替代的单价作为未来勾销的采购单价;
2、 忽略库存变动与进价序列的差异变化,在销售时机发现差距时,按当前库存成本权且当作一个采购单价,但必须要明确的标明这个不是实际采购价格;
上述两个解决方法,从结果看,应该是完全对等的,但处理方式,却存在非常大的差异,如果从实现过程对系统的综合影响(多出的操作环节、系统的效率、系统的稳定性、数据的一致性等方面),我们可以很快选择一个利大蔽小的解决方案的。
从原理上讲,rukuxul的结存数量,是难以跟库存数量相等的;
这里,需要声明一点,出库成本核算,是核算出库的,是商品出库时(减少时),应该怎么计算出库的价值。出库核算,严格说并不影响库存核算,可能出库核算与库存核算完全是两种不同的逻辑。
1、在程序中,分摊当前出库数量,需要在rukuxul中勾销,当勾销完所有相关记录,还存在未被勾销数量时,程序是不能在rukuxul添加负数的记录的,这是一个程序逻辑存在的内在出口;
(分摊过程内置在程序存盘逻辑中,当遇到这个情况时,已经不可能再让人来进行一次干预,或这个时候干预,也无法弥补,也只能让其继续完成。)
2、存在被出库行为勾销完的入库数据发生变动,比如冲红等,这时,不能再人为的调整出库数据(也是不可能做到的),所以,当发生这个情况时,数据一致性从根本上已经不能维护了。
(一个母亲生了孩子,这个孩子已经长大,也有了很多自己的行为,这时,发现母亲嫁错人了,需要回到姑娘时期重新选择一个丈夫,但问题是,孩子以及孩子的行为,是不能清理干净了,或必须认同孩子的存在和认同孩子产生过的行为);
3、负库存拦截,通常不应拦截到这个层面,应该说如果要拦截住,必须要形成一系列逻辑严谨的应用,或极其严格的业务作业流程,应该说,只能从理论上说能做到,能当作愿望,不能作为现实;
4、在非正常业务产生的商品数量增加,必须要添加到rukuxul,而且,要认为的给一个“采购价格”,但这里也存在一个隐患,就是企业经验规律上的“逢长必短”,虽然我们对“长”出来的东西“安”了一个进货价格,但相对“短”的商品,本身必然出现核算错误,结果并不是圆满的;
5、核算方式是否可改变?如果用户对某些单品使用“序列勾销”这个方式,假定从初始化数据后,确实达到了序列库存与结存库存是一致的;如果由于种种原因,用户终止了这种核算方法,肯定系统就不背负计算压力了,但也就不跟踪其勾销过程了。但很可能用户在一个时期后,又要求重新采用这个方式,那这时的序列库存和结存库存的相对差,由谁去解决?因为用户变更一个核算方法,时空就要派一个技术人员帮他们手工计算一次数据?
最关键的因素,就是对待负库存的问题。
由于负库存出现的原因,是复杂的,并不是单纯程序逻辑和作业流程就可以避免的,所以,要想绝对的杜绝负库存,从原理上是做不到的。(我这样认为,当然,可以在一定程度规避和控制)。对于勾销入库序列的核算方式,在入库序列中结存(入库数量-出库数量)要与库存结存保持一致,而入库序列中又不能记录负数(因为负数将没有任何意义,也无法使用),所以,从原理上,本身就是不成立的;
负库存拦截,必须要配合复杂的逻辑和严格的业务作业规范,如果负库存拦截在相当程度影响到了业务正常开展,我如果是用户,肯定会要求“业务第一”的,这时需要考虑的,是系统设计的可逆性程度,用户是否可以随时根据管理需要取消这个方式?
毕竟“核算”,是企业辅助管理的一个支撑,它不是直接赚钱的组成部分,而业务本身,是企业的命脉,当然,管理需要成本,对于经营者,肯定有一个权衡的过程,支付多少成本去满足管理?如果“截流”已经影响了“开源”,大部分企业可能会“舍弃”部分与“截流”相关的成本,保障业务的顺利进行(九州通多年的IT理念);
而我们的各种核算方法,不过都是强化过程管理的一些手段,而且,仅仅是管理的一个方面。在用户不知采用这个方式可能付出的代价时,他们在心里会认为只要把需求给了软件公司,这些东西就自然而然的达到了。他们忽略了一个重要的因素,软件公司没有超自然的能力,任何管理的实质,还是在用户自己的操作。而往往这些问题浮出水面的时候,也是软件公司做了大量的开发,业务流程做了大量的调整,很多业务环节,都被“软件”约束的成为不可逆的、刚性的管理方式,应用成了用户的负担,最可怕的,是用户自己的发展空间没有了,因为任何业务模式的调整,都会涉及复杂的程序调整,在一定意义上说,如果不推翻以前的逻辑,就不可能有业务模式的变革。
为配合序列勾销核算库存,做了三个功能:
用户采用批次进价功能,有以下两个本质目的:1、核对库存成本时,期望跟采购过程能够结合起来,更准确的报告实际采购库存;2、销售成本的组成,期望能看到组成的明细,最好能跟采购完全挂钩;
为实现用户这两个方面的需求,我认为做以下三个功能可以满足用户的要求:
一、 批次进价调整功能:
确定一个单品(包括批号),系统报告当前库存情况和展现其所有采购序列:
商品编号:________ 商品名称:___________(先进先出、后进先出等核算方法集合商品)
总库存数量:xxxxxxx 入库序列:
单据编号
单位编号
单位名称
日期
入库数量
入库单价
已勾销数量
用户可以增减记录,也可以修改入库数量;
增加记录:单据编号、购进单位信息为空,日期为当前日期,不允许填写“已勾销数量”;
减少记录:可直接删除记录,但必须要有明确的提示,操作是不可逆的;(如果删除后,再添加回来,单据信息和往来单位信息,将丢失;
修改入库数量:可以不限制的增加,如果减少,不允许小于等于“已勾销数量”,如果相等,建议将记录删除;
二、 单品核算过程查询
确定一个销售单据,再确定其中的一个单品,如果这个单品符合设定的核算方法,就可以展现其核算过程:
单据编号:__________ 销往单位:_____________
商品编号:__________ 商品名称:_____________
销售日期:__________ 销售数量:_____________
销售单价:__________ 销售金额:_____________ 毛利:___________
成本核算:
采购单据编号
采购单位
采购日期
采购单价
勾销数量
成本金额
成本合计:
∑成本金额
(主数据源chukuxul,条件:djbh+dj_sn,排序字段:plh 计算字段:成本金额=采购单价×勾销数量)
最好在展现结果前,验证一下,销售额-毛利,是否等于“∑成本金额”,如果出现差异,最好悄悄的修改“毛利”字段(可能会存在小数点差异);
这个功能,为用户验证核算方法的最重要功能,也是我们用于与用户沟通的关键功能,也许这个功能用户在实战中很少被用到,但在售前阶段,是描述“批次进价核算”、“先进先出核算”、“个别计价核算”等方式的最好表达功能;
三、 单品采购序列库存报告
系统内的库存报告,应该是取数于商品总结存和货位结存、批次结存。但就针对一个单品时,用户需要按采购序列查看当前的库存成本组成,这样,我们应该在确定一个单品时,能够展现其所有成本组成:
商品编号:__________ 商品名称:_____________
总库存数量:________ 总库存金额:___________
采购批次成本:
采购单据编号
采购单位
采购日期
采购单价
结存数量
结存金额
合计:
∑结存数量
∑结存金额
(主数据源rukuxul,条件:spid,排序字段:plh 计算字段:库存数量=入库数量-出库数量;结存金额=采购单价×结存数量)
由于是库存报告,所以必须保证(“∑结存数量”=“总库存数量”),(“∑结存金额”=“总库存金额”),由于系统设计,本身是不能保证这个等式成立的,这时,就必须要在形成数据集合后,由程序将差额补足,让本页查询,数据逻辑是一致的;
当∑结存数量<>总库存数量 或者 ∑结存金额<>总库存金额 时,要将差额添加一行记录,确保当前查询的逻辑关系。
添加一行记录:
采购单据编号:其他入库
采购单位:空
采购日期:空
采购单价:if(库存数量<>0 and 库存数量×库存金额>0,库存金额/库存数量,spkfjc.chbdj)
结存数量:spkfjc.kcshl-∑结存数量
结存金额:spkfjc.kcje-∑结存金额
展开阅读全文