재무회계

SAP 가산세·과태료 손익 범주 귀속 점검 — 제재성 비용이 정책표의 범주대로 기록됐는지 견주는 IFRS 18 점검 화면

정책표와 장부 범주 비교 · 확정 안 된 정책 따로 모으기 · 유형별·범주별 집계 · 기간별 일관성 · 정합성 대사 — 소개 영상과 실제 화면 8종, 그리고 CDS 코드까지

소개 영상1분 20초9개 장면음성 안내·자막표지 → 처음 연 화면 → 점검 결과로 거르기 → 유형별 정책 대비 → 범주별 집계 → 기간별 일관성 → 건 상세 → 대사 결과 → 정리

개발 배경 — 이 앱을 사용해야 하는 이유

가산세, 과태료, 과징금, 지체상금, 연체이자. 이름은 제각각이지만 결산에서는 한 덩어리로 불리는 제재성 비용입니다. 이 비용들은 한 달에 몇 건 되지 않아도 장부에서는 세금과공과, 벌과금, 지체상금, 이자비용, 법인세비용처럼 서로 다른 계정에 흩어져 기록되고, 그 계정이 손익계산서의 어느 범주(영업·투자·재무·법인세)로 가는지는 회사의 계정 체계에 달려 있습니다.

재무제표 표시와 공시 기준(IFRS 18, 국내 K-IFRS 제1118호)은 손익을 영업·투자·재무·법인세 같은 범주로 나누어 보이도록 하므로, 어떤 비용이 어느 범주에 놓이는지가 이전보다 더 눈에 띕니다. 시행 시점은 국제 기준 기준으로 2027년 1월 1일로 알려져 있으나 국내 적용 시점과 세부 요구사항은 확인 필요입니다. 이 글은 문단 번호나 해석을 단정하지 않습니다.

현업이 매달 부딪히는 질문은 단순합니다. "이 가산세는 우리가 정한 대로 그 범주에 들어가 있나?" 전표는 총계정원장에, 항목별로 어느 범주에 둘지는 회사의 정책 문서나 엑셀에 흩어져 있습니다. 표준 화면으로 계정별 개별 항목을 열어 엑셀에 붙여 정책표와 맞추는 방식은 건수가 늘수록 놓치는 자리가 생깁니다. 이 화면은 그 자리를 메웁니다. 건마다 장부가 기록한 계정과 범주를 정책표의 범주와 견주고, 같은 항목이 기간에 따라 다른 범주로 옮겨 다녔는지까지 가려 보여 줍니다.

한 줄 요약

이 화면은 회계 결론을 내리지 않습니다. 회사가 정한 정책표와 장부가 같은지, 같은 항목이 기간에 따라 달라지지 않았는지, 합계가 서로 맞는지를 보여 주고 다시 볼 대상을 가립니다. 어느 항목을 어느 범주에 둘지는 회사와 감사인이 판단합니다.

핵심 포인트 여섯 가지

포인트고객이 얻는 것지금 방식이라면
① 건마다 정책표와 견준다장부 계정이 속한 범주와 정책표의 범주를 건별로 비교해 같으면 정상, 다르면 점검 필요로 가립니다.계정별 개별 항목을 열어 엑셀로 옮기고 눈으로 대조합니다.
② 확정 안 된 정책은 따로 둔다정책이 선택 대기이거나 정책표에 없는 항목은 맞고 틀림을 말하지 않고 확인 필요 또는 별도 줄로 모읍니다.정책이 정해지지 않은 항목이 어느 범주에 섞여 들어갔는지 모릅니다.
③ 기간별 일관성을 본다같은 항목이 1월부터 기준월까지 몇 개 범주에 기록됐는지 세어 달에 따라 오간 항목을 가립니다.월마감마다 따로 보므로 달 사이의 흔들림은 연말에야 발견됩니다.
④ 범주 쪽에서도 다시 모은다영업·투자·재무·법인세 범주별로 장부 귀속액과 정책 귀속액의 차이를 보여 줍니다.범주 합계와 항목 합계가 맞는지 따로 맞춰야 합니다.
⑤ 합계를 스스로 검산한다건별·유형별·범주별·점검 결과별 합계와 기간별 누계를 여섯 가지 대사식으로 전수 검사합니다.숫자가 맞는지는 만든 사람의 말에 기댑니다.
⑥ 표준 화면과 오간다전표 조회(FB03)와 G/L 계정 개별 항목(FAGLL03)으로 원천을 오가며 금액을 맞춰 볼 수 있습니다.화면마다 조건을 손으로 다시 넣습니다.

사례로 보는 효과 — 2026년 9월의 22건

가상 회사 두 곳의 2026년 9월에는 제재성 비용 22건, 795.1백만원이 기록되어 있습니다. 표준 리포트로는 계정별 합계까지 보입니다. 이 화면은 그 안에서 정책표와 범주가 다른 건 3건(영향 금액 41.2백만원)과 정책이 선택 대기인 건 2건, 정책표에 없는 건 2건(정책 미설정 금액 13.3백만원)을 먼저 가려 보여 줍니다.

예를 들어 매입채무 연체이자 20,100,000원은 정책표가 재무 범주로 정했는데 장부에는 지체상금 계정(영업)으로 기록되어 있어 점검 필요(G01)로 나옵니다. 부가가치세 가산세 15,300,000원은 정책표가 영업으로 정했는데 법인세 가산세 계정(법인세)에 기록되어 있어 같은 코드로 가려집니다. 이 두 건이 맞는지는 회사와 감사인이 판단할 일이고, 화면은 "정책표와 다르다"는 사실과 금액을 보여 줍니다.

도입하면 달라지는 것

  • 결산 점검 준비 — 계정별 개별 항목을 엑셀에 붙여 정책표와 맞추는 작업이 건별 판정 한 화면으로 줄어듭니다.
  • 회의의 주제 — "어느 계정에 들어갔나"를 찾는 시간이 줄고 "정책표가 맞나, 장부가 맞나"를 논의합니다.
  • 기간 사이의 흔들림 — 같은 항목이 달에 따라 다른 범주로 오가는 일을 월마감에 바로 발견합니다.
  • 정책이 정해지지 않은 자리 — 확인 필요와 정책 미설정이 별도 줄로 남아 정책 정비의 우선순위가 보입니다.

