재무회계

SAP 비현금 투자·재무활동 공시 점검 — IAS 7, 현금을 쓰지 않은 투자·재무 거래가 현금흐름표에서 빠졌는지, 주석 공시액이 맞는지 장부와 맞춰본다

비현금분 재계산 · 현금흐름표 혼입 점검 · 주석 공시액 대사 · 항목 차이의 설명되는 몫과 남는 몫 · 거래에서 항목까지 내려보기 — 실제 화면 7종과 CDS 코드까지

소개 영상36초 · 무음 · 6개 장면조회 → 거래 명세 → 점검 필요 좁히기 → 거래 상세 → 항목 대사 → 정합성 대사

개발 배경

회사가 리스로 설비를 들여오고, 미지급금으로 기계를 사고, 주식을 발행해 다른 회사를 인수하고, 빌린 돈을 지분으로 바꾸는 날이 있습니다. 이 거래들의 공통점은 현금및현금성자산이 전혀 움직이지 않거나 일부만 움직인다는 것입니다. IAS 7 현금흐름표(K-IFRS 제1007호)는 이런 투자·재무활동 거래를 현금흐름표에서 빼고, 재무제표 어딘가에 다른 정보와 함께 따로 공시하라고 합니다. 현금흐름표는 현금의 움직임만 담는 표이기 때문입니다.

문제는 결산 때 이 규칙이 두 군데에서 따로 깨진다는 것입니다. 하나는 현금을 쓰지 않은 거래가 현금흐름표 집계에 섞여 들어가는 경우이고, 다른 하나는 현금흐름표에서는 잘 뺐는데 주석 공시 목록에서 빠지거나 금액이 달라지는 경우입니다. 둘 다 합계만 봐서는 잘 보이지 않습니다. 이 글은 그 두 자리를 거래 단위로 다시 계산해 장부와 나란히 놓는 조회·점검 화면을 OpenUI5 로 만든 사례이고, 실제 화면 7종과 CDS 코드까지 공개합니다.

먼저 밝혀 둡니다. 이 화면은 대사를 돕는 조회·점검 도구입니다. 어떤 거래가 비현금 투자·재무활동에 해당하는지, 현금흐름표와 주석에 어떻게 보일지는 회사와 감사인이 판단합니다. 화면의 “점검 필요”는 차이가 확인되었다는 뜻이지 오류라는 단정이 아닙니다. 기준서 문단 번호와 적용일은 일부러 적지 않았고, 원문 확인이 필요한 자리는 “확인 필요”로 표시했습니다.

표준 화면은 현금이 움직인 만큼만 보여 준다

FAGLL03 은 계정의 개별 항목을, FB03 은 전표 한 장을 보여 줍니다. 둘 다 계정과 전표 단위입니다. “이 리스 계약은 총 얼마이고, 그중 현금으로 나간 몫은 얼마이며, 나머지 비현금분이 현금흐름표와 주석에서 각각 어떻게 처리되었나”는 거래 단위의 질문인데, 표준 화면에는 거래라는 단위가 없습니다. 그래서 대사는 보통 거래 목록을 엑셀에 옮겨 놓고 계정 화면을 하나씩 열어 맞추는 일이 됩니다.

틀리는 자리가 둘로 정해져 있다

자리어떻게 틀리나합계로 안 보이는 이유
현금흐름표현금 지급분보다 큰 금액이 현금흐름표에 들어가거나(비현금분 혼입), 현금분이 오히려 빠짐항목 합계가 원장 현금과 어긋나지만, 그 차이가 어느 거래에서 왔는지는 합계에 없음
주석 공시비현금분이 주석 목록에 아예 없거나(누락) 일부만 있음(과소 공시), 더 크게 적힘주석은 목록이라 합계 대조가 아니라 거래별 대조가 필요함
설명되지 않는 차이항목 차이에서 비현금 혼입분을 빼고도 남는 금액비현금 거래가 아닌 분류·기간 귀속 같은 다른 원인이 섞여 있음

이 화면은 세 번째 줄을 특히 신경 썼습니다. 항목 차이가 났을 때 “비현금 거래 때문이니 괜찮다”로 넘어가면 거기 숨은 다른 원인을 놓칩니다. 그래서 차이를 비현금 혼입분으로 설명되는 몫과 설명되지 않고 남는 몫으로 나눠 두 칸으로 보여 줍니다.

사용 방법

  1. 조회조건을 정합니다. 회계연도는 필수이고 기간 · 회사 · 거래 유형 · 투자/재무 구분 · 거래일 범위 · 점검 결과는 비워 두면 조건에서 빠집니다. 처음 열면 2026년 전체 기간으로 한 번 조회가 끝나 있습니다.
  2. 요약 지표 8개를 먼저 읽습니다. 비현금 거래 건수와 금액, 주석 공시액, 공시 차이, 현금흐름표 미설명 차이, 거래·항목 점검 필요 건수, 대사 차이 건수입니다.
  3. 회사별 요약 탭에서 시작합니다. 회사 · 기간 단위로 어느 곳에 점검 필요가 있는지를 봅니다.
  4. 비현금 거래 명세 탭으로 내려갑니다. 거래 한 줄에 총액 · 현금 지급분 · 비현금분 · 현금흐름표 반영액 · 주석 공시액이 놓입니다.
  5. 행을 눌러 거래 상세를 엽니다. 같은 현금흐름표 항목의 원장 현금 대사 줄이 함께 나옵니다.
  6. 항목 대사 · 정합성 대사 탭으로 맞춰 봅니다. 현재 탭은 화면과 같은 머리글의 UTF-8 CSV 로 내려받을 수 있습니다.

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

