小编推荐
本文介绍了一家工程公司在在核算组织、银行账户等基础数据动态新增和变化的情况下,如何通过多条件取值和逻辑判断实现科目和核算维度的动态取值。重点介绍了GetFieldValue函数的使用方法,利用GetFieldValue函数和IF函数,实现了根据部门、费用项目和结算方式动态确定成本费用科目和资金支付科目。
此方案适用于阿米巴型项目管理企业、不同职能组织架构不对等的企业及核算维度需要逻辑判断场景下的凭证模板配置。
撰稿人:金蝶-牛捷
1 业务场景
企业为工程公司,基础数据已经通过集成自动同步,会计科目体系、费用项目体系从法人层级向下统一,以项目组为最小核算单元,每个项目组有自己独立的费用、应收、应付、出纳、资产、资金、核算职能。法人及每个项目组都有固定下级组成如部门1,部门2等各一个(项目组私有),项目组数据经常新增,且项目组之间数据要求互相隔离。
现在要求配置收付实现的费用报销模板,需设置在法人层级,具体成本科目根据部门和费用项目定位,资金支付要求现金账户支付时资金序列固定为A,基本户固定为B,其他需动态按付款账号编码匹配编码一致的资金序列。
说明:资金序列是指支付的付款序列依据,按照支付类型和账户匹配,对不同序列进行不同排程。
业务主线 | 承载单据 | 核算方向 | 涉及科目 | 科目影响因素 | 核算维度 |
费用报销
| 费用报销单
| 借 | 成本费用 | 费用项目、部门 | 部门 |
贷 | 资金支付 | 结算方式 | 资金序列 |
表1 费用报销单凭证模板配置关键要素
2 现状分析
由于数据隔离的要求,部门、银行账户、资金序列都是独立数据,为各个项目组私有,会计科目、费用项目、账户类型、结算方式为公共数据。通过费用项目、部门确定唯一成本费用科目;通过结算方式确定唯一资金支付科目。核算维度-部门可直接取值,资金序列需根据账户和结算方式判断。
3 解决方案
基本说明
首先,我们需明确取值的核心,无论是科目还是核算维度,取值赋值都是依赖于数据ID。哪怕是模板配置的基础资料选择,也是根据基础资料类型进行了字段的过滤,所有可以取单据字段值的数据,都可以更改设置为取该字段表达式的字段id,本质没有区别。
图1 核算维度取字段id
所以获取所需的字段ID是最终目的,为实现这个目的,我们需要做的就是筛选匹配工作。只要一张制证单据上提供的数据能满足定位和匹配的要求,就可以定位所需数据。
多条件取值
首先是成本费用科目的取值,因为部门随项目组的新建会动态增加,科目影响因素的使用存在局限,需要实时更新映射关系,如果不想增加维护工作量,则需要考虑进行组合的多条件取值。
通常来说,我们每多一个属性,就可以多一个判断条件,每个条件可以判断一个科目层级。比如,管理/销售/生产/制造为一级成本科目,可以通过部门属性判断;二级科目如管理费用-差旅费用/管理费用-招待费用通过费用项目一一对应。
但对于大型集团企业而言,会计科目可能远不止二级,当科目层级达到七级乃至八级时,会出现大量复杂交叉的费用项目。在维护、调整、变更映射关系的时候变得非常困难。这时可以考虑二次开发添加新的字段属性,但是会对应增加维护工作量。基础资料上添加的属性字段越多,运维工作量就越大。
这里以成本费用举例提供了多次判断的一种方式。采用多条件,可借助编码/命名规则实现条件匹配,作为一种灵活的方案,平衡开发与维护的工作量,实现同样的效果。
首先我们梳理目标数据及映射标准。目标数据为会计科目,该数据为公共数据(不允许个性化的前提下,无论哪个组织的会计科目,其创建组织都是一样的,同科目编码的ID是唯一的)。
其次是条件数据,费用项目也是公共数据,部门虽然不是公共数据,但因为部门编码结构的特殊性,可以当作公共数据看待。
在法人层级创建科目影响因素如下:
部门 | 费用项目 | 会计科目 |
01 | A | 管理费用-A |
02 | A | 销售费用-A |
03 | A | 制造费用-A |
01 | B | 管理费用-B |
表2 费用报销单会计科目影响因素
说明:这时部门无法选择项目组,创建于法人层级则只能选择法人层级的部门。
凭证模板配置取值:
费用项目可直接取单据公共数据,部门则需公式取值,通过部门编码和上级组织定位到法人层级部门,满足映射条件。
此处设置相当于建立一个样板房,无论后续新增多少项目组,只要项目组部门结构、编码和法人结构一致,就可以借用法人层级的已配置规则条件进行判断。
图2 GetFieldValue函数使用示例
这里重点补充涉及函数及使用方法:
GetFieldValue,该函数频繁用于获取单据指定字段。
以上述使用公式为例:
GetFieldValue('bos_adminorg', 'id', 'viewparent.number', '00','number', entrycostdept.number)
GetFieldValue为可延展的条件取值函数,其函数构造可简化为GetFieldValue(A,B,C,C1,D,D1…)
其中A为目标单据,B为指定字段,如'bos_adminorg', 'id'即为获取【行政组织】的ID,在凭证模板中作为影响因素和维度来源引用时,切记最终获取的结果都是ID。C和C1则为条件组,C为目标单据的条件字段,C1为条件值。
这里注意C1可以为定值或变量。如'viewparent.number', '00'该组意为目标单据【行政组织】表单中上级编码等于固定值00;'number', entrycostdept.number该组意为目标单据【行政组织】表单中编码等于当前生成凭证单据字段“费用承担部门”编码。
比如:要获取的目标行政组织,具有属性及属性值如下:
行政组织(bos_adminorg) | 部门编码(number) | 上级部门编码(viewparent.number) |
A部门 | 1234 | 123 |
表3 行政组织的属性值示例
设置公式:GetFieldValue('bos_adminorg', 'id', 'viewparent.number', '123','number', '1234'),即可取到A部门Id。
函数的条件组可支持多条件取值,两两一组进行延展即可。
逻辑判断
然后是核算维度-资金序列的取值,由于资金序列、银行账户、组织都在动态增加,配置核算维度类型映射存在较大局限性。虽然通过分录筛选条件可以进行部分的条件判断,但是这里的条件也局限于单据上存在的条件。
此时可通过嵌套公式进行条件取值,使用IF函数进行条件判断,嵌套GetFieldValue函数进行结果取值。
这里重点补充涉及函数及使用方法:
除去上文说过的GetFieldValue,这里还使用IF()函数,if(A,B,C)三个参数值,A为判断值,例如1=1或1=2,等式成立则输出B,不成立输出C。B,C均支持参数和固定值。
针对上述条件,设置函数如下:
if(paymode.name='现金', ‘A.id’, if( GetFieldValue('bd_accountbanks', 'acctstyle', 'number', payeraccount)=basic,’B.id’,GetFieldValue('资金序列', 'id', 'number', payeraccount)))
即第一层if函数判断结算方式(这一步使用分录筛选条件也可),在确定为现金后给出固定值A的id;
如果非现金,则进行第二层判断,获取付款账号一致的银行账户账户类型,当它为basic(基本户)时,输出固定值B的id,否则按付款账号编码进行匹配,输出一致的资金序列Id。
图3 IF函数嵌套GetFieldValue函数示例
4 方案的可推广价值
本案例介绍的凭证模板配置方案-动态化科目/核算维度取值,适用于以下企业和业务:
阿米巴型项目管理企业的凭证模板配置;
不同职能组织架构不对等的企业凭证模板配置;
核算维度取值有逻辑判断的凭证模板配置。
5 注意事项