이런 회사에 맞습니다

가산세·과태료·연체이자 같은 제재성 비용을 여러 계정에 나눠 기록하고 있는 회사, 결산 때마다 범주별 귀속을 엑셀로 점검하는 회계·세무팀, 그리고 재무제표 표시 기준 변경에 대비해 계정과 범주의 정책표를 정비하려는 경영지원 조직에 맞습니다.

숫자를 믿을 수 있는가 — 검증 결과

대사식 여섯 가지를 18개 회사·월 단위로 전수 돌린 결과입니다. 대사는 화면 안의 집계가 서로 맞는지 보는 것이고, 정책표 자체의 옳고 그름은 판단하지 않습니다.

대사식검사 건수차이 건수
건별 금액 합계 = 유형별 장부 금액 합계180
유형별 장부 금액 = 영업 + 투자 + 재무 + 법인세 범주 금액180
범주별 장부 귀속 합계 = 건별 금액 합계180
정책 귀속 합계(선택 대기·미설정 포함) = 장부 귀속 합계180
정책 일치 + 불일치 + 선택 대기 + 미설정 = 총 금액180
기간별 일관성 누계 = 1월~기준월 건별 금액 합계180

아래는 의도적으로 넣은 예외입니다. 대사 차이가 아니라 "점검 대상 건수"이며 대사 차이와 섞지 않습니다.

점검용 예외검사 건수점검 대상 건수금액 합계(원)
정책과 다른 범주 기록(점검 필요, G01)1478180,040,000
정책이 선택 대기(확인 필요, G02)1478—
정책표에 없는 항목(점검 필요, G03)1473—

무엇으로 만들었나

자리무엇왜 그렇게 두었나
화면 컨트롤sap.ui.table.Table 5개(탭마다 1개), IconTabBar, 조회조건 필터바, 상세 Dialog행 수가 늘어도 가상 스크롤로 열리고 열 머리 정렬이 그대로 서버 정렬 요청이 됩니다.
데이터 서비스OData V2 서비스 1개(엔티티셋 5개, 펑션 2개)와 서비스 로직(service.js)화면은 서비스 주소만 알고 판정과 집계는 서비스가 맡습니다.
서비스 로직Node 모듈 하나 — 조회·단건·펑션과 날짜 $filter 직접 처리데이터 파일만 바꿔도 같은 서비스가 돕니다.
테마sap_horizon표준 Fiori 화면과 같은 모양입니다.

앱 정보는 아래와 같습니다.

항목내용
업무 영역재무회계(FI) — 재무제표 표시·공시
관련 기준서IFRS 18 재무제표 표시와 공시(K-IFRS 제1118호) (국내 적용 시점·세부 요구사항 확인 필요)
SAP 표준 T-codeFB03 · FAGLL03 · FAGLB03 · FS00 · FBL1N
데이터 연동OData V2 (manifest 의 상대 경로)
테마sap_horizon
화면 성격조회·점검 (결과 CSV 내려받기)

SAP 표준 기능을 그대로 이어받은 부분

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다. 전표 조회(FB03), G/L 계정 개별 항목(FAGLL03)과 잔액(FAGLB03), 거래처 개별 항목(FBL1N)이 가진 데이터를 그대로 이어받고, 정책표와 견주는 한 단계를 더 얹습니다.

법정·공시·감사 대응에 쓰이는 숫자는 표준 거래에 그대로 둡니다. 이 화면의 판정은 "다시 볼 대상"을 가리는 표시이며 최종 판단은 회사와 감사인이 합니다.

사용 방법

  1. 회계연도와 기간(월)을 입력합니다. 이 둘은 필수이고 회사·구분·제재성 항목·장부 범주·전기일 기간·점검 코드·점검 결과는 필요할 때만 고릅니다. 비워 두거나 "전체"이면 그 조건은 걸리지 않습니다.
  2. 조회 버튼은 조회조건 영역의 입력 칸 맨 오른쪽에 있습니다. 입력 칸에서 Enter 키를 눌러도 같은 조회가 실행되고, 처음 열면 자동으로 한 번 조회합니다.
  3. 위쪽 요약 8칸을 먼저 봅니다 — 점검한 건, 금액 합계, 정책과 다른 범주 건, 영향 금액, 확인 필요 건, 정책 미설정 금액, 기간별 범주 혼재 항목, 정합성 대사 차이.
  4. 탭은 건별 판정 → 유형별 정책 대비 → 범주별 집계 → 기간별 일관성 → 대사 결과 순서로 봅니다.
  5. 건별 판정에서 행을 누르면 상세 창이 열려 전표 내용, 장부 기록, 정책표 내용과 같은 항목의 올해 기록을 함께 볼 수 있습니다.
  6. "CSV 내려받기"는 지금 보고 있는 탭의 조회 결과를 파일로 저장합니다.

실행 화면

실제로 돌아가는 화면 8종을 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리인지 아래에 적었습니다. 숫자는 모두 같은 자료에서 나온 것이라 화면끼리 서로 맞춰 보셔도 됩니다.

처음 열었을 때

처음 연 화면
처음 연 화면 — 조회조건·요약 8칸·건별 판정 탭이 한 화면에 열린 모습입니다. 조회 버튼은 입력 칸 오른쪽 끝에 있습니다.

처음 열면 2026년 9월 전체가 자동 조회되어 22건이 나옵니다. 위쪽 요약 8칸은 점검한 건 22, 금액 합계 795.1백만원, 정책과 다른 범주 건 3, 영향 금액 41.2백만원, 확인 필요 건 2, 정책 미설정 금액 13.3백만원, 기간별 범주 혼재 항목 7, 정합성 대사 차이 0입니다. 표는 건별 판정이고 점검 결과가 정상이 아닌 줄은 색으로 먼저 눈에 들어옵니다.

