对完账要不要开票:单据、发票、申报三张表怎么勾稽
摘要:对完账要不要开票?答案是「不必先开票」。「是否开票」是一个默认是否的字段,跟对账单据解耦,发票号、开票日期、归属部门在单据审核前补录就行。先开票会把纳税义务提前到开票日,但收入确认落在哪个月不会跟着变。这篇把收入确认、纳税义务、开票三条时间轴拆开,再讲单据、发票、申报三张表怎么逐单勾稽,容差是 0。 关键词:对账与开票、发票勾稽、纳税义务、单据状态机、推送幂等
一、先把问题问对:对完账不必先开票
"账对完了,是不是就可以开票?"
这个问题我被问过很多次。背后的直觉很顺:账是账,票是票,账对平了才谈得上开票,票开了才谈得上报税。
这个顺序是错的。
准确的说法是:「是否开票」就是一个是否字段,默认值是否。它跟对账单据是解耦的两件事。发票号、开票日期、归属部门这几个信息,是在单据审核之前补录进去的——不是前置条件,更不是一道闸门。
这里还得补一句最要紧的:开票本身不改变收入金额,也不改变应收金额。 单据本身也不产生分录。分录是单据进了 ERP 之后由账务处理生成的,跟开票没有先后关系。
为什么这么多年大家都觉得"不对完账不能开票"?因为在税务的日常说法里,"开票"这个词同时绑着"发生纳税义务"和"能拿去申报"两件事。听的人自动把它们压成了一个动作,于是"票没开"就等于"账没做完"。
对账和开票可以解耦,但金额不能解耦。 这句话是这一篇的骨架:时间上可以分开,金额上必须咬死。
二、三条时间轴:收入确认、纳税义务、开票
这三件事各有各的触发条件,排序不能混。
| 时间轴 | 什么时候算发生 | 影响什么 | 会不会改收入金额 |
|---|---|---|---|
| 收入确认 | 控制权转移——货发了、风险报酬转了 | 利润表的收入和成本 | 决定收入落在哪个月 |
| 纳税义务 | 收讫款项、取得凭据、先开票,三者取最早 | 增值税纳税义务发生时间 | 不改,但可能把税提前 |
| 开票 | 税务动作,在税控或电子发票平台做 | 税务凭证、进项抵扣依据 | 不改,只产生凭证 |
看这张表的最后一列:不改。
先开票,税负就提前了,但收入月不会跟着变。
举个例子。一个 13% 的订单,10 月 20 日发货,11 月 15 日平台结款,11 月 20 日你才想起来开票。11 月 20 日开票,增值税纳税义务就落在 11 月。但收入确认看的是控制权转移,10 月 20 日就转了,收入还是 10 月的收入。
常识在这里为什么会失效? 因为日常经验是"票在手上才算数",而税法把"先开票"单列成一条独立的纳税义务发生情形。这一条被多数人听成了"提前确认",其实它提前的只是税,不是收入。
所以三条线要分开记,走到哪里是哪里的事。对完账不等于到了开票点;开完票不等于收入确认过了;两件事都过了,也不等于申报做完了。
三、三张表怎么勾稽:单据、发票、申报
对账做完后,财务手上其实有三张表:
- 对账单据表——从对账结果转换出来、准备进 ERP 的单据;
- 发票表——税控或电子发票平台导出的开票明细;
- 申报表——增值税纳税申报表及其附列资料。
这三张表要逐单勾稽:单据金额 = 发票金额 = 申报金额,容差 0。
容差 0 三个字听着狠,但没得商量。三张表要对得上,差一分钱都要找出来。
| 勾稽维度 | 单据 | 发票 | 申报 |
|---|---|---|---|
| 金额口径 | 含税 | 含税;专票另列税额 | 不含税销售额与销项税额分列 |
| 一条对应几行 | 一单一勾稽 | 一票一勾稽 | 一票一行 |
| 允许偏差 | 0 | 0 | 0 |
| 最常见的断点 | 漏生成、生成失败 | 漏开、错开、红冲未做 | 票开了却没申报 |
看第一行。三张表在"含税还是不含税"上并不统一:单据和发票都是含税列示,申报表是拆开的——不含税销售额一栏、销项税额一栏。可这两栏加起来,还是同一个含税金额。这就是容差能取 0 的前提:先把口径折到同一个数上,再逐单比。
还要提醒一句:发票有开票日期,申报有所属期,单据有账期,三个时间还不在同一条轴上。三张表勾稽的是金额,不是时间;时间上的对应关系归另一张表管。
那"逐单"在系统里怎么落地?在轻易云的单据上,这条规则是落成字段的:「是否开票」默认否,发票号、开票日期、归属部门三个位子在单据审核前补录,审核不因为票还没到就卡住。审核时按单据号一单一勾稽,对不上的挂差异原因,金额不允许就地改平。
四、票种和金额口径:专票、普票、数电票、红字票
三张表能勾稽,前提是大家说的是同一个口径。票和金额最容易出岔子的就在这儿。
| 票种 | 能不能抵进项 | 形式 | 电商里常见的主体 |
|---|---|---|---|
| 增值税专用发票 | 能 | 纸质或电子 | B2B 采购方、一般纳税人 |
| 增值税普通发票 | 不能 | 纸质或电子 | B2C 消费者、个人客户 |
| 数电票(全面数字化的电子发票) | 按票种判定 | 电子 | 平台与企业之间开票 |
| 红字发票 | 冲减原蓝票 | 纸质或电子 | 退款、折让、开票有误 |
这张表里有四句话要记住。
第一,专票能抵进项,普票不能。这是票种之间最硬的差别。B2C 零售通常开普票或电子票,B2B 批量销售通常开专票——不是开票人心情好,是购买方能不能抵决定了票种。
第二,纸质和电子,法律效力相同。数电票跟纸质票一样,不用因为"是电子的就打个折"。
第三,金额口径三条:单据和发票都含税列示;专票另列税额;红字发票金额为负。负号很重要,勾稽的时候不能取绝对值。
第四,开票不改变收入金额。这一句前面已经说过两遍了,还得再说——它是这一篇最容易被丢掉的一句。票面金额是价税合计,账上的收入是另一个口径下的数,两个数用途不同,不要互相替代。
具体某个客户该开专票还是普票、什么时候开票,这类没有统一答案,要由财务负责人拍板并写进核算政策。
五、单据怎么进 ERP:状态机、幂等、回读校验
勾稽台账里的"单据号"是从这一步来的,所以这节跟发票没关系,但跟台账能不能长期活着有关系。
单据状态机只有四个状态:草稿 → 已确认 → 推送中 → 已推送 / 推送失败。有个细节别忽略:只有已确认能推。草稿推不出去,这是设计,不是故障。
这张流程图分五段:对账结果(已确认)→ 生成批次 → 集成转换沙箱 → 整体确认 → 推送 ERP。推送侧还有一条四步链:提交、补录发票字段、提交、审核。
其中**"补录发票字段"就挂在第二步**——第三节说的开票信息补录,落在流程上就是这里。它既不在最后一步,也不是开完票才回填,而是在单据进 ERP 的中途就能补进去。图上还标了金额禁改和推送后的外部单号回写,这两样都是为了让"这张单据在 ERP 里是哪一张"能被认准。
然后是最容易出事的一处:幂等。
- 推送型(财务应收下推)天然幂等。同一个来源推两次,ERP 侧按来源匹配,不会多出第二张单。
- 保存型——费用应收、费用应付、销售收款、银行转账这四类——没有幂等拦截。重推一次,就是多一张单。
区别在语义:推送型是"更新已有单据",保存型是"新建单据"。新建没有天然的主键约束,重推自然就重复。
保存型怎么防重?靠表头传一个防重字段:「轻易云单据编号」= 平台枚举码 + 推送时刻。平台枚举码区分来源,推送时刻区分批次,两者拼在一起,重复推送也认得出来。
这是集成中心的方案明细页。9 个 handler 逐条摊开,一行一条。实施顾问看这张表,重点看两列:方向(这批数据是往里拉还是往外推)和场景(对应哪张单据类型)。判断某个单据类型重推会不会多出一张单,先在这里确认它走的是推送还是保存。
这是同一套方案清单的全景视图,把 9 个 handler 按方向和场景排在一起。往里拉的是健康检查和那类从 ERP 取数的单据,往外推的是银行转账、收款单、应收、财务应收这些。同一个页面上能同时看到拉和推,是因为勾稽要闭环:往回拉的凭证和往外挂的单据得对得上,才谈得上容差 0。
推送之后必须回读校验——分录行数与金额合计,容差 0.005。行数必须对得上;金额合计允许 0.005 以内的偏差,那是分位舍入的余量,超过这个数,推送就不能算成功。
实证:亚马逊美国的一个批次,12 张单据合计 480,111.67 元,其中已推送 11 张、含异常体行 1 张。那 1 张含异常体行的,就是回读校验该拦下来的。
六、三个坑,和一张台账怎么落地
坑一:把「是否开票」当收入确认的条件。单据卡在"等发票",账就做不下去;最后为了赶进度先把票开了,收入确认月和开票月混成一团。
坑二:用发票金额替代对账金额。发票是价税合计,对账金额是按核算项目归集出来的数,两个数不是一回事。拿发票去倒推差异,差异就永远查不出来。
坑三:单据和发票金额长期不一致,却没人核对。不核对不等于没问题,只等于问题被推迟到申报那天。
坑还有一个,属于机制问题不是口径问题:三方勾稽要有台账。在轻易云的做法里,这张台账的字段直接落在单据上——「是否开票」、发票号、开票日期、归属部门,和单据号、含税金额放在一张单里;对账结果和开票信息天然对齐,账期和申报所属期的对应关系也跟着落在这张单上,三方勾稽不用另外维护一张映射表。
台账字段大致就是这些:
| 台账字段 | 谁填 | 什么时候填 | 勾稽时看什么 |
|---|---|---|---|
| 账期 | 财务 | 对账确认时 | 三方是否落在同一期 |
| 单据号 | 系统 | 转换出单时 | 是否一单一号 |
| 发票号 | 财务 | 开票后回填 | 是否一票一单 |
| 含税金额 | 系统 / 财务 | 确认与开票时 | 三方是否相等,差 0 |
| 票种 | 财务 | 开票后回填 | 专票还是普票,能否抵进项 |
| 开票日期 | 财务 | 开票后回填 | 是否早于申报所属期 |
| 申报所属期 | 财务 | 申报时 | 这张票本期申报了没有 |
| 差异原因 | 财务 | 发现差异时 | 差异归到哪一类,怎么收口 |
这张表的价值不在字段本身,在于它把"差一分钱"变成一个有名字、有责任人、有收口方式的东西。没有台账,差异就散在三个人的表格里,永远对不齐。
这张金字塔自下而上五层:自动化、标准化、智能化、精细化核算、战略决策支持。财务待得最久的通常是底下两层——自动化是"单据自动推送、金额自动回读校验",标准化是"一单一号、一票一单、台账口径统一"。勾稽台账属于标准化那一层的事,它本身不产生决策价值,它只是让上面几层不用天天替它兜底。
三条今天就能做的动作
第一,挑一个已经关掉的账期,把三张表拉出来按单据号逐条对:单据含税金额、发票价税合计、申报的不含税销售额加销项税额,允许差 0。先做一个账期,把差额和差异原因列出来,不追求一次全平。
第二,检查自己系统里"开票信息"是在哪个环节补的。如果现在是"票没到就不能确认单据",把它改成"确认前补录",单据审核不等票。
第三,给自己列一张推送型、保存型的单据清单,把费用应收、费用应付、销售收款、银行转账这四类标上"重推会重复",下次推送前先确认是不是真的失败,而不是没翻日志。