이 화면이 맨 먼저 받는 질문은 “이 숫자 맞아?”입니다. 그래서 대사식 8종을 먼저 세우고 샘플 데이터 전체에 대해 돌렸습니다. 아래 표는 그 결과이고, 화면 요약의 모든 값은 원천 데이터에서 독립 스크립트가 다시 계산한 값과 같았습니다.

대사무엇을 맞추나검사 건수차이 건수성격
R001거래 총액 = 현금 지급분 + 비현금분150내부 산식
R002투자활동 비현금분 + 재무활동 비현금분 = 비현금 합계60내부 산식
R003현금흐름표 반영액 = 현금 지급분(비현금분이 섞이지 않았는가)152 (최대 2,700.0)장부 대조 — 의도한 점검 대상
R004비현금분 = 주석 공시액152 (최대 2,060.0)장부 대조 — 의도한 점검 대상
R005항목별 거래 현금분 = 거래 현금 지급분의 항목별 합계360내부 산식
R006항목 차이 = 포함된 비현금분(미설명 차이 0)361 (2.4)장부 대조 — 의도한 점검 대상
R007원장 현금 = 거래 현금분 + 그 밖 현금360내부 산식
R008회사별 요약 = 거래 값의 합60내부 산식

총 165건을 검사했고, 내부 산식 다섯 개(R001 · R002 · R005 · R007 · R008)는 차이가 0건입니다. 장부와 맞춰 보는 세 개의 차이 5건은 모두 일부러 넣은 점검 대상입니다. 화면 쪽은 거래일 조건과 상세 창, 서비스 함수 합계를 따로 확인했습니다. 검증용 값은 모두 가상입니다.

무엇으로 만들었나

화면은 OpenUI5 한 벌이고 테마는 sap_horizon 입니다. 서비스는 OData V2 하나이며, 탭마다 엔티티셋 하나에 표를 직접 바인딩합니다.

자리무엇왜 그렇게 두었나
화면조회조건 · 요약 지표 8개 · 탭 네 개 · 거래 상세 창표준 Fiori 와 같은 모양이라 현업이 따로 배울 것이 없고, 위에서 아래로 좁혀 내려갑니다.
표탭마다 엔티티셋 하나에 직접 바인딩, 정렬·스크롤은 $orderby · $top · $skip 으로 서비스에 전달한 번에 받아 화면에서 쪼개면 건수가 늘 때 먼저 느려집니다.
조회조건입력값을 sap.ui.model.Filter 로만 만들어 $filter 로 전달, “전체”는 조건을 만들지 않음전체를 뜻하는 코드값을 보내면 서비스마다 해석이 갈립니다.
판정·계산서비스 로직 한 파일이 비현금분 · 공시 차이 · 점검 문구를 만들어 돌려줌판단은 화면이 아니라 서비스에 있어야 같은 규칙을 다른 화면과 배치가 씁니다.
합계 펑션공시 차이 합계, 미설명 차이 합계를 돌려주는 펑션 2개(회계연도·기간 지정)요약 값이 표 합계와 어긋나지 않게 계산 자리를 한 곳으로 모았습니다.
날짜 조건거래일 범위를 서비스가 직접 처리날짜 형식은 서비스마다 달라 맡겨 두면 조용히 걸러지지 않는 일이 생깁니다.
오류 안내구성 정보를 못 읽은 경우와 요청이 실패한 경우를 구분해 “서비스 연결 확인” 창을 띄움“데이터가 없다”와 “서비스에 닿지 못했다”가 같은 빈 화면으로 보이지 않게 합니다.

실행 화면

실제로 돌아가는 화면 7종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 보는 자리인지와 숫자를 읽는 법을 아래에 적었습니다. 숫자는 모두 같은 가상 자료에서 나온 것(단위 백만원)이라 화면끼리 맞춰 보셔도 됩니다.

처음 열었을 때

조회조건 · 요약 지표 · 탭이 한 화면에 세로로 쌓입니다. 처음 열면 2026년 전체 기간으로 조회가 끝나 있습니다.

조회조건과 요약 — 첫 탭이 회사별 요약
조회조건과 요약 — 첫 탭이 회사별 요약 — 조회조건 한 줄 오른쪽 끝에 조회 · 초기화 버튼이 있고, 그 아래에 요약 지표 8개와 첫 탭(회사별 요약)이 나옵니다.

요약 지표를 먼저 읽습니다. 거래 15건, 비현금 거래금액 20,915.5, 주석 공시액 18,725.5, 공시 차이 +2,190.0, 현금흐름표 미설명 차이 +2.4 가 점검의 기준선입니다. 오른쪽의 거래 점검 필요 4, 항목 점검 필요 3, 대사 차이 5 는 의도적으로 넣은 점검 대상에서 나온 값입니다. 탭 이름 옆의 작은 숫자는 그 탭의 행 수입니다.

비현금 거래 명세

점검의 중심 화면입니다. 거래 한 줄에 재료에서 결과까지가 놓입니다.

비현금 거래 명세 — 거래 한 줄에 총액부터 공시액까지
비현금 거래 명세 — 거래 한 줄에 총액부터 공시액까지 — 거래 15건이 한 줄씩 나오고, 컬럼 순서가 계산 순서와 같습니다.

총액 → 현금 지급분 → 비현금분(총액 − 현금 지급분) → 현금흐름표 반영액 → 현금흐름표에 포함된 비현금분 → 주석 공시액 → 공시 차이 순서입니다. 차이 컬럼은 부호를 붙여 보여 주므로 큰지 작은지를 숫자만 보고 압니다. 점검 내용 컬럼에는 사유와 금액이 한 문장으로 적힙니다.