정책과 다른 건을 가려내기

점검 결과로 거르기
점검 결과로 거르기 — 점검 결과를 "점검 필요"로 고르면 정책표와 장부 범주가 다르거나 정책표에서 정하지 못한 건만 남습니다.

점검 결과를 바꾸고 조회를 누르면 같은 표가 5건으로 줄어듭니다. 부가가치세 가산세와 매입채무 연체이자, 리스료 연체이자는 장부 범주가 정책 범주와 달라 G01로, 정책표에 없는 기타 가산금 두 건은 G03으로 가려집니다. 요약 칸의 값은 조건에 맞는 건만 다시 셉니다.

유형·범주별로 다시 모으기

유형별 정책 대비
유형별 정책 대비 — 제재성 항목 유형마다 정책 범주와 상태, 범주별 장부 금액을 나란히 보여줍니다.

회사와 항목 유형 단위로 한 줄입니다. 정책 범주와 정책 상태(확정·선택 대기·미설정)가 앞에 오고, 그 뒤로 영업·투자·재무·법인세 범주에 실제로 기록된 금액이 이어집니다. 정책이 선택 대기인 항목은 확인 필요(P01), 정책표에 없는 항목은 점검 필요(P02), 장부 범주가 정책과 다른 건이 있으면 점검 필요(P03)로 표시합니다.

범주별 집계
범주별 집계 — 영업·투자·재무·법인세 범주별 장부 귀속액과 정책 귀속액을 견주고 차이를 보여줍니다.

같은 금액을 범주 쪽에서 다시 모은 탭입니다. 장부 귀속액에서 정책 귀속액을 뺀 값이 차이 열이며, 0이 아니면 점검 필요(F01)입니다. 정책이 선택 대기인 금액과 정책표에 없는 금액은 영업·재무 같은 범주에 섞지 않고 "선택 대기"와 "정책 미설정" 줄로 따로 모읍니다.

기간 사이의 흔들림

기간별 일관성
기간별 일관성 — 같은 항목이 1월부터 기준월까지 몇 개 범주에 기록됐는지 보여줍니다.

합계가 맞아도 같은 항목이 달에 따라 영업과 재무로 오가면 비교 가능성이 흔들립니다. 이 탭은 항목별로 기록된 월수, 범주 수, 범주별 건수와 누계 금액을 보여주고 둘 이상이면 점검 필요(R01)로 가립니다. 정책이 선택 대기인 항목이 여러 범주에 나뉘면 확인 필요(R02)입니다.

건 상세와 대사

건 상세 창
건 상세 창 — 행을 누르면 전표 내용, 장부 기록, 정책표 내용과 같은 회사·같은 항목의 올해 기록이 열립니다.

매입채무 연체이자 한 건을 열면 전표 텍스트, 장부 기록(계정과 범주), 정책표(범주와 상태), 금액과 영향 금액, 점검 결과가 위에 놓이고, 아래에는 같은 회사·같은 항목의 올해 기록이 월별로 따라옵니다. 이 건이 일회성인지 되풀이인지를 그 자리에서 가늠할 수 있습니다.

대사 결과
대사 결과 — 화면의 합계가 서로 맞는지 여섯 가지 대사식으로 확인합니다.

대사식마다 좌·우 금액, 검사 건수, 차이 건수, 최대 차이가 한 줄입니다. 여섯 식 모두 차이 0건입니다. 대사는 화면 안의 집계가 서로 맞는지 보는 것이며 정책표 자체가 맞는지는 알 수 없으므로, 정책과 다른 범주 기록은 대사 차이가 아니라 점검 대상으로 따로 셉니다.

좁은 화면

좁은 화면
좁은 화면 — 폭이 좁아도 조회조건이 줄바꿈되어 모두 보이고 표는 가로로 스크롤됩니다.

창 폭이 760px 이하로 좁아지면 조회조건이 여러 줄로 접히고 요약은 두 줄로 나뉩니다. 탭 구성과 판정은 그대로입니다.

화면 뒤에서 일어나는 일

단계무슨 일이 일어나나
조회조건 → 요청화면은 입력값을 sap.ui.model.Filter 로만 만들어 모델에 넘깁니다. 회계연도·기간은 항상 걸리고 "전체"인 조건은 Filter 를 만들지 않습니다. 열 머리를 누르면 같은 요청에 정렬이 붙습니다.
요약 8칸정책과 다른 범주 건과 영향 금액은 서비스 펑션 2개로 받고 나머지는 조회 결과를 한 곳에서 합산합니다. 표를 CSV 로 내려받을 때도 같은 컬럼 정의를 씁니다.
상세 창행의 바인딩 컨텍스트를 상세 창에 그대로 연결하고, 같은 회사·같은 항목의 올해 기록은 키 필터로 한 번 더 조회합니다.

판정 규칙 — 조건 → 결과 상태 → 사용자 조치

"점검 필요"는 다시 볼 대상을 가리는 표시이며 잘못되었다는 뜻이 아닙니다.

대상점검 코드판정 조건결과 상태사용자 조치
건별G00장부 범주가 정책표의 범주와 같음정상조치 없음
건별G01장부 범주가 정책표의 범주와 다름점검 필요기록한 계정과 범주를 회사가 다시 본다
건별G02정책 범주가 선택 대기확인 필요회사가 정책표에 범주를 먼저 정한다
건별G03정책표에 항목 유형이 없음점검 필요정책표에 항목을 추가할지 확인한다
유형별P00~P03발생 없음·정상 / 선택 대기 / 정책표 없음 / 장부 범주가 정책과 다른 건 있음정상·확인 필요·점검 필요건별 판정 탭에서 해당 건을 확인한다
범주별F00~F03장부 귀속액과 정책 귀속액이 같음 / 다름 / 선택 대기 금액 / 정책표에 없는 항목 금액정상·점검 필요·확인 필요차이의 원인 건을 건별 탭에서 찾는다
기간별R00~R03같은 범주 / 기간에 따라 다른 범주 / 선택 대기 항목이 여러 범주 / 일관되나 정책과 다름정상·점검 필요·확인 필요일관 적용 여부를 회사가 확인한다

