📖 개요 — 이 글에서 확인할 것
수출 대금 청구 전표를 USD로 입력했는데, 원화(KRW) 금액과 그룹통화(EUR) 금액이 각각 다른 환율로 계산된 것처럼 보인 적이 있다면, 원인은 대부분 환산 시점과 환산 기준의 차이에 있습니다. SAP FI는 하나의 전표에 최소 두 개, 많게는 세 개 이상의 통화 금액을 동시에 저장하며, 각 금액은 서로 다른 환율유형·환산일·환산 기준통화로 계산될 수 있습니다. 이 글을 읽고 나면 아래 항목을 스스로 점검할 수 있습니다.
- 전표통화·회사코드통화·그룹통화가 언제, 무엇을 기준으로 확정되는지 설명할 수 있다
- BKPF/BSEG(그리고 S/4HANA의 ACDOCA)에서 통화별 금액 필드를 직접 조회할 수 있다
- "잔액이 안 맞아 보이는" 현상의 원인을 OB22 설정에서 역추적할 수 있다
- 환산 검증 리포트를 ABAP과 CDS로 구현할 수 있다
📚 미리 알아두면 좋은 배경
FI 전표가 헤더(BKPF)와 라인아이템(BSEG)으로 구성된다는 점, FB60/FB70 같은 전표 입력 트랜잭션과 FAGLL03 같은 라인아이템 조회 화면을 다뤄본 경험이 있으면 충분합니다. ABAP SELECT 문과 CDS 뷰 기초 문법을 알고 있으면 코드 부분을 그대로 따라 할 수 있습니다. 환율 마스터(OB08)를 열어본 경험이 있다면 더 빠르게 이해됩니다.
🔧 환경 및 버전 정보
이 글의 내용은 다음 환경을 기준으로 합니다.
- SAP ECC 6.0 — 추가 회사코드통화 설정은 OB22, 데이터는 BKPF/BSEG 기준
- SAP S/4HANA 2023 (On-Premise) — 통화 설정이 원장 단위(FINSC_LEDGER)로 이동했고, 유니버설 저널 ACDOCA에 최대 10개의 통화 금액 컬럼을 병렬 저장 가능
- SAP S/4HANA Cloud Public Edition — 동일 개념이 적용되나 설정은 Fiori 기반 구성 앱으로 수행
환율 마스터 데이터는 TCURR(환율), TCURV(환율유형), TCURF(환산비율) 테이블에 저장되며 이는 모든 버전에서 공통입니다. 실습에는 개발 시스템의 테스트 회사코드 사용을 권장합니다.
💡 핵심 개념 — 3종 통화와 환산 시점
비유부터 시작하겠습니다. 해외 출장자가 지갑 세 개를 들고 다닌다고 생각해 보세요. 첫 번째 지갑에는 거래 현장에서 실제로 주고받은 통화(USD), 두 번째 지갑에는 소속 법인의 장부 통화(KRW), 세 번째 지갑에는 본사 그룹 연결 통화(EUR)가 들어 있습니다. 핵심은 환전이 거래가 일어난 그 순간, 단 한 번 수행되고 이후에는 다시 바뀌지 않는다는 점입니다. SAP FI 전표도 동일합니다.
| 구분 | 통화유형 | BKPF 필드 | BSEG 금액 필드 | 확정 시점 |
|---|---|---|---|---|
| 전표통화 (Document Currency) | 00 | WAERS | WRBTR | 사용자 입력 그대로 |
| 회사코드통화 (Local Currency) | 10 | HWAER | DMBTR | 전표 저장 시 환산·고정 |
| 그룹통화 (Group Currency) | 30 | HWAE2 | DMBE2 | 전표 저장 시 환산·고정 |
여기서 실무자가 자주 놓치는 포인트가 세 가지 있습니다.
- 환산은 전기(Posting) 시점에 확정됩니다. 전표가 저장되는 순간 DMBTR와 DMBE2가 계산되어 데이터베이스에 고정되고, 이후 OB08에서 환율을 바꿔도 이미 전기된 전표에는 소급 반영되지 않습니다. 기말의 미결항목 재평가는 별도의 외화평가 프로그램(ECC의 FAGL_FC_VAL, S/4HANA의 FAGL_FCV)이 평가 전표를 추가로 생성하는 방식입니다.
- 환율유형과 환산일이 통화별로 다를 수 있습니다. 회사코드통화는 일반적으로 환율유형 M(평균환율)과 전기일 기준으로 환산되지만, 그룹통화는 OB22(ECC) 또는 원장 통화 설정(S/4HANA)에서 별도의 환율유형·환산일(전표일/전기일/환산일)을 지정할 수 있습니다. 전표일과 전기일이 다른 월말 전표에서 두 통화 금액의 "체감 환율"이 달라지는 이유가 이것입니다.
- 환산 기준통화(Source Currency)가 다를 수 있습니다. 그룹통화를 계산할 때 "전표통화 → 그룹통화"로 직접 환산할지, "회사코드통화 → 그룹통화"로 2단계 환산할지를 설정으로 선택합니다. USD→EUR 직접 환율과 USD→KRW→EUR 교차 환율은 미세하게 다르므로, 이 설정 하나로 라인 단위 금액이 달라지고 반올림 차이가 누적됩니다.
정리하면, "잔액이 안 맞아 보인다"는 현상의 대부분은 오류가 아니라 통화별로 환율유형 × 환산일 × 환산 기준이 3차원으로 조합된 결과입니다. S/4HANA에서는 이 구조가 ACDOCA로 확장되어 트랜잭션통화(WSL/RWCUR), 회사코드통화(HSL/RHCUR), 그룹통화(KSL/RKCUR) 외에 자유 정의 통화까지 병렬로 관리됩니다.
💻 실전 코드 3단계
시나리오: 한국 법인(회사코드 KR10, 회사코드통화 KRW, 그룹통화 EUR)이 미국 고객에게 USD로 수출 대금을 청구한 전표를 분석합니다.
1단계 — 기본 예제: 한 전표의 3종 통화 금액 나란히 조회
REPORT zfi_currency_triple.
PARAMETERS: p_bukrs TYPE bukrs DEFAULT 'KR10',
p_belnr TYPE belnr_d OBLIGATORY,
p_gjahr TYPE gjahr DEFAULT '2026'.
SELECT SINGLE waers, hwaer, hwae2, kursf, budat, bldat
FROM bkpf
INTO @DATA(ls_header)
WHERE bukrs = @p_bukrs
AND belnr = @p_belnr
AND gjahr = @p_gjahr.
SELECT buzei, wrbtr, dmbtr, dmbe2, shkzg
FROM bseg
INTO TABLE @DATA(lt_items)
WHERE bukrs = @p_bukrs
AND belnr = @p_belnr
AND gjahr = @p_gjahr.
WRITE: / '전표통화:', ls_header-waers,
/ '회사코드통화:', ls_header-hwaer,
/ '그룹통화:', ls_header-hwae2,
/ '헤더 환율(KURSF):', ls_header-kursf.
LOOP AT lt_items INTO DATA(ls_item).
WRITE: / ls_item-buzei,
ls_item-wrbtr CURRENCY ls_header-waers, " USD
ls_item-dmbtr CURRENCY ls_header-hwaer, " KRW
ls_item-dmbe2 CURRENCY ls_header-hwae2. " EUR
ENDLOOP.
같은 라인에서 WRBTR/DMBTR로 나눠 보면 실제 적용 환율을 역산할 수 있고, DMBE2까지 비교하면 그룹통화 환산이 어떤 기준으로 이뤄졌는지 감을 잡을 수 있습니다.
2단계 — 실무 시나리오: 기대 환율 대비 검증 리포트 (에러 처리·로깅 포함)
월말 결산 때 "그룹통화 금액이 이상하다"는 문의가 오면, 전기일 기준 환율유형 M의 마스터 환율과 실제 저장된 금액을 비교하는 검증이 유용합니다.
DATA: lv_rate TYPE ukurs_curr,
lv_expected TYPE dmbe2,
lv_deviation TYPE p DECIMALS 2.
" 전기일 기준 USD -> EUR 환율 조회 (환율유형 M)
CALL FUNCTION 'READ_EXCHANGE_RATE'
EXPORTING
date = ls_header-budat
foreign_currency = ls_header-waers " USD
local_currency = ls_header-hwae2 " EUR
type_of_rate = 'M'
IMPORTING
exchange_rate = lv_rate
EXCEPTIONS
no_rate_found = 1
no_factors_found = 2
OTHERS = 4.
IF sy-subrc <> 0.
" 환율 미등록 → 결산 차질로 이어지므로 즉시 로그 남기고 중단
MESSAGE e001(zfi_curr)
WITH ls_header-waers ls_header-hwae2 ls_header-budat.
ENDIF.
LOOP AT lt_items INTO ls_item.
lv_expected = ls_item-wrbtr * lv_rate.
lv_deviation = abs( lv_expected - ls_item-dmbe2 ).
IF lv_deviation > '0.05'. " 반올림 허용치 초과
" OB22의 환산일/기준통화 설정 차이가 유력한 원인
WRITE: / |라인 { ls_item-buzei }: 기대 { lv_expected } EUR|,
|실제 { ls_item-dmbe2 } EUR — 환산 기준 점검 필요|.
ENDIF.
ENDLOOP.
편차가 허용치를 넘는 라인이 발견되면, OB22에서 해당 회사코드의 통화유형 30 설정(환율유형·환산일·기준통화)을 확인하는 것이 다음 순서입니다. 편차가 "전표일 환율"과 일치한다면 환산일 설정이 전기일이 아닌 전표일로 되어 있다는 뜻입니다.
3단계 — 프로덕션: ACDOCA 기반 CDS 뷰 (성능·보안 고려)
S/4HANA에서는 BSEG 대신 유니버설 저널 ACDOCA를 읽는 것이 일반적으로 권장됩니다. 통화별 금액이 이미 컬럼으로 병렬 저장되어 있어 조인 없이 비교할 수 있고, 접근제어(DCL)로 회사코드 권한을 강제할 수 있습니다.
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '통화 3종 병렬 비교 (수출 전표 분석용)'
define view entity ZFI_I_CurrencyTriple
as select from acdoca
{
key rldnr as Ledger,
key rbukrs as CompanyCode,
key belnr as JournalEntry,
key gjahr as FiscalYear,
key docln as LineItem,
@Semantics.currencyCode: true
rwcur as TransactionCurrency, -- USD
@Semantics.amount.currencyCode: 'TransactionCurrency'
wsl as AmountInTransCrcy,
@Semantics.currencyCode: true
rhcur as CompanyCodeCurrency, -- KRW
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
hsl as AmountInCoCodeCrcy,
@Semantics.currencyCode: true
rkcur as GroupCurrency, -- EUR
@Semantics.amount.currencyCode: 'GroupCurrency'
ksl as AmountInGroupCrcy,
budat as PostingDate,
bldat as DocumentDate
}
where rldnr = '0L' -- 리딩 원장으로 제한해 불필요한 행 스캔 방지
운영 반영 전 체크 포인트: (1) 원장 필터를 뷰 안에 고정해 실행 시점 풀스캔을 예방하고, (2) DCL로 F_BKPF_BUK 등 회사코드 권한 객체와 매핑하며, (3) CDS Test Double Framework로 "전기일 환율 × WSL ≈ KSL" 검증을 단위 테스트로 자동화해 두면 설정 변경 시 회귀를 조기에 잡을 수 있습니다.
⚠️ 흔한 실수와 트러블슈팅 FAQ
Q1. FB60에서 환율을 수동 입력했는데 그룹통화 금액에는 반영되지 않았습니다.
헤더의 KURSF는 일반적으로 "전표통화 → 회사코드통화" 환산에만 적용됩니다. 그룹통화는 OB22/원장 설정에 지정된 환율유형으로 별도 환산되므로, 수동 환율과 무관하게 마스터 환율이 적용되는 것이 정상 동작입니다.
Q2. 같은 날 전기한 전표인데 회사코드통화와 그룹통화의 체감 환율이 다릅니다.
환산일 설정을 확인하세요. 회사코드통화는 전기일, 그룹통화는 전표일 기준으로 설정되어 있으면 전표일과 전기일이 다른 전표에서 서로 다른 날짜의 환율이 적용됩니다. 월말·월초에 걸친 전표에서 특히 자주 발생합니다.
Q3. OB08에서 환율을 수정했는데 기존 전표 금액이 그대로입니다.
의도된 동작입니다. 환산 금액은 전기 시점에 고정되며 소급 재계산되지 않습니다. 기말 시점의 환율 반영은 외화평가(FAGL_FCV)로 평가 전표를 생성해 처리하는 것이 표준 절차입니다.
Q4. 라인별 그룹통화 금액을 합산하면 헤더 합계와 몇 센트 차이가 납니다.
라인 단위로 독립 환산 후 반올림하기 때문에 발생하는 정상적인 반올림 차이인 경우가 많습니다. 다만 차이가 반올림 범위를 넘는다면 환산 기준통화(직접 환산 vs 2단계 환산) 설정을 의심해야 합니다.
🚀 이어서 살펴보면 좋은 주제
이 글의 개념이 잡혔다면 다음 주제로 확장해 보세요. 외화평가(FAGL_FCV)는 고정된 환산 금액과 기말 환율의 간극을 메우는 표준 절차이고, 병렬 원장과 통화 조합은 IFRS/로컬 GAAP 이중 보고 환경에서 통화 설정이 원장별로 어떻게 갈라지는지 보여줍니다. 제조 환경이라면 Material Ledger의 통화·평가 뷰가 FI 3종 통화와 어떻게 정합성을 맞추는지도 흥미로운 후속 주제입니다. S/4HANA의 자유 정의 통화(최대 10개) 확장도 함께 보면 좋습니다.
📚 더 찾아볼 자료
- SAP Help Portal — SAP S/4HANA On-Premise 제품 문서 (Finance > Currencies)
- SAP Help Portal — S/4HANA Cloud Public Edition 통화 설정 안내
- SAP Help Portal — SAP ERP(ECC) FI 통화 및 환율 문서
- SAP Community — S/4HANA Finance 토픽 (통화유형·ACDOCA 실무 사례)
- SAP Community — ERP Financials (OB22, 외화평가 Q&A)
- SAP for Me — 통화 환산 관련 SAP Note 검색 (지원 계약 필요)
댓글 0
아직 댓글이 없습니다.