多币种开票与外汇损益复式记账:马来西亚企业实务指南
马来西亚企业处理 USD、SGD 外币发票的实务指南:交易日换算、期末未实现外汇损益、收款时已实现损益、复式分录,以及 LHDN MyInvois 外币栏位。
核心要点 (TL;DR)
- •若企业的功能货币是 MYR,开出 USD 或 SGD 发票时,应按交易日汇率换算成 MYR 入账,同时保留原币金额、币种、汇率、汇率日期和来源。
- •尚未收付的外币应收或应付账款属于货币性项目;每个报告日须按期末汇率重新换算,差额计入当期损益,不能等到真正收款才处理。
- •结算时,以应收或应付账款最新的 MYR 账面金额冲账,再记录实际 MYR 现金;两者差额就是已实现外汇收益或损失,银行手续费必须另列。
- •GetPay 目前没有完整的逐张发票外汇会计引擎:发票记录没有文件币种或汇率栏位,总账操作以 RM 为基础,现有 MyInvois 映射也固定提交 MYR。
同时记录原币与 MYR,但总账只能有一个功能货币
外币开票不是把发票上的 RM 符号换成 USD 或 SGD 就完成。企业必须同时保存两组金额:
- 合约和发票注明的原币金额,例如 USD 10,000;以及
- 按企业功能货币计量的账面金额,例如 MYR 42,000。
功能货币是企业主要经营环境的货币。公司在马来西亚注册,不代表功能货币在任何情况下都必然是 MYR;企业仍须根据自身收支、定价、融资等经济事实作出判断。不过,多数主要以马来西亚市场营运的中小企业会采用 MYR。以下例子均假设企业已经确定 MYR 为功能货币。
汇率的报价方向必须写清楚。本文所有示例都采用“每一单位外币等于多少 MYR”:
MYR 功能货币金额
= 原币金额 × 每一单位原币的 MYR 汇率
若示例汇率为每 USD 1 等于 MYR 4.20,USD 10,000 的初始账面金额就是 MYR 42,000。账表若只留下 4.20,却没有注明 USD/MYR、汇率日期、来源和报价方向,日后复核者无法确认计算是否倒置。
每一张外币文件至少应保留:
| 建议栏位 | 用途 |
|---|---|
document_currency | 发票合约币种,例如 USD 或 SGD |
foreign_amount | 客户或企业须按该币种收付的金额 |
functional_currency | 企业总账币种,本文假设为 MYR |
transaction_rate | 初次确认时采用的交易日汇率 |
rate_date、rate_source | 证明汇率选择的日期与来源 |
functional_amount | 初次入账的 MYR 金额 |
open_foreign_amount | 截至某日仍未结清的原币余额 |
closing_rate | 报告日重新换算所用的期末汇率 |
settlement_rate、cash_amount | 实际结算汇率和银行收付金额 |
这些是一个完整工作底稿应有的资料,不代表 GetPay 现阶段已经提供所有同名栏位。
USD 销售发票在交易日怎样入账?
假设一家马来西亚服务公司以 MYR 为功能货币,在 11 月 15 日完成服务并向客户开出 USD 10,000 发票。当天示例即期汇率是每 USD 1 等于 MYR 4.20。为了突出外汇处理,以下例子暂不加入 SST 或其他税项;实际税务必须依交易本身和适用规定另行判断。
USD 10,000 × MYR 4.20 = MYR 42,000
初次确认分录如下:
| 总账科目 | 借记(MYR) | 贷记(MYR) |
|---|---|---|
| 应收账款——该客户 | 42,000.00 | — |
| 服务收入 | — | 42,000.00 |
| 合计 | 42,000.00 | 42,000.00 |
应收账款属于货币性项目,因为客户最终须交付固定数额的货币。收入则在符合收入确认条件时,按交易日汇率换算入账。不能因为客户日后才付款,就把已经完成的销售全部延后到收款日。
后续汇率变动时,不可覆盖原发票的 MYR 4.20。USD 10,000、MYR 4.20 和 MYR 42,000 是初次确认的历史层,必须保留。月底汇率和收款汇率是用来计量尚未结清的货币性项目,而不是用来改写原始文件。
企业若为了日常处理采用接近实际交易日汇率的平均汇率,必须有一致、合理的会计政策,而且该平均率确实能近似实际汇率。若汇率在短期内大幅波动,简单月平均可能无法代表某一笔重大交易。会计换算率、税务规定采用的汇率,以及电子发票所填汇率若有不同目的,也应分别保留依据,不能在同一个栏位互相覆盖。
月底未实现外汇损益怎样计算?
假设 USD 10,000 发票在 11 月 30 日仍完全未收,月底示例汇率已变成每 USD 1 等于 MYR 4.30:
月底应收账款:USD 10,000 × MYR 4.30 = MYR 43,000
原账面金额: MYR 42,000
应收账款增加: MYR 1,000
对卖方而言,同一笔 USD 应收账款现在可换得更多 MYR,因此形成外汇收益:
| 总账科目 | 借记(MYR) | 贷记(MYR) |
|---|---|---|
| 应收账款——外币重估 | 1,000.00 | — |
| 未实现外汇收益 | — | 1,000.00 |
| 合计 | 1,000.00 | 1,000.00 |
“未实现”是方便管理和对账的科目标签,表示客户尚未付款;它不表示这项差额可以留在账外。按照一般 IAS 21 处理,报告日仍未结清的外币货币性项目须采用期末汇率重新换算,相关汇兑差额在产生期间进入损益,除非标准对特定情况另有规定。
需要重估的是仍未收回的应收账款,不是把原来的服务收入从 MYR 42,000 改成 MYR 43,000。若收入和应收账款两边一起增加,就会把同一个汇率变动重复计算。MYR 1,000 是外汇收益,不是企业多做了 MYR 1,000 的销售。
若客户在月底前已经支付 USD 4,000,月底只应重估尚欠的 USD 6,000。已结清部分应在其付款日计算已实现损益,不能在月底再次纳入未实现重估。
实际收款时怎样确认已实现外汇损益?
沿用上例,11 月底重估后,应收账款账面金额是 MYR 43,000。客户在 12 月支付 USD 10,000,银行按示例汇率 MYR 4.25 换算,企业实际收到 MYR 42,500:
| 总账科目 | 借记(MYR) | 贷记(MYR) |
|---|---|---|
| 银行 | 42,500.00 | — |
| 已实现外汇损失 | 500.00 | — |
| 应收账款 | — | 43,000.00 |
| 合计 | 43,000.00 | 43,000.00 |
这里的 MYR 500 损失是以应收账款最新账面金额 MYR 43,000 为基准,不是直接回到原始 MYR 42,000 计算。把两个期间合起来看,这笔交易的累计外汇结果仍是净收益 MYR 500:11 月先确认 MYR 1,000 未实现收益,12 月结算时再确认 MYR 500 已实现损失。
有些会计流程会在新月份首日自动冲回上月重估,然后从原始金额计算结算差额;另一些流程则保留重估后的账面金额,直到收款时直接冲销。只要整个流程前后一致,两种做法可以得到相同的累计结果。最危险的是混用:没有冲回应收账款的 MYR 1,000,却又从原始 MYR 42,000 计算 MYR 500 收款收益,这会同时高估应收变动和外汇收益。
银行手续费必须与外汇损益分开。若银行按 MYR 4.25 换算 USD 10,000,但另扣有文件支持的 MYR 50 手续费,实际入账只有 MYR 42,450:
| 总账科目 | 借记(MYR) | 贷记(MYR) |
|---|---|---|
| 银行 | 42,450.00 | — |
| 银行手续费 | 50.00 | — |
| 已实现外汇损失 | 500.00 | — |
| 应收账款 | — | 43,000.00 |
手续费来自银行或支付服务收费,外汇差额则来自两个计量日期的汇率变化。即使两者都令净收款减少,也不能为了方便而全部塞进外汇损失。
SGD 发票为什么会产生外汇收益?
假设企业开出 SGD 20,000 发票,交易日汇率是每 SGD 1 等于 MYR 3.45,而且开票与收款之间没有跨越报告日:
交易日应收账款:SGD 20,000 × MYR 3.45 = MYR 69,000
收款日银行金额:SGD 20,000 × MYR 3.48 = MYR 69,600
已实现外汇收益: MYR 600
收款分录为:
| 总账科目 | 借记(MYR) | 贷记(MYR) |
|---|---|---|
| 银行 | 69,600.00 | — |
| 应收账款 | — | 69,000.00 |
| 已实现外汇收益 | — | 600.00 |
| 合计 | 69,600.00 | 69,600.00 |
客户仍然只支付 SGD 20,000,原币金额没有增加。收益来自 SGD 在收款时可兑换更多 MYR。对持有 SGD 应收账款的卖方而言,SGD 相对 MYR 走强会产生收益,走弱则产生损失。
外币应付账款的方向刚好相反。假设一张 USD 5,000 供应商账单按 MYR 4.20 初次入账,应付账款是 MYR 21,000。付款时汇率升至 MYR 4.30,银行须付 MYR 21,500:
| 总账科目 | 借记(MYR) | 贷记(MYR) |
|---|---|---|
| 应付账款 | 21,000.00 | — |
| 已实现外汇损失 | 500.00 | — |
| 银行 | — | 21,500.00 |
外币走强有利于同币种应收账款,却不利于同币种应付账款。入账前先做这项方向检查,往往能发现借贷方向或正负号错误。
已实现和未实现外汇损益应怎样对账?
不能只看损益表上的一个外汇净额。应按每张发票或账单编制滚存表:
期初 MYR 账面金额
+ 本期新增外币文件按交易日汇率换算的金额
− 本期结算所冲销的账面金额
± 报告日重新换算差额
= 期末 MYR 账面金额
每一个未结项目还须独立重做:
未结原币金额 × 期末汇率 = 期末 MYR 账面金额
之后,把每项变动归入四个来源之一:新增文件、实际结算、贷项或借项调整、期末重估。无法归类的差额应继续列为异常,不能为了让试算表平衡而随意记入外汇损益。
一套稳健的月结控制包括:
- 每种汇率用途都有明确来源、日期和报价方向;
- 原币余额归零后,不再对该项目进行期末重估;
- 部分收付款同时减少原币未结余额和对应 MYR 账面金额;
- 账目表若要求外汇收益与损失分开呈报,就采用不同科目;
- 银行费用、换汇点差和汇率重估各自有证据,不能互相补数;
- 每期重估分录标明所属月份,确保下期选择冲回或保留时做法一致;
- 外币辅助账按币种合计,并与 MYR 总账余额相符;以及
- 抽查真实金额和汇率,不只核对文件笔数。
LHDN 外币电子发票要填什么?
LHDN MyInvois Invoice v1.1 数据规格设有以下外币相关栏位:
DocumentCurrencyCode:电子发票金额采用的文件币种;- 可选的
TaxCurrencyCode; - 适用时使用的
TaxExchangeRate/CalculationRate; - 与文件币种相同的
TaxExchangeRate/SourceCurrencyCode;以及 - 目标币种为
MYR的TaxExchangeRate/TargetCurrencyCode。
MyInvois 规格把 CalculationRate 定义为非马币金额换算成 MYR 的汇率。LHDN 发布的电子发票指南说明,供应商首先须遵守有关当局适用的法律或税务汇率要求;若没有相关要求,才可采用本身有文件支持的内部汇率政策。电子发票需要换算成 MYR 等值时,就必须提供相关汇率。
电子发票汇率属于申报证据,应与已提交文件一起保留。客户日后收款时使用不同银行汇率,只会产生会计上的外汇损益,不会倒回去修改已提交电子发票的文件币种或汇率。
GetPay 目前的标准 UBL 映射尚未实现这条外币路径。程序把 DocumentCurrencyCode 和各项金额的 currencyID 固定为 MYR,也没有输出 TaxExchangeRate。因此,不能只在备注写上 USD 或 SGD 就把它当成外币 MyInvois 文件,也不能假设公司设定改了币种,提交内容就会自动改变。外币电子发票必须使用真正支持 LHDN 币种、汇率和验证要求的申报流程。
GetPay 目前实际支持哪些币种功能?
现有程序有一些与币种有关的组件,但尚未形成完整的多币种开票、期末重估和结算循环:
| 范围 | 已从程序确认的现况 | 明确界限 |
|---|---|---|
| 公司设定 | 币种选项包括 MYR、USD 和 SGD | 属于公司层级设定,不是逐张发票选择 |
| 价目表与采购订单 | 采用公司记录的币种,并限制为同一公司币种 | 现阶段不开放外币价目表 |
| 银行交易 | 记录可以保留 currency 与 fx_rate,非 MYR 时界面可显示原币汇率标记 | 五个现有本地银行报表解析器都写入 MYR 和汇率 1 |
| 销售发票 | 发票金额、税项、付款和销售分录没有逐张发票币种或汇率栏位 | 不会自动计算已实现或未实现外汇损益 |
| MyInvois UBL | 标准发票固定映射为 MYR | 没有外币 DocumentCurrencyCode 或 TaxExchangeRate 分支 |
| 总账预览 | 现有财务操作以 RM 输出 | 显示工具能接受其他前缀,不等于具备外汇会计引擎 |
企业现阶段若有外币交易,应维护受控的辅助工作底稿,再按本身已批准的总账科目和期间控制记录 MYR 分录。每笔交易必须连接原始发票、汇率证据、期末重估、结算资料和银行凭证。不能因为界面出现币种选择或原币标记,就推断系统已经完成所有外汇会计步骤。
外币月结应该按什么步骤完成?
- 确认企业的功能货币,并记录交易、月结、税务和电子发票各自适用的汇率政策。
- 按币种列出所有未结外币应收账款、应付账款和外币银行余额。
- 把每项原币余额连接至发票、账单、贷项通知单、付款和上期账面金额。
- 从已批准的来源取得报告日期末汇率,并注明报价方向。
- 只重新换算仍未结清的货币性项目,把差额计入当期外汇损益。
- 不要再次重算已经按交易日汇率确认的历史收入或费用。
- 把有文件支持的银行手续费与外汇损益分开。
- 结算时冲销最新账面金额,记录实际 MYR 现金,再确认剩余的已实现差额。
- 以金额滚存期初至期末,特别检查部分付款、跨月结算和重复重估。
- 提交 MyInvois 前,确认实际申报路径确实支持文件币种和适用汇率栏位,不能只依赖公司币种设定。
常见问题 (FAQ)
已实现与未实现外汇损益有什么分别?
未实现外汇损益来自报告日仍未结清的外币货币性项目按期末汇率重新换算;已实现外汇损益则在应收或应付账款实际结算时产生。两者一般都进入损益,分开命名是为了对账和管理,并不代表未实现差额可以不入账。
USD 或 SGD 客户发票应该怎样做复式分录?
假设 MYR 是功能货币,应按交易日汇率把原币金额换算成 MYR,借记应收账款、贷记收入;相关税项则依企业适用的税务政策另行处理。原币金额和汇率必须作为辅助账资料保留,否则日后无法准确计算外汇损益。
月底是否要重新换算外币销售收入?
不应直接重算原有销售收入。需要按期末汇率重估的是仍未结清的外币应收账款,因为它属于货币性项目。其 MYR 账面金额的变动计入外汇收益或损失,不能同时再调整收入,以免重复计算。
外币电子发票可以提交给 LHDN MyInvois 吗?
LHDN Invoice v1.1 规格设有 DocumentCurrencyCode,以及适用时使用的 TaxExchangeRate 等换算栏位。汇率须遵守相关法律或税务要求;若没有适用规定,才按供应商有文件支持的内部政策处理。不过 GetPay 目前的 UBL 映射固定使用 MYR,也没有输出 TaxExchangeRate,因此不能把现有提交路径说成已经支持外币电子发票。
把 GetPay 公司币种改成 USD 或 SGD,是否就能自动处理外汇损益?
不能。GetPay 的公司设定有 MYR、USD 和 SGD 选项,部分采购及价目表记录会采用公司币种;但现有发票没有逐张文件币种或汇率栏位,销售分录和 MyInvois 映射也不会因此自动进行外币换算或计算外汇损益。
来源与权威依据
Ready to automate your Malaysian e-invoicing & bookkeeping?
GetPay handles 100% compliant e-invoices, multi-bank reconciliation, and statutory payroll out of the box.
相关文章
LHDN MyInvois API 载荷指南:JSON 架构、字段验证与直接传送电子发票
从真实账单字段建立 MyInvois UBL 2.1 JSON,核对买卖双方、税务与总额,再完成哈希、Base64 编码及安全直传。
LHDN MyInvois 电子发票 API 故障排查:先看证据,不猜错误码
依据 GetPay 实际程序说明 MyInvois 身份验证、UBL 2.1 文件封装、提交防重、状态查询与税务错误证据的排查方法。