처리 단계와 대사식

  1. 정책표 대응 — 건마다 제재성 항목 유형을 정책표에서 찾아 정책 범주와 상태(확정·선택 대기·미설정)를 가져옵니다. 없으면 점검 필요(G03)로 남깁니다.
  2. 장부 범주 — 건의 계정이 속한 손익 범주를 계정 매핑에서 가져옵니다. 매핑은 회사가 정의합니다.
  3. 귀속 비교 — 장부 범주와 정책 범주를 견주어 다르면 G01, 선택 대기이면 G02 로 표시하고 다른 건의 금액은 영향 금액이 됩니다.
  4. 유형별·범주별 집계 — 회사·월·항목 유형별로 영업·투자·재무·법인세 범주 금액을 모읍니다.
  5. 기간별 일관성 — 1월부터 기준월까지 같은 항목이 몇 개 범주에 기록됐는지 세고 둘 이상이면 R01 로 표시합니다.
  6. 정합성 대사 — 여섯 가지 대사식을 전수로 돌립니다. 차이는 0 이어야 합니다.

조회조건

조회조건필수기본값$filter 변환적용 탭
회계연도필수2026Gjahr eq '2026'전체
기간(월)필수09Monat eq '09'전체
회사선택전체Bukrs eq '1000'대사 결과 제외
구분선택전체GroupCode eq 'TX'건별 판정
제재성 항목선택전체ChargeType eq 'TX03'건별·유형별·기간별
장부 범주선택전체BookCat eq 'FIN'건별·범주별
전기일 시작·종료선택비어 있음PostDate ge datetime'…' and PostDate le datetime'…'건별 판정
점검 코드선택전체CheckCode eq 'G01'코드가 속한 탭
점검 결과선택전체CheckStatus eq 'CHECK'건별·유형별·범주별·기간별

결과 컬럼

컬럼의미·산출식
회사·전표번호어느 회사의 어느 전표인지
제재성 항목·구분세무·규제·계약·기타 가운데 어느 유형인지
점검 결과정상 · 점검 필요 · 확인 필요
금액(원)장부에 기록된 금액
장부 범주 · 정책 범주장부 계정이 속한 범주와 정책표의 범주(영업·투자·재무·법인세)
영향 금액장부 범주가 정책과 다른 건의 금액(다르지 않으면 0)
계정 · 계정 이름 · 전기일 · 상대방전표 라인의 원천 정보
점검 코드G·P·F·R 코드. 의미는 판정 규칙 표와 같음

좁은 화면에서 달라지는 것

창 폭이 760px 이하로 좁아지면 조회조건이 여러 줄로 접히고 요약은 두 줄로 나뉘며 표는 가로로 스크롤됩니다. 탭 구성과 판정은 그대로입니다.

파일 구성

앱 폴더/
├─ index.html            앱 진입점
├─ readme.html           설명서
├─ Component.js · manifest.json
├─ controller/           BaseController · Main.controller
├─ view/                 Main.view.xml · DetailDialog.fragment.xml
├─ model/                formatter · ErrorHandler
├─ css/ · i18n/
├─ odata/finecat_srv/    metadata.xml · service.js · json/ (엔티티셋별 데이터)
├─ media/                소개 영상 · 포스터
└─ test/                 예시 데이터로 화면을 띄우는 전용 폴더

SAP 표준 기능 확장 포인트

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다. 표준이 이미 잘하는 일은 표준에 맡기고 표준이 끊기는 자리만 이어 붙이는 쪽으로 만들었습니다.

표준으로 되는 것과 안 되는 것

하고 싶은 일SAP 표준표준에서 걸리는 자리이 앱이 하는 일
전표에서 제재성 비용 확인FB03전표를 하나씩 열어야 한다항목·계정·범주를 한 줄로 모아 정책표와 견준다
계정 개별 항목FAGLL03계정 기준이라 항목 유형별 정책과 맞춰 볼 수 없다계정 라인에 정책 범주를 붙여 다르면 가린다
계정 잔액 대조FAGLB03잔액은 보이지만 범주 정책과의 차이는 안 나온다범주별 장부 귀속액과 정책 귀속액의 차이를 보인다
계정 마스터 확인FS00계정이 어느 손익 항목에 매핑되는지 화면에서 견줄 수 없다계정 매핑을 따라 장부 범주를 정한다
거래처 개별 항목FBL1N거래처 기준이라 정책 범주 판정이 없다연체이자·지체상금의 상대방을 건에 붙여 보인다
기간별 범주 일관성—표준에 없다. 보통 엑셀로 만든다항목별로 몇 개 범주에 기록됐는지 세어 가린다

T-code 별 연계 지점

맞닿은 표준 T-code 마다 이 앱이 이어받는 데이터와 두 화면 숫자를 맞춰 보는 지점입니다. 법정·감사 대응은 표준에 남겨 두므로 기존 리포트를 없앨 필요가 없습니다.

표준 T-code이름연계 지점
FB03전표 조회건별 판정의 행이 어느 전표에서 왔는지 확인한다. 전표번호를 오가며 금액이 같은지 맞춘다.
FAGLL03G/L 계정 개별 항목같은 계정·같은 기간 조건으로 열어 라인 합계가 이 앱의 건별 금액 합계와 같은지 대조한다.
FAGLB03G/L 계정 잔액 표시범주별 집계의 장부 귀속액을 계정 잔액과 맞춘다. 다르면 계정 매핑부터 본다.
FS00G/L 계정 마스터 유지보수계정이 어느 손익 항목에 매핑되는지 확인한다. 새 계정은 매핑에 추가한다.
FBL1N거래처 개별 항목 조회연체이자·지체상금 상대방의 전표를 확인한다.

S/4HANA 분석 스택과의 자리