점검 필요 항목만 좁혀 보기

항목 대사 탭에서 점검 결과를 “점검 필요”로 두고 조회한 화면입니다.

현금흐름표 항목 대사 — 점검 필요 항목만
현금흐름표 항목 대사 — 점검 필요 항목만 — 현금흐름표 항목 36줄 가운데 점검 필요 3줄만 남습니다.

남은 3줄 중 2줄은 항목 차이가 같은 항목의 비현금 혼입분으로 완전히 설명되고(2026-07 리스 거래, 2026-09 주식 발행 취득), 1줄(2026-08 무형자산 취득)은 2.4 가 설명되지 않고 남습니다. 설명된 차이는 거래를 확인하면 되고, 설명되지 않은 차이는 분류나 기간 귀속 같은 다른 원인을 분개에서 찾아야 합니다.

정합성 대사

대사식 8종이 기간별로 몇 건을 검사해 몇 건이 어긋났는지를 한 장으로 봅니다.

정합성 대사 — 8종 대사식
정합성 대사 — 8종 대사식 — 좌변 · 우변 합계, 검사 건수, 차이 건수, 최대 차이가 줄마다 나옵니다.

R003 · R004 · R006 은 장부와 재계산을 맞춰 보는 대사이고, 나머지는 차이가 0건이어야 하는 내부 산식입니다. 내부 산식에서 차이가 나오면 장부가 아니라 화면 쪽 계산을 의심해야 하므로 두 부류를 나눠 읽습니다.

점검 필요 거래만 좁혀 보기

거래 명세 탭에서 점검 결과를 “점검 필요”로 두고 회계연도 칸에서 Enter 키로 조회한 화면입니다.

점검 필요 거래만 좁혀 보기
점검 필요 거래만 좁혀 보기 — 거래 15건 중 4건이 남고, 요약 지표도 같은 범위를 따라갑니다.

남은 4건은 현금흐름표에 비현금분이 들어간 거래 2건(리스 1건, 주식 발행 취득 1건)과 주석 공시액이 비현금분과 다른 거래 2건(리스 거래의 공시 누락, 미지급 설비 거래의 일부만 공시)입니다. 공시 차이 합계 +2,190.0 은 2,060.0 + 130.0 입니다.

거래 상세 — 행을 눌렀을 때

거래 행을 누르면 열리는 창입니다.

거래 상세 — 행을 눌렀을 때
거래 상세 — 행을 눌렀을 때 — 총액을 현금분과 비현금분으로 나눈 값, 현금흐름표 반영액, 주석 공시액과 같은 항목의 원장 현금 대사 줄을 한 창에 모았습니다.

주식 발행으로 기업을 취득한 거래를 열면 총액 3,600.0 중 현금 지급분이 900.0, 비현금분이 2,700.0 인데 현금흐름표에는 3,600.0 이 반영되어 비현금분 2,700.0 이 현금흐름표에 섞여 들어간 모양이 그대로 보입니다. 주석 공시액은 2,700.0 으로 맞습니다. 틀린 곳은 현금흐름표이고 주석이 아니라는 점까지 한 창에서 갈립니다.

좁은 화면

화면 폭이 좁아져도 조회조건이 줄바꿈되고 표는 가로로 밀어 읽습니다.

좁은 화면에서의 모양
좁은 화면에서의 모양 — 조회 · 초기화 버튼은 조회조건 영역 안에 그대로 있습니다.

노트북 반 화면이나 태블릿에서 열어도 조회조건이 잘리지 않습니다. 표 컬럼이 많아 가로 스크롤이 생기지만 컬럼 순서는 같습니다.

판정 규칙 — 무엇이 “점검 필요”가 되는가

허용 기준 0.1 백만원은 샘플 값이며 회사 정책에 따라 정합니다(확인 필요).

대상판정 조건결과사용자 조치
거래현금흐름표 반영액 − 현금 지급분 ≠ 0 (비현금분이 들어갔거나 현금분이 빠짐)점검 필요참조 전표를 열어 현금 계정을 거치지 않은 분개가 현금흐름표 집계에 들어갔는지 확인
거래비현금분 − 주석 공시액 ≠ 0점검 필요주석 공시 목록과 거래 명세를 맞춰 누락 · 과다 공시 확인
현금흐름표 항목현금흐름표 금액 − 원장 현금 ≠ 0점검 필요차이가 같은 항목의 거래 비현금 혼입분으로 설명되는지 확인
현금흐름표 항목항목 차이 − 포함된 비현금분(미설명 차이) ≠ 0점검 필요비현금 거래가 아닌 다른 원인(분류 · 기간 귀속)을 항목 분개에서 확인
회사별 요약소속 거래 또는 항목 중 점검 필요가 있음점검 필요하위 거래 · 항목의 점검 내용 참조
그 밖위 조건에 해당하지 않음정상-

산출·대사식

  1. 비현금분 = 거래 총액 − 현금 지급분
  2. 현금흐름표에 포함된 비현금분 = 현금흐름표 반영액 − 현금 지급분 (양수는 비현금분이 들어간 것, 음수는 현금분이 빠진 것)
  3. 공시 차이 = 비현금분 − 주석 공시액 (0 이어야 함)
  4. 원장 현금 = 거래 현금분 + 그 밖 현금
  5. 현금흐름표 항목 차이 = 현금흐름표 금액 − 원장 현금, 미설명 차이 = 항목 차이 − 포함된 비현금분

조회조건