표준 CDS 분석 쿼리나 Fiori 분석 앱은 계정 잔액과 손익 구조를 보는 데 강합니다. 이 화면은 그 위에 "정책표와 장부가 같은가"라는 하나의 질문을 얹은 점검용 화면입니다. 분석 쿼리의 결과와 이 앱의 집계가 같은 원천에서 나오도록 CDS 구성을 맞추면 두 화면의 숫자를 대조할 수 있습니다.

Analysis for Office 같은 도구로 같은 데이터를 피벗으로 열어 볼 수도 있습니다. 판정(G·P·F·R 코드)과 정책표 대응은 이 앱의 서비스가 맡고 피벗 도구에서는 집계 값 위주로 확인하는 구분을 권합니다.

요구사항 매핑표

관련 기준은 IFRS 18 재무제표 표시와 공시(K-IFRS 제1118호)이며 문단 번호는 적지 않았습니다. 확인하지 못한 항목은 "확인 필요"입니다.

기준서·요구사항내용대응 기능원천 데이터비고
IFRS 18 재무제표 표시와 공시손익을 영업·투자·재무·법인세 범주로 나누어 표시정책표 범주와 장부 범주 비교(G01), 범주별 집계정책표, 계정 매핑범주 판단은 회사와 감사인, 세부 요구사항 확인 필요
범주 간 일관된 분류같은 성격의 항목을 기간마다 같은 범주에 기록기간별 일관성(R01~R03)전표 라인, 정책표정당한 변경 사유는 회사가 확인
정책이 정해지지 않은 항목범주를 정하지 못한 항목은 따로 식별확인 필요(G02), 정책 미설정(G03), 별도 줄(F02·F03)정책표국내 적용 시점 확인 필요
표시 금액의 합계 일치화면 안의 집계가 서로 맞는지대사 6종건별·유형별·범주별 집계원천 장부와의 일치는 연결 후 별도 확인

확장 포인트 — 운영에서 실제로 손대는 자리

자리무엇을 정하나비고
제재성 항목 정책표항목 유형별 정책 범주와 상태를 어디에 둘지(커스텀 테이블 또는 기존 마스터 확장)확인 필요 — 정책표가 없으면 판정이 시작되지 않습니다
계정 매핑제재성 비용 계정이 어느 손익 범주로 가는지FS00 에서 확인하고 새 계정은 매핑에 추가
항목 식별 방법전표 라인에서 제재성 항목 유형을 가르는 방법(전용 계정·텍스트 약속·확장 필드)확인 필요 — 회사마다 다릅니다
법인세 관련 항목법인세 가산세를 어느 범주로 둘지와 그 근거회사와 감사인이 판단
권한회사코드 권한을 집계 뷰에 거는 방법집계 단계에 걸어야 합계로 새지 않습니다

CDS 구성

이 사례의 화면은 데이터 파일을 서비스 로직이 읽어 돌려줍니다. 운영 데이터에서는 집계를 CDS 로 내립니다. 아래는 그때 만드는 뷰들을 레이어 순서대로 적은 것입니다. 코드는 스케치이며 필드 이름과 표준 뷰 이름은 릴리스·환경에 따라 다르므로 그대로 붙여 넣기 전에 View Browser 로 실제 이름을 확인해야 합니다. 확인이 필요한 자리는 주석에 적었습니다. 뷰 이름은 고객 네임스페이스(Z)를 가정한 예입니다.

뷰 레이어 구성

레이어뷰하는 일왜 나누나
기준ZFC_POLICY항목 유형별 정책 범주·상태·유효기간정책이 바뀌면 행만 더하면 되고 지난 기간은 그 시점의 행으로 읽습니다.
기준ZFC_ACCTMAP계정 → 손익 범주 매핑계정은 늘 늘어납니다. 코드에 박으면 개발자를 불러야 합니다.
차원ZI_FcPolicyDim유효기간까지 읽는 정책 차원조회 기준일에 유효한 정책 한 줄만 뽑습니다.
큐브ZI_FcChargeCube전표 라인에 정책과 장부 범주를 붙여 건별 판정 값을 만듦판정 값을 한 곳에서만 정의합니다.
집계ZI_FcTypeCat유형별·범주별 집계화면이 들고 합치던 일을 DB 로 내립니다.
소비ZC_FcCharge화면이 읽는 모양(이름·텍스트·주석)서비스 노출 이름과 표시 정보를 모읍니다.
권한ZI_FCCHARGE (DCL)회사코드 권한집계를 읽는 자리에 걸어야 뺄셈으로 새지 않습니다.

① 항목 유형별 정책표 — 기준 데이터

정책표는 이 앱의 모든 판정이 기대는 기준입니다. 회사가 항목 유형마다 정책 범주와 상태를 유효기간과 함께 둡니다. 범주가 바뀌면 행을 더하기만 하고 지난 기간은 그 시점에 유효했던 행으로 읽습니다. 이 표가 비어 있거나 항목이 빠지면 G03(정책표에 없음)이 늘어납니다.

" ─────────────────────────────────────────────────────────────
"  ZFC_POLICY — 제재성 항목 정책표 (기준 데이터)
"  항목 유형마다 정책 범주와 상태를 유효기간과 함께 둔다.
"  CAT   : OPER 영업 / INV 투자 / FIN 재무 / TAX 법인세
"  STATE : SET 확정 / CONF 선택 대기(회사가 아직 정하지 못함)
"  정책표에 행이 없으면 UNSET(미설정)으로 읽는다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '제재성 항목 정책표'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zfc_policy {
  key client     : abap.clnt not null;
  key bukrs      : bukrs not null;
  key chargetype : abap.char(4) not null;
  key valid_to   : abap.dats not null;
  valid_from     : abap.dats;
  pol_cat        : abap.char(4);   " 선택 대기이면 비움
  pol_state      : abap.char(5);   " SET / CONF
  changed_by     : abp_lastchange_user;
}
" 확인 필요: 정책 변경 이력과 승인 절차는 회사 내부 통제에 맞춰 정한다.

② 계정 매핑 — 어느 손익 범주로 가는가