조건필수설명
회계연도필수4자리 숫자
기간선택전체 · 2026-07 · 2026-08 · 2026-09
회사선택전체 선택 시 조건에서 제외
거래 유형선택리스 · 미지급 설비 · 주식 발행 취득 · 현물출자 · 채무의 자본 전환 · 전환사채 전환
투자·재무 구분선택투자활동 · 재무활동
거래일 시작/종료선택날짜 범위 — 서비스가 직접 처리
점검 결과선택정상 · 점검 필요

파일 구성

진입 파일과 설정 · 컨트롤러 · 뷰 · 모델 · 스타일 · 번역은 앱 본체이고, odata/ 아래에 서비스 정의와 샘플 데이터가 있습니다. 검증용 샘플 서버와 데이터는 test/ 아래에만 두어 앱 본체에 섞이지 않게 했습니다. 서비스에 닿지 못하는 환경에서는 “서비스 연결 확인” 안내 창이 뜹니다.

SAP 표준 기능 확장 포인트

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 거래 단위 재계산과 대사 관점을 더해 확장합니다. 표준이 끊기는 자리만 이어 붙였습니다.

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

하고 싶은 일표준한계이 화면이 더하는 것
계정 개별 항목 보기FAGLL03계정과 기간 기준이라 거래라는 단위가 없음거래 단위로 묶어 현금분과 비현금분으로 나눠 대조
전표 열어 보기FB03전표 한 장 단위라 거래 전체가 맞는지는 따로 더해야 함거래 한 줄에 참조 전표 · 현금흐름표 반영액 · 공시액을 놓음
미지급 항목 확인FBL1N공급업체별 개별 항목이라 어느 취득 거래의 비현금분인지 안 보임미지급 설비처럼 비현금분이 미지급으로 남은 금액을 거래와 연결(연결은 확인 필요)
자산 취득가액 확인AS03자산 마스터 기준이라 리스 · 현물출자 거래와 묶이지 않음취득 거래의 총액과 현금 지급분을 나란히 둠(연결은 확인 필요)
비현금 거래 식별없음어떤 거래가 현금을 쓰지 않았는지 가려내는 표준 화면이 없음회사가 식별해 적재한 거래를 재계산해 장부와 맞춤
주석 공시액 대사없음주석 공시 목록과 원장을 맞추는 표준 자리가 없음공시 차이를 거래마다 올림
항목 차이 설명-차이를 비현금 혼입분과 그 밖의 원인으로 가르는 화면이 없음설명된 몫과 미설명 차이를 두 칸으로 분리

T-code 별 연계 지점

표준 T-code이 화면에서 만나는 자리기존 화면을 어떻게 두나
FAGLL03항목 대사 탭의 원장 현금 · 현금흐름표 금액이 어느 계정 항목에서 왔는지 확인(계정 배정은 확인 필요)그대로 두고 근거 확인용으로 씁니다
FB03거래의 참조 전표를 열어 현금 계정을 거치지 않은 분개인지 확인(전표 연결은 확인 필요)그대로 둡니다
FBL1N비현금분이 미지급 항목으로 남은 금액 확인(연결은 확인 필요)그대로 둡니다
AS03리스 · 현물출자로 취득한 자산의 취득가액 확인(연결은 확인 필요)그대로 둡니다

요구사항 매핑

기준서요구사항대응 기능비고
IAS 7 현금흐름표(K-IFRS 제1007호)현금및현금성자산의 사용을 수반하지 않는 투자·재무활동 거래는 현금흐름표에서 제외거래별 현금흐름표 반영액과 현금 지급분 대사, 항목 대사어떤 거래가 해당하는지는 회사 판단(확인 필요)
IAS 7 현금흐름표(K-IFRS 제1007호)그런 거래는 재무제표에서 다른 정보와 함께 공시거래별 비현금분과 주석 공시액 대사공시 형식과 범위는 원문 확인 필요
IAS 7 현금흐름표(K-IFRS 제1007호)투자활동과 재무활동으로 구분해 현금흐름 표시투자·재무 구분 집계, 항목별 원장 현금 대사항목 구분은 회사 정책에 따름

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

자리무엇을 바꾸나난이도
거래 유형 구분샘플 6종을 회사의 거래 분류로 교체낮음 — 코드 목록과 번역만
계정 역할 매핑현금 · 투자 · 재무 계정을 매핑 테이블 한 줄씩 추가낮음 — 코드 수정 없음
허용 오차0.1 백만원을 회사 정책 값으로, 파라미터로 둠낮음
서비스 주소앱 설정의 상대 경로를 게시한 OData 서비스로 교체낮음 — 화면 수정 없음
비현금 거래 식별거래를 누가 어떤 기준으로 식별해 적재하는지 정함높음 — 코딩이 아니라 합의

CDS 구성

이 사례의 화면은 샘플 데이터를 서비스가 읽어 재계산합니다. 데모라서 되는 일이고, 운영 데이터에서는 재계산을 CDS 로 내립니다. 운영으로 올릴 때 가장 먼저 하는 일은 거래 식별 자료 적재 테이블과 계정 역할 매핑 테이블을 만들고, 그 위에서 비현금분 · 공시 차이 · 항목 대사를 계산하는 뷰를 쌓는 것입니다.

코드는 스케치입니다. 필드 이름과 표준 뷰 이름은 릴리스·환경에 따라 다르므로 붙여 넣기 전에 View Browser(F2170) 로 실제 이름을 확인해야 합니다. 확인이 필요한 자리는 주석에 적어 두었습니다.

뷰 레이어 구성

레이어객체하는 일왜 나누나
기준ZNCASH_ACCTMAPG/L 계정 → 역할(현금 · 투자 · 재무) · 현금흐름표 항목 매핑계정은 늘 늘어납니다. 코드에 박으면 늘 때마다 개발자를 부르게 됩니다.
적재ZNCASH_TXN회사가 식별한 비현금 거래를 한 줄씩 보관식별은 회사의 판단이고 계산 뷰가 읽는 자리를 하나로 고정합니다.
거래ZI_NonCashTxnRecon비현금분 · 현금흐름표 포함분 · 공시 차이 정의판정식을 한 곳에서만 정의합니다.
장부ZI_CashFlowReported원장에서 현금흐름표에 반영된 금액을 항목별로 집계장부 쪽 읽기를 재계산과 분리해 어느 쪽이 틀렸는지 갈라 봅니다.
항목ZI_CashFlowLineCube항목별 원장 현금 · 거래 현금분 · 비현금 혼입분과 미설명 차이항목 합계는 거래 합계와 독립적으로 읽습니다.
쿼리ZC_NonCashCheckQuery화면용 컬럼 · 필터 · 점검 판정서비스가 같은 판정을 그대로 가져갑니다.
권한ZR_NonCashTxnRecon (DCL)회사코드 단위 접근 제한집계를 읽는 자리에 걸어야 합계 뺄셈으로 새지 않습니다.
서비스ZUI_NonCashReconOData V2 로 게시(서비스 정의 + 바인딩)화면은 뷰가 아니라 서비스만 바라보게 합니다.

① 계정 역할 매핑 테이블

어느 계정이 현금 계정이고 어느 계정이 어느 현금흐름표 항목의 투자·재무 계정인지를 한 곳에서 정합니다.

" ─────────────────────────────────────────────────────────────
" ZNCASH_ACCTMAP — 계정 역할 매핑 테이블 (회사가 직접 채우는 기준 자료)
"   어느 G/L 계정이 "현금 계정"이고, 어느 계정이 어느 현금흐름표 항목의
"   투자·재무 계정인지를 한 곳에서 정한다.
" 이렇게 나눈 이유: 계정 번호를 쿼리 안에 박아 두면 계정이 늘 때마다
"   코드를 고쳐야 한다. 매핑 한 줄만 고치면 되게 둔다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '비현금 점검 — 계정 역할 매핑'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zncash_acctmap {
  key mandt        : mandt not null;
  key chart_of_acc : ktopl not null;
  key gl_account   : saknr not null;
  account_role     : abap.char(4);   " CASH 현금 계정 / INVS 투자 계정 / FINC 재무 계정 / NCEX 비현금 상대 계정
  cf_line          : abap.char(3);   " I01 I02 I03 F01 F02 F03 ...
  sign_factor      : abap.int1;      " 1 또는 -1 — 현금흐름표 부호
}

② 비현금 거래 적재 테이블

회사가 “현금을 거치지 않았거나 일부만 거친 거래”로 식별한 거래를 보관합니다. 식별 자체는 회사의 몫입니다.

" ─────────────────────────────────────────────────────────────
" ZNCASH_TXN — 비현금 거래 식별 자료 적재 테이블
"   회사가 "현금을 거치지 않았거나 일부만 거친 투자·재무활동 거래"로
"   식별한 거래를 한 줄씩 적재한다. 식별 자체는 회사의 판단이고,
"   이 화면은 적재된 값을 다시 계산해 장부와 맞춘다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '비현금 점검 — 거래 식별 자료'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zncash_txn {
  key mandt          : mandt not null;
  key company_code   : bukrs not null;
  key fiscal_year    : gjahr not null;
  key txn_no         : abap.char(10) not null;
  txn_type           : abap.char(4);      " 리스 · 미지급 설비 · 주식 발행 취득 · 현물출자 · 채무의 자본 전환 · 전환사채 전환
  cf_line            : abap.char(3);
  txn_date           : abap.dats;
  ref_doc            : belnr_d;           " 참조 전표
  @Semantics.amount.currencyCode : 'zncash_txn.currency'
  total_amount       : abap.curr(18,2);
  @Semantics.amount.currencyCode : 'zncash_txn.currency'
  cash_paid_amount   : abap.curr(18,2);
  @Semantics.amount.currencyCode : 'zncash_txn.currency'
  disclosed_amount   : abap.curr(18,2);   " 주석에 공시한 금액
  currency           : waers;
}

③ 거래 대사 뷰 — 판정식을 한 줄에서 한 번 정의한다

비현금분 · 현금흐름표에 섞인 비현금분 · 공시 차이가 이 뷰 한 곳에서 계산됩니다.