장부 범주는 계정에서 정해집니다. 매핑을 코드에 박지 않고 표로 두면 새 계정이 생겨도 회계팀이 한 줄만 더하면 됩니다. 매핑이 없는 계정은 미분류로 떨어져 대사 차이로 드러납니다.

" ─────────────────────────────────────────────────────────────
"  ZFC_ACCTMAP — 계정 → 손익 범주 매핑
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '제재성 비용 계정 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
define table zfc_acctmap {
  key client  : abap.clnt not null;
  key ktopl   : ktopl not null;     " 계정과목표
  key saknr   : saknr not null;     " G/L 계정
  book_cat    : abap.char(4);       " OPER / INV / FIN / TAX
  charge_type : abap.char(4);       " 전용 계정이면 항목 유형을 함께 둔다(확인 필요)
}
" SM30 유지보수 뷰를 함께 만들어 회계팀이 직접 넣게 한다.

③ 정책 차원 — 유효기간까지 읽는 뷰

조회 기준일에 유효한 정책 한 줄만 뽑는 뷰입니다. 정책표에 행이 없는 항목은 UNSET 으로 돌려야 하므로 기준 항목 목록에 left outer join 을 겁니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '정책 차원'
define view entity ZI_FcPolicyDim
  with parameters p_keydate : abap.dats
  as select from zfc_policy as Pol
{
  key Pol.bukrs      as CompanyCode,
  key Pol.chargetype as ChargeType,
      Pol.pol_cat    as PolicyCategory,
      case
        when Pol.pol_state = 'SET'  then 'SET'
        when Pol.pol_state = 'CONF' then 'CONF'
        else 'UNSET'
      end            as PolicyState
}
where Pol.valid_from <= $parameters.p_keydate
  and Pol.valid_to   >= $parameters.p_keydate
" 확인 필요: 정책표에 없는 항목을 UNSET 으로 돌리는 방식(기준 항목 목록과의 outer join)은 환경에 맞춰 구성한다.

④ 건별 큐브 — 판정 값을 만드는 곳

전표 라인에 정책과 장부 범주를 붙여 건별 판정을 한 곳에서 정의합니다. 같은 판정이 화면과 서비스에 두 번 구현되면 언젠가 어긋납니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@EndUserText.label: '제재성 비용 건 큐브'
define view entity ZI_FcChargeCube
  with parameters p_keydate : abap.dats
  as select from I_JournalEntryItem as Item
    inner join   zfc_acctmap        as Map on Map.saknr = Item.GLAccount
    left outer join ZI_FcPolicyDim( p_keydate : $parameters.p_keydate ) as Pol
       on  Pol.CompanyCode = Item.CompanyCode
       and Pol.ChargeType  = Map.charge_type
{
  key Item.CompanyCode,
  key Item.FiscalYear,
  key Item.AccountingDocument,
  key Item.LedgerGLLineItem,
      Item.PostingDate,
      Item.GLAccount,
      Map.charge_type                         as ChargeType,
      Map.book_cat                            as BookCategory,
      Pol.PolicyCategory,
      coalesce( Pol.PolicyState, 'UNSET' )    as PolicyState,
      @Semantics.amount.currencyCode: 'CompanyCodeCurrency'
      Item.AmountInCompanyCodeCurrency        as Amount,
      Item.CompanyCodeCurrency,
      case
        when Pol.PolicyState is null          then 'G03'
        when Pol.PolicyState = 'CONF'         then 'G02'
        when Pol.PolicyCategory = Map.book_cat then 'G00'
        else 'G01'
      end                                     as CheckCode
}
" 확인 필요: I_JournalEntryItem 의 금액 필드와 부호 규칙, 레저(0L) 조건은 릴리스에 맞춰 확인한다.

⑤ 유형별·범주별 집계

유형별 정책 대비와 범주별 집계는 같은 건별 큐브를 다른 축으로 모은 것입니다. 정책이 선택 대기이거나 미설정인 금액은 영업·재무 범주에 섞지 않고 별도 범주로 모읍니다.

@EndUserText.label: '범주별 집계'
define view entity ZI_FcTypeCat
  with parameters p_keydate : abap.dats
  as select from ZI_FcChargeCube( p_keydate : $parameters.p_keydate ) as C
{
  key C.CompanyCode,
  key C.FiscalYear,
  key substring( cast( C.PostingDate as abap.char(8) ), 5, 2 ) as FiscalPeriod,
  key case C.PolicyState
        when 'CONF'  then 'CONF'
        when 'UNSET' then 'NONE'
        else C.BookCategory
      end                                    as BookBucket,
      count( * )                             as ChargeCount,
      @Semantics.amount.currencyCode: 'CompanyCodeCurrency'
      sum( C.Amount )                        as BookAmount,
      C.CompanyCodeCurrency
}
group by C.CompanyCode, C.FiscalYear, C.PostingDate, C.PolicyState, C.BookCategory, C.CompanyCodeCurrency
" 확인 필요: 월 추출 표현과 group by 구성은 릴리스에서 지원하는 CDS 표현으로 맞춘다.

⑥ Consumption 뷰 — 화면이 읽는 모양

화면이 읽는 이름과 텍스트, 필터 대상 주석을 모으는 뷰입니다. 건별 판정 값은 큐브에서 정해졌으므로 여기서는 이름과 표시 정보만 붙입니다.

@EndUserText.label: '제재성 비용 건 조회'
@Metadata.allowExtensions: true
@ObjectModel.usageType.sizeCategory: #XL
define view entity ZC_FcCharge
  with parameters p_keydate : abap.dats
  as select from ZI_FcChargeCube( p_keydate : $parameters.p_keydate ) as C
{
  @UI.lineItem: [{ position: 10 }]
  key C.CompanyCode,
  key C.FiscalYear,
  key C.AccountingDocument,
  key C.LedgerGLLineItem,
  @UI.selectionField: [{ position: 10 }]
  C.ChargeType,
  @UI.lineItem: [{ position: 40, criticality: 'CheckCrit' }]
  C.CheckCode,
  C.BookCategory,
  C.PolicyCategory,
  C.Amount,
  case C.CheckCode
    when 'G00' then 3   " 정상
    when 'G02' then 2   " 확인 필요
    else 1              " 점검 필요
  end as CheckCrit
}