" ─────────────────────────────────────────────────────────────
" ZI_NonCashTxnRecon — 거래 대사 뷰
"   거래마다 (1) 비현금분 (2) 현금흐름표에 들어간 비현금분 (3) 공시 차이를
"   한 줄에서 한 번 정의한다. 판정식을 한 곳에 두어 화면·배치·보고서가
"   같은 값을 쓰게 한다.
" 이렇게 나눈 이유: 같은 식을 여러 뷰에 복제하면 허용 오차를 바꿀 때
"   한 곳을 빠뜨린다.
" ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '비현금 투자·재무활동 거래 대사'
define view entity ZI_NonCashTxnRecon
  as select from zncash_txn as t
  association [0..1] to ZI_CashFlowReported as _Cf
    on  _Cf.CompanyCode = t.company_code
    and _Cf.FiscalYear  = t.fiscal_year
    and _Cf.ReferenceDoc = t.ref_doc
{
  key t.company_code as CompanyCode,
  key t.fiscal_year  as FiscalYear,
  key t.txn_no       as TransactionNo,
      t.txn_type     as TransactionType,
      t.cf_line      as CashFlowLine,
      t.txn_date     as TransactionDate,
      t.currency     as Currency,
      @Semantics.amount.currencyCode : 'Currency'
      t.total_amount as TotalAmount,
      @Semantics.amount.currencyCode : 'Currency'
      t.cash_paid_amount as CashPaidAmount,
      @Semantics.amount.currencyCode : 'Currency'
      cast( t.total_amount - t.cash_paid_amount as abap.curr(18,2) ) as NonCashAmount,
      @Semantics.amount.currencyCode : 'Currency'
      _Cf.ReportedAmount as CashFlowReportedAmount,
      @Semantics.amount.currencyCode : 'Currency'
      cast( _Cf.ReportedAmount - t.cash_paid_amount as abap.curr(18,2) ) as NonCashInCashFlow,
      @Semantics.amount.currencyCode : 'Currency'
      t.disclosed_amount as DisclosedAmount,
      @Semantics.amount.currencyCode : 'Currency'
      cast( ( t.total_amount - t.cash_paid_amount ) - t.disclosed_amount as abap.curr(18,2) ) as DisclosureGap,
      _Cf
}

④ 현금흐름표 반영 금액 뷰 — 장부 쪽 읽기

원장의 현금 상대 계정을 현금흐름표 항목별로 모읍니다.

" ─────────────────────────────────────────────────────────────
" ZI_CashFlowReported — 현금흐름표에 반영된 금액 뷰
"   원장(ACDOCA)에서 현금 계정의 상대 계정을 읽어 현금흐름표 항목별로
"   집계한다. 거래 대사 뷰는 이 뷰를 association 으로만 읽는다.
" ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '현금흐름표 반영 금액'
define view entity ZI_CashFlowReported
  as select from acdoca as a
  inner join zncash_acctmap as m
    on  m.chart_of_acc = 'INT'          " 계정과목표는 회사 설계에 따름(확인 필요)
    and m.gl_account   = a.racct
{
  key a.rbukrs as CompanyCode,
  key a.gjahr  as FiscalYear,
  key a.belnr  as ReferenceDoc,
      m.cf_line as CashFlowLine,
      a.rhcur   as Currency,
      @Semantics.amount.currencyCode : 'Currency'
      sum( a.hsl * m.sign_factor ) as ReportedAmount
}
where a.rldnr = '0L'
  and ( m.account_role = 'INVS' or m.account_role = 'FINC' )
group by a.rbukrs, a.gjahr, a.belnr, m.cf_line, a.rhcur

⑤ 항목 대사 큐브 — 미설명 차이를 만드는 자리

항목 차이에서 비현금 혼입분을 뺀 몫을 따로 계산합니다.

" ─────────────────────────────────────────────────────────────
" ZI_CashFlowLineCube — 현금흐름표 항목 대사 큐브
"   항목(I01·I02·…)별로 원장 현금, 거래 현금분, 현금흐름표 금액을 모으고
"   "차이 − 포함된 비현금분 = 미설명 차이" 를 계산한다.
" 이렇게 나눈 이유: 항목 합계는 거래 합계와 따로 읽어야 어느 층에서
"   깨졌는지 보인다. 거래 뷰를 그대로 sum 하지 않고 독립 집계로 둔다.
" ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@Analytics.dataCategory : #CUBE
@EndUserText.label : '현금흐름표 항목 대사 큐브'
define view entity ZI_CashFlowLineCube
  as select from ZI_CashFlowReported as r
  association [0..*] to ZI_NonCashTxnRecon as _Txn
    on  _Txn.CompanyCode = r.CompanyCode
    and _Txn.FiscalYear  = r.FiscalYear
    and _Txn.CashFlowLine = r.CashFlowLine
{
  key r.CompanyCode,
  key r.FiscalYear,
  key r.CashFlowLine,
      r.Currency,
      @Aggregation.default : #SUM
      @Semantics.amount.currencyCode : 'Currency'
      r.ReportedAmount                                     as CashFlowAmount,
      @Aggregation.default : #SUM
      @Semantics.amount.currencyCode : 'Currency'
      _Txn.CashPaidAmount                                  as TransactionCash,
      @Aggregation.default : #SUM
      @Semantics.amount.currencyCode : 'Currency'
      _Txn.NonCashInCashFlow                               as NonCashIncluded,
      _Txn
}

⑥ 점검 쿼리 — 판정을 한 곳에서 낸다

허용 오차를 파라미터로 둔 소비 뷰입니다.

" ─────────────────────────────────────────────────────────────
" ZC_NonCashCheckQuery — 점검 쿼리 (소비 뷰)
"   점검 필요 판정을 한 곳에서 낸다. 허용 오차 0.1(백만원) 은 파라미터로 빼서
"   회사 정책에 따라 바꿀 수 있게 한다(샘플 기준값, 확인 필요).
" ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '비현금 거래 점검'
@Search.searchable : true
define view entity ZC_NonCashCheckQuery
  with parameters
    P_Tolerance : abap.dec(18,2)
  as select from ZI_NonCashTxnRecon as t
{
      @Consumption.filter : { selectionType : #SINGLE, mandatory : true }
  key t.CompanyCode,
      @Consumption.filter : { selectionType : #SINGLE, mandatory : true }
  key t.FiscalYear,
  key t.TransactionNo,
      @Consumption.filter.selectionType : #RANGE
      t.TransactionDate,
      @Search.defaultSearchElement : true
      t.TransactionType,
      t.NonCashAmount,
      t.NonCashInCashFlow,
      t.DisclosureGap,
      case
        when abs( t.NonCashInCashFlow ) >= $parameters.P_Tolerance
          or abs( t.DisclosureGap )     >= $parameters.P_Tolerance then 'CHECK'
        else 'OK'
      end as CheckStatus
}

⑦ 접근 제어 — 집계를 읽는 자리에 건다

화면이 읽는 서비스가 이 뷰를 거치므로 담당 밖 회사의 숫자는 내려오지 않습니다.

" ─────────────────────────────────────────────────────────────
" ZR_NonCashTxnRecon — 접근 제어 (DCL)
"   합계를 읽는 뷰마다 회사코드 권한을 건다. 화면이 읽는 서비스가
"   이 뷰를 거치므로 담당 밖 회사의 숫자는 아예 내려오지 않는다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '비현금 거래 대사 — 회사코드 권한'
@MappingRole : true
define role ZR_NonCashTxnRecon {
  grant select on ZI_NonCashTxnRecon
    where ( CompanyCode ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}

⑧ 서비스 정의와 바인딩

노출 범위를 정하고 OData V2 - UI 유형으로 게시합니다.

" ─────────────────────────────────────────────────────────────
" ZUI_NonCashRecon — 서비스 정의 · 바인딩
"   화면이 읽는 OData V2 서비스의 노출 범위를 정한다. 운영 전환 때는
"   서비스 바인딩을 게시하고 앱 설정의 서비스 상대 경로만 교체한다.
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '비현금 투자·재무활동 공시 점검 서비스'
define service ZUI_NonCashRecon {
  expose ZC_NonCashCheckQuery as NonCashTxn;
  expose ZI_CashFlowLineCube  as CashFlowLine;
}
" 서비스 바인딩: 유형 'OData V2 - UI' 로 만들고 게시한다.
" (ABAP Development Tools 의 서비스 바인딩 편집기에서 처리)

운영 시점에 해야 할 일

할 일안 하면 생기는 일결정 주체
비현금 거래 식별 기준과 적재 경로거래 목록이 엑셀로 남아 대사가 매번 사람 손을 탐회계 · IT
계정 역할 매핑 확정현금흐름표 반영액을 어느 계정에서 읽는지 사람마다 달라짐회계 · 원장 설계
주석 공시 목록의 원천공시액을 비교할 대상이 없어 공시 차이가 비어 있음회계 · 공시 담당
허용 오차와 권한 범위반올림 차이가 쏟아지고 담당 밖 숫자가 보임회계 · 보안
서비스 게시와 주소 교체화면이 샘플 서비스를 계속 바라봄Basis · 개발

운영 데이터로 갈 때

앱 설정의 서비스 상대 경로만 게시한 서비스로 바꾸면 화면은 그대로 동작합니다. 날짜 조건 · 정렬 · 건수 표시는 서비스가 같은 방식으로 받아야 하므로 게시 전에 $filter · $orderby · $top · $inlinecount 를 같은 조건으로 한 번씩 호출해 확인합니다.

자주 묻는 질문

도입 상담과 데모에서 자주 받는 질문들입니다. 네 묶음으로 나눠 적었습니다.

숫자와 산식

비현금분은 어떻게 계산합니까?

거래 총액 − 현금 지급분입니다. 리스 계약 총액 1,850.0 에서 계약 시점에 현금으로 나간 35.0 을 빼면 비현금분 1,815.0 입니다. 총액과 현금 지급분은 회사가 식별해 적재한 거래 자료에서 오고, 화면은 그 뺄셈을 서비스에서 다시 계산합니다.

현금흐름표에 비현금분이 섞였는지는 어떻게 압니까?

현금흐름표 반영액 − 현금 지급분이 0 이 아니면 올립니다. 양수이면 비현금분이 들어간 것이고 음수이면 현금분이 빠진 것입니다. 샘플에서는 리스 거래 1건(1,815.0)과 주식 발행 취득 1건(2,700.0)이 이렇게 올라옵니다.

공시 차이는 무엇입니까?

비현금분 − 주석 공시액입니다. 양수는 공시가 모자란 것이고 음수는 비현금분보다 많이 적힌 것입니다. 샘플의 합계 +2,190.0 은 공시가 통째로 빠진 리스 거래 2,060.0 과 일부만 공시된 미지급 설비 거래 130.0 의 합입니다.

미설명 차이는 왜 따로 나눕니까?

항목 차이가 났을 때 “비현금 거래 때문”이라는 설명으로 끝내지 않기 위해서입니다. 미설명 차이 = 항목 차이 − 포함된 비현금분이고, 이 값이 0 이 아니면 비현금 거래가 아닌 다른 원인(분류 · 기간 귀속)이 섞여 있다는 뜻입니다. 샘플에서는 한 항목에 2.4 가 남습니다.

허용 오차 0.1 백만원은 무엇입니까?

장부와 재계산을 같다고 볼 금액 기준입니다. 소수 첫째 자리까지 다루는 금액에서 반올림 때문에 생기는 작은 차이를 점검 필요로 올리지 않으려고 둔 샘플 값입니다. 실제 기준은 회사 정책에 따르며(확인 필요), 운영에서는 코드에 박지 않고 파라미터로 둡니다.

“점검 필요”가 나오면 장부가 틀렸다는 뜻입니까?

아닙니다. 차이가 확인되었다는 뜻일 뿐 원인이나 오류 여부를 단정하지 않습니다. 비현금 거래의 식별이 달랐을 수도 있고, 분개가 달랐을 수도 있습니다. 그래서 점검 내용 컬럼도 차이의 자리와 금액을 짚는 문장으로 씁니다.

화면과 조작

처음 열면 무엇이 보입니까?

조회조건 · 요약 지표 8개 · 탭 네 개가 한 화면에 쌓이고, 2026년 전체 기간으로 한 번 조회가 끝나 있습니다. 첫 탭은 회사별 요약입니다.

조회는 어떻게 합니까?

조회조건 오른쪽 끝의 조회 버튼을 누르거나 회계연도 칸에서 Enter 키를 누릅니다. 회계연도만 필수이고 나머지는 비우거나 “전체”로 두면 그 조건은 서버로 가지 않습니다.

거래일 범위로도 조회됩니까?

됩니다. 시작일과 종료일을 함께 주면 AND 로 묶은 하나의 조건으로 보내고, 서비스가 날짜를 직접 처리합니다. 샘플에서 2026-08-01 ~ 2026-08-31 로 조회하면 거래 5건이 나옵니다.

행을 누르면 무엇이 열립니까?

거래 상세 창이 열려 총액 · 현금 지급분 · 비현금분 · 현금흐름표 반영액 · 주석 공시액과 같은 항목의 원장 현금 대사 줄을 보여 줍니다. 표준 전표 조회로 넘어가려면 참조 전표 번호를 FB03 에서 엽니다.

결과를 엑셀로 가져갈 수 있습니까?

지금 보고 있는 탭을 UTF-8 CSV 로 내려받습니다. 머리글은 화면 컬럼 이름과 같고 값은 화면 표시 형식과 같아서 감사인에게 화면과 같은 표를 줄 수 있습니다.

서비스에 연결하지 못하면 어떻게 보입니까?

구성 정보를 읽지 못한 경우와 요청이 실패한 경우를 구분해 “서비스 연결 확인” 안내 창을 띄웁니다. 빈 표와 연결 실패가 같은 화면으로 보이지 않게 하려는 것입니다.

기준서와 표준 연계

어떤 거래가 비현금 투자·재무활동입니까?

IAS 7 은 현금및현금성자산의 사용을 수반하지 않는 투자·재무활동 거래를 현금흐름표에서 제외하라고 하고, 예로 리스나 부채 인수로 자산을 취득하는 것, 주식 발행으로 기업을 취득하는 것, 채무를 자본으로 전환하는 것을 듭니다. 샘플은 이를 따라 리스 · 미지급 설비 · 주식 발행 취득 · 현물출자 · 채무의 자본 전환 · 전환사채 전환 6종을 둡니다. 실제 대상은 회사와 감사인이 판단합니다(확인 필요).

이 화면이 회계 처리를 확정해 줍니까?

아닙니다. 조회·점검 도구이며 최종 판단은 회사와 감사인이 합니다. 화면은 차이가 난 자리와 금액을 짚을 뿐입니다.

주석 공시는 어떤 형식으로 해야 합니까?

형식과 범위는 기준서 원문과 회사 정책으로 확인할 사항이고 이 화면은 정하지 않습니다. 화면은 이미 정해진 공시액이 비현금분과 맞는지만 봅니다(확인 필요).

기준서의 문단 번호나 적용일은 왜 적지 않았습니까?

번호와 적용일은 개정으로 바뀌고, 잘못 적으면 오히려 해롭습니다. 이 글은 요구사항의 내용만 적고 원문 확인이 필요한 자리는 “확인 필요”로 표시했습니다.

표준 T-code 는 어디에서 만납니까?

계정 항목은 FAGLL03, 전표는 FB03, 미지급 항목은 FBL1N, 자산 취득가액은 AS03 에서 확인합니다. 어느 계정을 어느 항목에 배정할지는 회사 설계에 따릅니다(확인 필요).

S/4HANA 가 아니라 ECC 에서도 됩니까?

화면은 OData V2 서비스만 읽으므로 서비스를 게시할 수 있으면 됩니다. 다만 CDS 는 S/4HANA 기능이어서 ECC 에서는 같은 계산을 다른 방식(함수 모듈 · 보고서 데이터)으로 서비스에 내려야 합니다(확인 필요).

도입과 운영

샘플 데이터는 실제 자료입니까?

아닙니다. 회사 · 거래처 · 전표 번호를 포함한 모든 값이 가상이고, 점검 필요 항목은 화면 동작을 보이려고 일부러 넣었습니다.

운영 데이터로 바꾸려면 무엇이 필요합니까?

거래 식별 자료 적재, 계정 역할 매핑, 주석 공시 목록의 원천, 서비스 게시입니다. 화면은 앱 설정의 서비스 상대 경로만 바꾸면 그대로 동작합니다.

권한은 어떻게 겁니까?

합계를 읽는 뷰마다 회사코드 권한을 겁니다. 화면이 읽는 서비스가 이 뷰를 거치므로 담당 밖 회사의 숫자는 내려오지 않습니다.

가장 오래 걸리는 일은 무엇입니까?

개발이 아니라 합의입니다. 비현금 거래를 누가 어떤 기준으로 식별해 적재할지, 주석 공시액을 어디서 가져올지, 허용 오차를 얼마로 둘지를 정하는 일이 큽니다.

매달 손이 가는 곳은 어디입니까?

거래 식별 자료 적재와 계정 역할 매핑입니다. 계정이 늘면 매핑에 한 줄을 추가하면 되고 코드는 고치지 않습니다.

데모는 어디서 볼 수 있습니까?

왼쪽 목차의 “데모 열기” 링크로 열 수 있습니다(데모 서버 접속에는 로그인이 필요할 수 있습니다). 검토 자료 내려받기는 이 글의 숫자와 화면을 결재용 문서 형식으로 묶어 줍니다.