⑦ DCL 과 서비스 — 권한과 노출

권한은 집계를 읽는 자리에 겁니다. 건 상세에만 걸면 합계에서 다른 회사 숫자가 새어 나옵니다.

@EndUserText.label: '제재성 비용 권한'
@MappingRole: true
define role ZI_FCCHARGE {
  grant select on ZI_FcChargeCube
    where CompanyCode = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}

@EndUserText.label: '제재성 비용 점검 서비스'
define service ZUI_FC_CHECK_O2 {
  expose ZC_FcCharge as ChargeSet;
  expose ZI_FcTypeCat as CatSet;
}
" 바인딩: OData V2 - UI  (프로젝트 환경에 맞게 Service Binding 에서 게시)
" 확인 필요: 유형별 정책 대비·기간별 일관성·대사 뷰는 같은 방식으로 추가한다.

운영 시점에 해야 할 일

개발보다 정하는 일이 많습니다.

해야 할 일무엇을 정하나정하지 않으면누가
계정 매핑 확정어느 계정이 어느 손익 범주로 가는지화면 숫자가 기존 장부 리포트와 어긋나 첫 회의에서 막힙니다회계팀
제재성 항목 정책표 작성항목 유형별 정책 범주·상태·유효기간판정이 시작되지 않거나 G03 이 수두룩합니다회계팀 · 세무팀
항목 식별 방법전표에서 제재성 항목을 가르는 약속가산세와 일반 세금이 섞여 건수가 틀어집니다회계팀 · IT
법인세 관련 항목의 범주가산세·이자를 어느 범주로 둘지정책표를 채울 수 없습니다회사와 감사인
선택 대기 항목의 확정 시한정책이 비어 있는 항목을 언제까지 정할지확인 필요가 계속 쌓입니다경영지원
권한 기준회사코드 권한을 집계에 거는 방법합계로 다른 회사 숫자가 드러납니다보안·권한
성능 기준첫 조회 응답 시간전표가 늘면 첫 조회가 느려집니다IT

운영 데이터로 갈 때

운영 전표가 수천만 건이면 집계는 CDS 쪽에서 끝내고 화면에는 건·유형·범주 단위만 보냅니다. 회계연도와 기간을 필수 파라미터로 두어 전체 스캔을 막고, 전표 라인의 계정·전기일에 인덱스가 있는지 확인합니다.

응답 시간 기준은 운영 규모에서 정하고, 큐브를 실시간 뷰로 둘지 야간 적재 테이블로 둘지는 그 기준과 정책표 변경 빈도로 결정합니다. 대용량에서는 페이지 단위로 받는 $top·$skip 요청이 화면의 기본 동작입니다.

자주 묻는 질문

도입 상담과 검토 자리에서 자주 나오는 질문 28개를 주제별로 묶었습니다.

숫자와 산식

이 화면의 숫자는 실제 회사 자료인가요?

아닙니다. 가상 회사 두 곳과 2026년 1~9월의 가상 제재성 비용 건 147건으로 만든 예시 데이터입니다. 실제 고객사의 금액이나 거래처 정보는 쓰지 않았습니다. 도입할 때는 같은 구조의 원천 데이터로 바꿔 끼웁니다.

"점검 필요"로 나오면 잘못 기록했다는 뜻인가요?

아닙니다. 점검 필요는 장부 범주가 회사 정책표와 다르거나 정책표에서 정하지 못한 건을 다시 볼 대상으로 가리는 표시입니다. 정책표가 낡았을 수도, 장부가 맞을 수도 있습니다. 이 화면은 점검 도구이며 최종 판단은 회사와 감사인이 합니다.

"확인 필요"는 무엇인가요?

정책 범주를 회사가 아직 확정하지 못한 항목입니다. 정책이 정해지기 전에는 맞고 틀림을 말할 수 없으므로 확인 필요로 남겨 둡니다. 가상 데이터에서는 납품 지체상금이 그런 항목이고, 2026년 9월 화면에는 2건이 나옵니다.

정책과 다른 범주 건과 영향 금액은 어떻게 세나요?

건별 판정에서 장부 범주가 정책 범주와 다른 건이 "정책과 다른 범주 건"이고, 그 건들의 금액 합이 영향 금액입니다. 2026년 9월에는 3건, 41,170,000원(41.2백만원)입니다. 정책이 선택 대기이거나 정책표에 없는 건은 비교 대상이 없으므로 영향 금액에 넣지 않습니다.

정책 미설정 금액은 어디서 오나요?

정책표에 항목 유형 자체가 없는 건의 금액입니다. 가상 데이터의 기타 가산금이 그 예이며 2026년 9월에는 13.3백만원입니다. 범주를 단정할 수 없어 영업이든 재무든 어느 범주에도 섞지 않고 따로 모읍니다.

대사 차이가 0 이면 모든 게 맞는 건가요?

아닙니다. 대사는 화면 안의 집계가 서로 맞는지 보는 것이고, 정책표 자체가 맞는지는 대사가 알 수 없습니다. 그래서 정책과 다른 범주 기록은 대사 차이가 아니라 점검 대상으로 따로 셉니다.

금액 단위는 무엇인가요?

표는 원 단위이고 위쪽 요약의 금액 합계와 영향 금액은 백만원 단위입니다. 요약 칸 아래에 단위가 적혀 있습니다.

화면과 조작

조회 버튼이 어디에 있나요?

조회조건 영역의 입력 칸 맨 오른쪽에 조회와 초기화 버튼이 있습니다. 입력 칸에서 Enter 키를 눌러도 같은 조회가 실행됩니다.

조건을 비우면 어떻게 되나요?

"전체"로 두거나 비워 두면 그 조건은 요청에 들어가지 않습니다. 회계연도와 기간(월)만 필수입니다.

전기일 조건은 어떻게 걸리나요?

전기일 시작·종료는 날짜 $filter 로 서비스에 전달되고, 서비스 로직이 건별 판정의 전기일에 직접 걸러냅니다. 시작만 또는 종료만 넣어도 됩니다.

CSV 에는 무엇이 내려오나요?

지금 보는 탭의 조회 결과가 화면 컬럼 정의 그대로 CSV 로 내려옵니다. 조회조건이 그대로 적용됩니다.

휴대폰이나 좁은 창에서도 쓸 수 있나요?

쓸 수 있습니다. 760px 이하에서 조회조건이 줄바꿈되고 표가 가로 스크롤됩니다. 상세 창도 같은 방식으로 열립니다.

건 상세 창에서는 무엇을 보나요?

전표 텍스트, 장부 기록(계정과 범주), 정책표(범주와 상태), 금액과 영향 금액, 점검 결과, 그리고 같은 회사·같은 항목의 올해 월별 기록입니다. 일회성인지 되풀이인지 가늠하는 용도입니다.

분석 관점

가산세와 과태료를 모두 같은 범주로 보나요?

아닙니다. 항목 유형마다 정책 범주를 따로 둡니다. 법인세와 관련된 가산세인지 그렇지 않은 제재성 비용인지에 따라 회사가 정하는 범주가 다를 수 있고, 이 화면은 그 정책표를 기준으로 장부와 견줄 뿐입니다.

기간별 일관성은 무엇을 보나요?

같은 제재성 항목이 1월부터 기준월까지 몇 개 범주에 기록됐는지 봅니다. 둘 이상이면 점검 필요(R01)로 표시하지만 정당한 사유가 있을 수 있어 회사가 확인합니다. 정책이 선택 대기인 항목이 여러 범주에 나뉘면 확인 필요(R02)입니다.

영업 범주에서 재무 범주로 옮긴 연체이자는 문제인가요?

이 화면은 문제라고 단정하지 않습니다. 정책표가 재무 범주로 정한 매입채무 연체이자가 어느 달에는 지체상금 계정에, 어느 달에는 연체이자 계정에 기록됐다면 정책표와 다른 기록이 있다는 사실을 보여 줍니다. 어느 쪽이 맞는지는 회사와 감사인이 판단합니다.

기준서의 어느 문단을 근거로 하나요?

이 글은 문단 번호를 단정하지 않습니다. 재무제표 표시와 공시를 다루는 IFRS 18(K-IFRS 제1118호)이 관련 기준이며 국제 기준의 시행일과 국내 적용 시점, 세부 요구사항은 확인 필요입니다. 도입 전에 회사와 감사인이 원문으로 확인해야 합니다.

이 도구가 회계 판단을 대신해 주나요?

아닙니다. 점검 도구이며 최종 판단은 회사와 감사인이 합니다. 화면은 정책표와 장부가 같은지, 합계가 맞는지만 보여 주고 어느 범주가 옳은지 단정하지 않으며 분개나 범주 변경도 하지 않습니다.

도입과 운영

누가 쓰는 화면인가요?

재무회계·세무·관리회계 담당자가 결산 때 쓰고, 경영지원 부서와 감사인 대응 담당자가 정책표 대조 결과를 확인하는 용도입니다. 현업이 새로 배울 것은 조회조건 입력과 행 클릭 정도입니다.

표준 리포트를 없애야 하나요?

아닙니다. 법정·공시·감사 대응은 표준 T-code(FB03·FAGLL03·FAGLB03 등)에 그대로 둡니다. 이 앱은 표준 데이터를 이어받아 정책표와의 대조 관점을 더하는 점검용입니다.

연결에는 무엇이 필요한가요?

전표 라인(제재성 비용 계정), 계정 매핑, 제재성 항목 정책표, 거래처 정보 네 가지입니다. 원천 필드와 위치는 회사마다 달라 확인 필요이며, 정책표와 매핑을 정하는 일이 개발보다 오래 걸립니다.

제재성 항목은 어떻게 식별하나요?

전표 라인만으로는 가산세와 일반 세금을 가르기 어렵습니다. 전용 계정을 두거나 전표 텍스트·참조 필드로 구분하는 약속, 또는 확장 필드가 필요하며 회사마다 달라 확인 필요입니다.

권한은 어떻게 거나요?

회사코드 권한을 집계 단계의 DCL 에 겁니다. 건 상세에만 걸면 합계를 통해 다른 회사 숫자가 새므로 집계 뷰에서 걸어야 합니다.

전표가 많아져도 괜찮나요?

집계는 서비스(CDS) 쪽에서 하고 화면은 건·유형·범주 단위만 받습니다. 대용량에서는 회계연도·기간을 필수 파라미터로 두고 집계 뷰에 필요한 인덱스를 확인합니다. 응답 시간 기준은 운영 규모에서 정합니다.

정책표가 바뀌면 어떻게 하나요?

정책표만 고치면 다음 조회부터 새 기준으로 판정됩니다. 지난 기간은 정책표 이력을 두어 그 시점 기준으로 다시 조회할 수 있게 설계하는 편이 좋습니다.

계정 체계가 바뀌면요?

계정 매핑 한 곳만 고치면 됩니다. 새 계정이 생겼는데 매핑이 없으면 범주별 집계에서 미분류로 나타나 대사 차이로 드러납니다.

운영 데이터로 가기 전에 꼭 확인할 것은?

정책표의 완성도와 계정 매핑, 제재성 항목을 가르는 방법, 법인세 관련 항목의 처리 방식입니다. 이 넷이 정해지지 않으면 화면이 아니라 데이터 정의에서 막힙니다.

가상 데이터의 의도적 예외는 무엇인가요?

정책과 다른 범주 기록 8건(연 합계 180,040,000원), 정책이 선택 대기인 건 8건, 정책표에 없는 건 3건을 일부러 넣었습니다. 판정이 동작하는지 보려는 것이며 대사 차이와는 따로 셉니다.