관리회계

SAP 흡수원가·변동원가 이익 차이 점검 — 재고에 남은 고정제조간접비로 두 이익의 차이를 대사하는 월마감 화면

품목·월 이익 차이 산출 · 재고 고정간접비 대사 · 점검 필요 품목 선별 · 월별·제품군 요약 · 행 클릭 상세 — 소개 영상과 실제 화면 6종, 그리고 CDS 코드까지

소개 영상1분 39초8개 장면음성 안내·자막조회조건 · 점검 필요 · 월별 · 제품군 · 대사 · 상세 순서

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

제조업 월마감에서 가장 자주 받는 질문 가운데 하나가 “이번 달 이익이 왜 관리회계 보고서와 달라졌습니까” 입니다. 재무회계는 고정제조간접비를 재고에 얹어 두었다가 팔린 만큼만 매출원가로 내리는 흡수원가 방식으로 이익을 계산하고, 관리회계의 공헌이익 보고서는 고정제조간접비를 발생한 달에 전부 비용으로 보는 변동원가 방식으로 이익을 봅니다. 두 이익이 다른 것은 오류가 아니라 정상입니다. 다만 그 차이는 기말 재고에 들어 있는 고정제조간접비에서 기초 재고에 들어 있던 고정제조간접비를 뺀 금액과 정확히 같아야 합니다.

지금은 이 대사를 재고 현황, 물자 원장, 수익성 보고서, 원가요소 개별 항목을 번갈아 열고 엑셀에 옮겨 맞추는 방식으로 합니다. 품목이 수백 개이고 월이 아홉 개만 쌓여도 어느 품목의 어느 달에서 어긋났는지 찾는 데 하루가 갑니다. 이 화면은 그 대사를 품목·월 단위로 매번 다시 계산해, 장부와 맞지 않거나 재고 증감으로 차이가 큰 건만 점검 필요로 가려 줍니다.

관련 영역은 원가계산 방식(흡수원가·변동원가)의 비교와 재고자산 원가 배부입니다. 재고자산의 원가에 고정제조간접비를 어떻게 배부하는지는 K-IFRS 제1002호 재고자산이 다루는 영역이며, 이 화면은 기준서의 해석을 대신하지 않고 회사가 정한 배부 결과가 두 이익 사이에서 어떻게 드러나는지를 점검하는 조회 도구입니다.

한 줄 요약 — 두 이익의 차이는 설명할 숫자가 아니라 검산할 숫자입니다. 이 화면은 품목·월마다 “흡수원가 이익 − 변동원가 이익 = 기말 재고 고정간접비 − 기초 재고 고정간접비” 를 다시 세우고, 어긋나는 건과 재고 증감으로 차이가 큰 건만 점검 필요로 올립니다.

차이를 맞추는 데 하루가 걸린다

월마감 직후 가장 먼저 묻는 것은 “두 보고서의 이익이 왜 다른가” 입니다. 표준 화면은 수량·재고 가치·수익성·원가요소를 각각 보여 주지만, 한 품목의 한 달을 따라가며 기초 재고 고정간접비 + 당월 발생 − 매출원가 반영 = 기말 재고 고정간접비 를 이어 붙이는 자리는 없습니다. 그래서 엑셀에 네 화면의 숫자를 옮겨 놓고 손으로 잇습니다. 이 화면은 그 이음을 품목·월마다 계산해 같은 줄에 나란히 놓습니다.

재고가 쌓인 달은 늘 이익이 더 크게 나온다

생산이 판매보다 많은 달에는 고정제조간접비 일부가 기말 재고로 넘어가 흡수원가 이익이 변동원가 이익보다 커집니다. 반대로 재고가 줄어드는 달에는 지난달에 넘어온 몫이 매출원가로 내려와 흡수원가 이익이 더 작아집니다. 월별 요약 탭은 이 흐름을 달마다 모아 보여 주어, 이익 차이가 우연이 아니라 재고 증감의 부호와 함께 움직이는지를 한눈에 확인하게 합니다.

허용 비중을 넘는 건만 사람이 본다

모든 차이를 들여다볼 수는 없습니다. 이익 차이를 흡수원가 이익으로 나눈 비중이 허용 비중 5.00%를 넘고, 차이 금액이 5백만 원 이상인 품목·월만 점검 필요로 올립니다. 비중만 보면 이익이 작은 품목이 줄줄이 걸리고, 금액만 보면 큰 품목이 늘 걸리기 때문에 두 조건을 함께 둡니다. 이 기준값은 회사가 정하는 것이며 화면은 그 기준을 적용한 결과를 보여 줄 뿐입니다.

장부에 반영된 값과 다시 계산한 값을 맞춘다

다시 계산한 매출원가 반영 고정간접비와 장부에 반영된 금액이 다르거나, 이번 달 기초 재고 금액이 전월 기말과 이어지지 않으면 그 건은 대사 항목에서 따로 표시됩니다. 검증용 샘플 데이터에는 이런 건을 6건(장부 반영 불일치 4건 · 기초 이월 불일치 2건) 일부러 넣어 두었고, 대사 차이 건수와 섞이지 않게 따로 세어 보여 줍니다.

사용 방법

  1. 회계연도를 입력합니다(필수, 4자리 숫자). 제품군·제품명·마감일 범위·점검 결과는 선택 조건입니다.
  2. 조회 버튼은 조회조건 바로 아래 왼쪽에 있고, 입력칸에서 Enter 키를 눌러도 조회됩니다. 화면을 열면 회계연도 2026 으로 한 번 자동 조회합니다.
  3. 위쪽 요약에서 매출액·흡수원가 이익·변동원가 이익·이익 차이 합계(백만원), 점검 필요 품목 수, 대사 차이 건수를 확인합니다.
  4. 탭을 품목·월 명세 → 월별 요약 → 제품군 요약 → 대사 결과 순서로 넘기며 같은 숫자를 다른 단위로 봅니다.
  5. 행을 클릭하면 상세 창이 열려 산출 값과 같은 제품의 월별 흐름을 보여 줍니다.
  6. CSV 내려받기 버튼으로 현재 탭의 결과를 파일로 저장합니다.

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

화면을 만들기 전에 대사식 아홉 개를 세우고 샘플 72건 전수에 돌렸습니다. 아홉 식 모두 차이 0건입니다. 점검용으로 넣은 예외는 장부 반영 불일치 4건과 기초 이월 불일치 2건, 합계 6건이며 위 대사 차이 건수와 따로 집계합니다.

대사대사식검사 건수차이 건수
R01매출액 − 변동 매출원가 = 공헌이익720
R02공헌이익 − 고정간접비 − 판매관리비 = 변동원가 이익720
R03기초 수량 + 생산 수량 − 판매 수량 = 기말 수량720
R04기초 + 당월 − 매출원가 반영 = 기말 고정간접비720
R05흡수 − 변동 이익 = 기말 − 기초 재고 고정간접비720
R06기초 = 전월 기말 (예외 제외)620
R07월별 합계 = 명세 합계90
R08제품군 합계 = 명세 합계40
R09누적 이익 차이 = 최종 기말 − 최초 기초 − 이월 불일치80

무엇으로 만들었나

자리무엇왜 그렇게 두었나
조회조건·요약sap.m 입력·선택·날짜 컨트롤과 KPI 상자 6개조회 버튼을 조건 바로 아래 두고 Enter 키로도 조회되게 했습니다.
결과 표sap.ui.table 4개(품목·월 · 월별 · 제품군 · 대사)열이 많은 명세는 고정 행 수와 서버 정렬로 다룹니다.
집계·판정 로직OData 서비스의 service.js — 조회·단건·펑션(GetMinGapRate·GetMaxGapRate)$filter 의 날짜 조건을 서비스가 직접 해석하고 숫자 보정을 맡습니다.
데이터 연동OData V2 모델 1개, 화면 상태는 별도 JSON 모델서비스 주소는 manifest 한 곳에만 선언해 운영 전환 때 한 줄만 바꿉니다.
테마sap_horizon표준 컨트롤 색과 간격을 그대로 따릅니다.
SAP 표준 기능을 그대로 이어받은 부분 — 수량·재고 가치·고정제조간접비 발생액은 표준 데이터 구조 그대로 읽고, 표준 T-code 화면과 같은 숫자를 맞춰 볼 대사 지점만 더했습니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다.

실행 화면

검증용 샘플 데이터로 실제 브라우저에서 찍은 화면 6종입니다. 이미지를 누르면 확대됩니다.

처음 열었을 때와 점검 필요만 보기

조회조건부터 표까지 한 화면에 세로로 쌓입니다. 요약 상자는 백만원 단위입니다.

처음 연 화면
처음 연 화면 — 회계연도 2026 으로 품목·월 72건을 조회한 첫 화면입니다. 위쪽 요약과 표가 한 화면에 들어옵니다.

조회조건 바로 아래 왼쪽에 조회 버튼이 있고, 화면을 열면 회계연도 2026 으로 한 번 자동 조회합니다. 요약 상자는 백만원 단위이며 이익 차이 합계와 점검 필요 품목 수는 주황색 계열로 눈에 띄게 둡니다. 대사 차이 건수가 0 이면 초록으로 보입니다.

점검 필요만 조회
점검 필요만 조회 — 점검 결과를 점검 필요로 고르면 12건만 남습니다.

점검 필요 12건은 재고 증감으로 차이가 큰 건 6건과 점검용 예외 6건으로 이루어집니다. 점검 코드 열이 둘을 가릅니다. 건수는 위쪽 탭 숫자에도 바로 반영됩니다.

월별·제품군으로 모아 보기

월과 제품군 단위로 같은 숫자를 모아 보면 재고 증감과 이익 차이가 함께 움직이는지 보입니다.

월별 요약 탭
월별 요약 탭 — 같은 숫자를 달마다 모아 보여 줍니다.

재고가 쌓인 1월·3월은 이익 차이가 양수로 크고, 재고가 줄어든 8월·9월은 음수로 내려갑니다. 월별 요약에는 마감일 조건만 적용됩니다.

제품군 요약 탭
제품군 요약 탭 — 제품군별 이익 차이와 점검 필요 비율을 보여 줍니다.

제품군은 점검 필요 품목·월 비율이 20% 이상이면 점검 필요로 올립니다. 제품군 요약에는 제품군과 점검 결과 조건만 적용된다는 안내가 표 위에 적혀 있습니다.

대사 결과와 행 상세

대사 결과 탭은 숫자가 맞는지 보는 자리이고, 상세 창은 한 행이 어떻게 나왔는지 보는 자리입니다.

대사 결과 탭
대사 결과 탭 — 내부 대사식 9종은 차이 0건, 점검용 예외 2종은 건수를 따로 보여 줍니다.

대사 번호 R 로 시작하는 줄이 내부 대사이고 E 로 시작하는 줄이 일부러 넣은 예외입니다. 대사식 문자열이 함께 보여 어느 필드끼리 맞춘 것인지 바로 읽힙니다.

행 클릭 상세
행 클릭 상세 — 품목·월 행을 누르면 산출 값과 같은 제품의 월별 흐름이 열립니다.

상세 창 위쪽에는 산출에 쓴 값(기초·당월·매출원가 반영·기말)이, 아래쪽에는 같은 제품의 월별 판매·생산·기말 수량과 이익 차이가 표로 나옵니다. 닫기 버튼으로 닫습니다.

화면 뒤에서 일어나는 일 — 점검 판정 로직

조회가 끝나면 서비스가 품목·월마다 아래 순서로 판정합니다. 앞의 조건에 걸리면 뒤 조건은 보지 않습니다.

판정 조건결과 상태사용자 조치
이익 차이 ÷ 흡수원가 이익 ≥ 허용 비중 5.00% 이고 차이 금액 ≥ 5백만 원점검 필요 (재고 증감으로 차이가 큼)생산·판매 수량 차이와 단위 고정간접비 변동을 확인합니다.
장부 반영 고정간접비 ≠ 재계산한 매출원가 반영 금액점검 필요 (장부 반영 불일치)장부 반영 전표와 배부 기준을 확인합니다.
기초 재고 고정간접비 ≠ 전월 기말 재고 고정간접비점검 필요 (기초 이월 불일치)월 이월 처리와 마감 순서를 확인합니다.
위 조건에 모두 해당하지 않음정상별도 조치가 없습니다.

산출 순서는 다섯 단계입니다. 매출액에서 변동 매출원가를 빼 공헌이익을 구하고, 가중평균 배부율을 계산하고, 기말 수량에 배부율을 곱해 기말 재고 고정간접비를 구하고, 기초에 당월 발생을 더한 뒤 기말을 빼 매출원가 반영 고정간접비를 구하고, 마지막으로 두 이익의 차이를 기말과 기초의 차이로 대사합니다.

조회조건

조건입력 방식필수$filter 로 가는 모양기본값
회계연도4자리 숫자필수Gjahr eq '2026'2026
제품군선택 목록선택ProdGrp eq 'P10'전체
제품명문자 일부선택substringof('펌프',ProdName)비어 있음
마감일 시작·종료날짜선택CloseDate ge datetime'…' and CloseDate le datetime'…'비어 있음
점검 결과전체 / 정상 / 점검 필요선택CheckStatus eq 'CHECK'전체

시작이 종료보다 늦으면 안내 문구가 나오고 조회하지 않습니다. 마감일 조건 두 개는 한 묶음(and)으로 보냅니다.

결과 컬럼

컬럼의미산출식
기말 재고 고정간접비팔리지 않고 남은 수량에 붙은 고정간접비기말 수량 × 평균 배부율
매출원가 반영 고정간접비흡수원가 이익 계산에 쓴 고정간접비기초 + 당월 − 기말
흡수원가 이익재고를 반영한 이익공헌이익 − 판매관리비 − 매출원가 반영 고정간접비 (판매관리비는 변동원가 이익과 동일하게 차감)
변동원가 이익고정간접비를 당월에 전부 비용으로 본 이익공헌이익 − 당월 고정간접비 − 판매관리비
이익 차이두 이익의 차이흡수원가 이익 − 변동원가 이익
이익 차이 비중(%)차이가 이익에서 차지하는 비율이익 차이 ÷ 흡수원가 이익 × 100

파일 구성

index.html · Component.js · manifest.json
controller/ (BaseController, Main)
view/ (Main.view.xml, DetailDialog.fragment.xml)
model/ (formatter, ErrorHandler)
css/ · i18n/
odata/ (서비스 메타데이터 · service.js · 샘플 응답)
media/ (소개 영상)
readme.html

SAP 표준 기능 확장 포인트

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다.

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

하고 싶은 일표준 화면으로 충분한 부분이 앱이 더하는 관점
품목별 재고 수량 확인수량·재고 현황 조회기말·기초 수량을 산출식에 바로 연결
재고 가치 흐름 확인물자 원장 분석기초·기말 재고 고정간접비를 이익 차이와 한 줄에서 대사
제품별 이익 확인수익성 분석 보고서흡수원가·변동원가 이익을 나란히 놓고 차이를 설명
법정·감사 대응 숫자표준 거래그대로 표준에 두고, 이 화면은 분석과 월마감 점검만 담당

T-code 별 연계 지점

T-code이름연계
MB52창고 재고 현황기말·기초 수량과 이 화면의 수량 열을 맞춥니다. 이 화면 결과 → MB52 로 원천 수량을 확인합니다.
CKM3물자 원장 분석기초·기말 재고 가치 흐름과 재고 고정간접비 열을 맞춥니다.
KE30수익성 분석 보고서제품별 이익을 두 이익과 비교합니다. 차이가 나면 원가계산 방식 설정부터 확인합니다.
KSB1원가요소 개별 항목 조회당월 고정간접비 합계와 맞춥니다. 표준 화면 값 → 이 화면의 품목·월 명세에서 다시 봅니다.
FAGLB03G/L 계정 잔액 조회재고·매출원가 계정 잔액과 이 화면 합계를 맞춥니다.

운영 전환 때 기존 리포트를 없애야 하는지 묻는다면 답은 아니요입니다. 표준 화면은 그대로 두고, 두 이익이 다르다는 질문이 나올 때 이 화면으로 내려가 근거를 대사합니다.

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

이 화면은 OData 서비스만 바라보므로 서비스 뒤에 무엇이 있든 같은 화면이 동작합니다. S/4HANA 에서는 CDS 큐브와 분석 쿼리가 서비스의 원천이 되고, 표준 Fiori 분석 앱이나 Analysis for Office 와 같은 숫자를 서로 다른 화면에서 맞춰 볼 수 있습니다. 표준 CDS 뷰 이름은 시스템마다 달라 이 글에서는 입력 뷰를 가정해 쓰며, 실제 이름은 확인이 필요합니다.

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

자리무엇을 손대나비고
제품군 매핑매핑 테이블에 제품·제품군·적용 기간 입력현업이 직접 유지
배부율 방식서비스의 배부율 계산 한 곳대사식 R04·R05 로 확인
허용 비중·최소 금액설정 값점검 필요 건수를 보며 조정
확장 필드큐브에 사용자 정의 필드 추가화면 열은 서비스 메타데이터에서 추가
권한DCL 의 회사코드·플랜트 조건표준 권한 객체에 연결

분석 지표 정의

지표산식·판정 기준대응 기능원천 데이터비고
이익 차이흡수원가 이익 − 변동원가 이익품목·월 명세 · 요약Item.ProfitGap기말 − 기초 재고 고정간접비와 같아야 함
이익 차이 비중이익 차이 ÷ 흡수원가 이익 × 100점검 판정Item.GapRate허용 비중 5.00%
평균 배부율(기초 재고 고정간접비 + 당월 고정간접비) ÷ (기초 + 생산 수량)기말 재고 산출Item.AvgRate가중평균
점검 필요 비율점검 필요 품목 ÷ 품목·월 수 × 100제품군 요약Group.NeedRate20% 이상이면 제품군 점검 필요

CDS 구성

아래는 구조를 보이기 위한 스케치입니다. 입력 뷰 이름과 필드는 시스템마다 다를 수 있어 확인이 필요하며, 표준 CDS 뷰 이름은 실제로 확인한 것만 썼습니다.

뷰 레이어 구성

레이어객체하는 일왜 나누나
기준 테이블ZABV_PRODGRP제품 → 제품군 매핑제품군 기준이 바뀌어도 과거 월 요약이 흔들리지 않게
차원ZI_AbvProduct제품·제품군 이름과 연결큐브가 이름을 직접 읽지 않게
큐브ZI_AbvItemMonth품목·월 단위 산출(배부율·기말·매출원가 반영)식을 한 곳에 둬 확인 지점을 하나로
쿼리ZC_AbvGapQuery회계연도 필수, 이익 차이·판정대용량에서도 한 해 범위로만 집계
권한ZC_AbvGapQuery (DCL)회사코드·플랜트 접근 제어요약 합계까지 쿼리 단계에서 걸러야 하므로
서비스ZUI_ABV_GAP엔티티셋 4종 노출화면 이름과 같게 맞춰 manifest 주소만 교체

① 제품군 매핑 테이블 — 요약의 기준을 한 곳에 둔다

제품이 어느 제품군에 속하는지는 요약 탭의 모든 숫자를 가르는 기준입니다. 제품 마스터의 속성에 기대면 속성이 바뀔 때 과거 월 요약이 함께 바뀌므로, 적용 기간이 있는 매핑 테이블을 따로 둡니다. 현업이 직접 유지하는 유일한 테이블입니다.

" ───────────────────────────────────────────────────────────
" ZABV_PRODGRP — 제품 → 제품군 매핑 (현업 유지)
" 왜 따로 두나: 제품군 기준이 바뀌어도 과거 월 요약이 흔들리지 않게
"             적용 시작·종료일을 갖는 테이블에서 한 번에 관리한다.
" ───────────────────────────────────────────────────────────
@EndUserText.label : '제품군 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #ALLOWED
define table zabv_prodgrp {
  key client    : abap.clnt not null;
  key bukrs     : bukrs     not null;
  key matnr     : matnr     not null;
  key valid_from: abap.dats not null;
  valid_to      : abap.dats;
  prodgrp       : abap.char(3);
  prodgrp_name  : abap.char(16);
}

② 차원 뷰 — 품목과 제품군

큐브가 제품 이름과 제품군 이름을 직접 읽지 않고 차원 뷰를 거치게 해, 이름 변경이나 다국어가 큐브 집계에 영향을 주지 않게 합니다. 여기서 이름 텍스트와 제품군을 연결(association)해 둡니다.

" ───────────────────────────────────────────────────────────
" ZI_AbvProduct — 품목 차원
" 역할: 제품 코드·이름·제품군을 한 번에 제공. 큐브는 이 뷰의 키만 안다.
" ───────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '품목 차원'
@Analytics.dataCategory : #DIMENSION
@ObjectModel.representativeKey : 'Product'
define view entity ZI_AbvProduct
  as select from zabv_prodgrp as m
  association [0..1] to I_ProductText as _Text
    on  _Text.Product  = $projection.Product
    and _Text.Language = $session.system_language
{
  key m.bukrs       as CompanyCode,
  key m.matnr       as Product,
  key m.valid_from  as ValidFrom,
      m.valid_to    as ValidTo,
      m.prodgrp     as ProductGroup,
      m.prodgrp_name as ProductGroupName,
      _Text
}

③ 큐브 — 품목·월 단위의 산출

이 글의 핵심 뷰입니다. 평균 배부율, 기말 재고 고정간접비, 매출원가 반영 고정간접비, 두 이익, 이익 차이까지 한 번에 산출해 화면이 계산을 다시 하지 않게 합니다. 수량·재고 가치·발생액을 읽어 오는 원천 뷰 이름은 시스템마다 다를 수 있어 아래에서는 입력 뷰 ZI_AbvSource 로 가정했습니다(확인 필요).

" ───────────────────────────────────────────────────────────
" ZI_AbvItemMonth — 품목·월 큐브
" 역할: 흡수원가·변동원가 이익과 재고 고정간접비를 품목·월마다 산출
" 이렇게 나눈 이유: 식을 서비스나 화면이 아니라 큐브 한 곳에 둬야
"                   표준 화면과 숫자를 맞출 때 확인 지점이 하나다.
" ───────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '품목·월 흡수/변동원가 큐브'
@Analytics.dataCategory : #CUBE
define view entity ZI_AbvItemMonth
  as select from ZI_AbvSource as s
  association [1..1] to ZI_AbvProduct as _Product
    on  _Product.CompanyCode = $projection.CompanyCode
    and _Product.Product     = $projection.Product
{
  key s.CompanyCode,
  key s.FiscalYear,
  key s.FiscalPeriod,
  key s.Product,
      _Product,
      s.CloseDate,
      s.OpenQty, s.ProdQty, s.SalesQty,
      cast( s.OpenQty + s.ProdQty - s.SalesQty as abap.int4 )          as CloseQty,

      @Semantics.amount.currencyCode : 'Currency'
      s.SalesAmt,
      @Semantics.amount.currencyCode : 'Currency'
      s.VarCost,
      @Semantics.amount.currencyCode : 'Currency'
      s.FixedOverhead                                                  as FohAmt,
      @Semantics.amount.currencyCode : 'Currency'
      s.OpenFoh,

      " 평균 배부율 = (기초 재고 FOH + 당월 FOH) / (기초 수량 + 생산 수량)
      cast( case when ( s.OpenQty + s.ProdQty ) = 0 then 0
                 else ( s.OpenFoh + s.FixedOverhead ) / ( s.OpenQty + s.ProdQty )
            end as abap.dec(15,4) )                                    as AvgRate,

      s.Currency
}

④ 분석 쿼리 — 화면이 부르는 조회

화면의 조회조건(회계연도·제품군·제품명·마감일·점검 결과)이 그대로 쿼리의 필터가 됩니다. 회계연도를 필수 파라미터로 받아 대용량에서도 한 해 범위로만 집계하게 하고, 허용 비중과 최소 금액은 파라미터가 아니라 설정 테이블에서 읽어 판정의 일관성을 지킵니다.

" ───────────────────────────────────────────────────────────
" ZC_AbvGapQuery — 분석 쿼리 (화면 ItemSet 이 읽는 뷰)
" 역할: 이익 차이와 점검 판정을 계산해 서비스에 노출
" ───────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '이익 차이 점검 쿼리'
@Analytics.query : true
@ObjectModel.usageType.dataClass : #MIXED
define view entity ZC_AbvGapQuery
  with parameters
    @Consumption.filter : { mandatory : true }
    P_FiscalYear : gjahr
  as select from ZI_AbvItemMonth as c
{
  @Consumption.filter.selectionType : #SINGLE
  key c.FiscalYear,
  key c.FiscalPeriod,
  key c.Product,
      @AnalyticsDetails.query.axis : #ROWS
      c._Product.ProductGroup,
      c.CloseQty * c.AvgRate                                           as CloseFoh,
      c.OpenFoh + c.FohAmt - ( c.CloseQty * c.AvgRate )                as CogsFoh
}
where c.FiscalYear = $parameters.P_FiscalYear

⑤ 권한 — 회사코드·플랜트 단위

권한은 쿼리에 겁니다. 서비스나 화면에서 걸러 내면 요약 합계가 전체 값으로 먼저 계산되어 남의 숫자가 뺄셈으로 새어 나갈 수 있습니다. DCL 로 회사코드와 플랜트를 표준 권한 객체에 연결합니다.

" ───────────────────────────────────────────────────────────
" ZC_AbvGapQuery 의 접근 제어 (DCL)
" 이유: 요약·합계까지 한 번에 걸러야 하므로 쿼리 단계에서 건다.
" ───────────────────────────────────────────────────────────
@EndUserText.label : '이익 차이 점검 권한'
@MappingRole : true
define role ZC_AbvGapQuery {
  grant select on ZC_AbvGapQuery
    where ( CompanyCode ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}

⑥ 서비스 정의와 바인딩

쿼리를 OData V2 서비스로 노출합니다. 노출 이름은 화면이 부르는 엔티티셋 이름(ItemSet · PeriodSet · GroupSet · ReconSet)과 같게 맞추고, 게시 뒤 manifest 의 서비스 주소만 교체합니다.

" ───────────────────────────────────────────────────────────
" ZUI_ABV_GAP — 서비스 정의 + 바인딩(OData V2 - UI)
" 이름 맞추기: 화면이 부르는 엔티티셋 이름과 같게 as 로 지정
" ───────────────────────────────────────────────────────────
@EndUserText.label : '흡수·변동원가 이익 차이 서비스'
define service ZUI_ABV_GAP {
  expose ZC_AbvGapQuery  as ItemSet;
  expose ZC_AbvPeriodQ   as PeriodSet;
  expose ZC_AbvGroupQ    as GroupSet;
  expose ZC_AbvReconQ    as ReconSet;
}
" 서비스 바인딩: 유형 OData V2 - UI, 게시 후 /IWFND/MAINT_SERVICE 에서 활성 여부 확인

운영 시점에 해야 할 일

개발보다 정하는 일이 많습니다. 아래 아홉 가지는 코딩이 아니라 합의입니다.

해야 할 일무엇을 정하나정하지 않으면누가
제품군 매핑어느 제품이 어느 제품군에 속하는지요약이 명세와 다른 기준으로 모입니다회계팀 · 현업
배부율 방식가중평균·선입선출·표준원가 중 무엇을 쓰는지대사식 R04·R05 가 새 방식에서 깨집니다회계팀
허용 비중과 최소 금액점검 필요를 올릴 기준점검 필요가 너무 많아 아무도 보지 않거나 너무 적어 놓칩니다관리회계팀
원천 확정수량·재고 가치·발생액·장부 반영 금액을 어느 원천에서 읽는지화면 숫자가 표준 화면과 첫 회의에서 어긋납니다회계팀 · 기술팀
권한 범위회사코드·플랜트 단위 조회 범위요약이 전체 값으로 계산되어 남의 숫자가 보입니다보안 · 권한
성능 기준회계연도 필수·조회 행 상한·집계 위치대용량에서 응답이 늦어집니다기술팀
대사 체계표준 T-code 와 맞출 항목과 주기두 화면 숫자를 누가 언제 맞추는지 모호해집니다회계팀
전송(TR) 순서매핑 테이블 → 뷰 → 큐브 → 쿼리 → DCL → 서비스권한이나 서비스가 먼저 올라가 조회가 비거나 막힙니다기술팀
서비스 활성화서비스 게시와 manifest 서비스 주소 교체화면이 샘플 서비스를 계속 바라봅니다기술팀

운영 데이터로 갈 때

품목이 수만 개, 월이 열두 개, 연도가 여러 개가 되면 집계 위치가 성능을 좌우합니다. 큐브에서 품목·월 집계를 끝내고 화면은 결과 행만 받게 하며, 회계연도를 필수 파라미터로 받고, 조회 행 수에 상한을 두고, 원천 뷰의 회계연도·품목 조건에 인덱스를 확인합니다. 응답 시간 기준은 첫 화면 몇 초 안으로 먼저 정해 두시기를 권합니다.

자주 묻는 질문

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

숫자와 산식

두 이익이 다른 것은 오류입니까?

아닙니다. 흡수원가 방식은 고정제조간접비를 재고에 얹어 두었다가 팔린 만큼만 매출원가로 내리고, 변동원가 방식은 발생한 달에 전부 비용으로 봅니다. 그래서 재고가 늘면 흡수원가 이익이 커지고 재고가 줄면 작아집니다. 오류 여부는 두 이익의 차이가 기말 재고 고정간접비에서 기초 재고 고정간접비를 뺀 금액과 같은지로 판단합니다.

평균 배부율은 어떻게 구합니까?

(기초 재고 고정간접비 + 당월 고정간접비) ÷ (기초 수량 + 생산 수량) 으로 구하는 가중평균입니다. 기말 재고 고정간접비는 이 배부율에 기말 수량을 곱한 값입니다. 선입선출이나 표준원가를 쓰는 회사는 배부율 계산식만 바꾸면 되며, 두 이익의 대사식 자체는 그대로입니다.

허용 비중 5.00%와 5백만 원은 누가 정합니까?

회사가 정합니다. 화면은 서비스가 내려 주는 허용 비중과 최소 차이 금액을 그대로 쓰고 값을 고정해 두지 않습니다. 검증용 샘플 데이터에서는 5.00%와 5백만 원으로 두었습니다. 기준을 낮추면 점검 필요 건수가 늘고 높이면 줄기 때문에, 첫 달에는 건수가 점검 가능한 수준인지 보면서 정하시기를 권합니다.

점검 필요가 나오면 오류가 난 것입니까?

아닙니다. 점검 필요는 확인할 대상이라는 뜻이며 원인을 단정하지 않습니다. 재고가 크게 늘거나 줄어 차이가 허용 비중을 넘은 것일 수도 있고, 장부에 반영된 금액이 재계산과 다른 것일 수도 있습니다. 최종 판단은 회사와 감사인이 합니다.

장부 반영 불일치와 기초 이월 불일치는 무엇입니까?

장부 반영 불일치는 장부에 실제로 반영된 고정간접비가 이 화면이 다시 계산한 매출원가 반영 금액과 다른 건입니다. 기초 이월 불일치는 이번 달 기초 재고 고정간접비가 전월 기말 재고 고정간접비와 이어지지 않는 건입니다. 두 경우 모두 점검 코드 열로 구분되며 대사 결과 탭에서 건수가 따로 집계됩니다.

검증용 샘플 데이터는 어떻게 구성했습니까?

전동 펌프·유량 밸브·제어 보드·센서 모듈 네 제품군, 제품 8개, 2026년 1~9월로 품목·월 72건입니다. 점검 필요 12건은 재고 증감으로 차이가 큰 건 6건과 일부러 넣은 예외 6건입니다. 실제 업무 데이터가 아니라 화면과 대사식을 검증하기 위한 샘플입니다.

왜 대사식이 아홉 개나 됩니까?

한 건의 이익 차이를 믿으려면 그 앞단의 숫자가 모두 맞아야 합니다. 매출·변동원가·공헌이익, 수량 흐름, 재고 고정간접비 흐름, 두 이익의 차이, 전월 이월, 월별·제품군 합계, 누적 차이를 각각 잠가 두면 어느 층에서 어긋났는지가 바로 나옵니다. 아홉 식 모두 이번 검증에서 차이 0건이었습니다.

조회 속도는 어떻습니까?

샘플 규모에서는 즉시 열립니다. 운영 규모에서는 품목·월 집계를 서비스 쪽 CDS 큐브에서 미리 끝내고 화면은 결과 행만 받도록 하는 것이 전제입니다. 회계연도를 필수 조건으로 둔 것도 그 때문입니다.

화면과 조작

월별 요약과 제품군 요약에는 왜 일부 조건만 적용됩니까?

월별 요약은 마감일, 제품군 요약은 제품군과 점검 결과 조건만 적용합니다. 제품명처럼 품목 단위에서만 의미가 있는 조건을 요약에 적용하면 합계가 명세와 어긋나 보이기 때문입니다. 표 위 안내 문구에 이 규칙이 적혀 있습니다.

CSV 에는 무엇이 담깁니까?

현재 탭에 보이는 열과 같은 순서로 같은 조건의 결과가 담깁니다. 금액은 원 단위 그대로이고 비중은 퍼센트 값입니다. 대사 결과 탭에서는 대사식 문자열까지 함께 저장되어 검토 자료로 바로 쓸 수 있습니다.

표준 T-code 화면을 없애도 됩니까?

아니요. 재고 수량은 MB52, 물자 원장은 CKM3, 수익성은 KE30, 원가요소 개별 항목은 KSB1, 계정 잔액은 FAGLB03 이 계속 담당합니다. 이 화면은 그 숫자를 이어 받아 두 이익의 차이 관점으로 대사하는 확장이며, 법정·감사 대응은 표준 거래에 그대로 둡니다.

표준 연계와 데이터

데이터 원천은 어디입니까?

수량과 재고 가치는 재고 마스터 계열 테이블, 고정제조간접비 발생액은 원가 집계, 매출은 청구 문서, 장부 반영 금액은 회계 전표에서 옵니다. S/4HANA 에서는 원가 정보가 유니버설 저널에 통합되어 있으므로 실제 필드 매핑은 시스템에서 확인이 필요합니다.

S/4HANA 와 ECC 모두에서 쓸 수 있습니까?

화면은 OData 서비스만 바라보므로 서비스 뒤의 원천이 무엇이든 같은 화면이 동작합니다. 원천이 ECC 이면 서비스를 ABAP 클래스나 CDS 기반으로, S/4HANA 이면 CDS 큐브 기반으로 구현합니다. 어느 쪽이든 화면과 대사식은 바뀌지 않습니다.

권한은 어떻게 겁니까?

회사코드와 플랜트 단위 표준 권한을 서비스의 집계 단계에 겁니다. 화면에만 걸면 요약 합계가 전체 값으로 계산되어 남의 숫자가 드러나므로, 요약을 만드는 쿼리에 먼저 걸어야 합니다. CDS 에서는 DCL 로 정의합니다.

제품 코드나 제품군이 바뀌면 어떻게 합니까?

제품군 매핑은 별도 매핑 테이블 한 곳에서만 관리합니다. 새 제품이 생기면 어느 제품군에 속하는지만 적어 주면 화면과 요약이 같은 기준으로 다시 집계됩니다. 이 작업은 현업이 직접 합니다.

배부율 계산 방식이 회사마다 다르면 어떻게 합니까?

가중평균이 아닌 방식을 쓰는 회사는 서비스의 배부율 계산 한 곳만 바꿉니다. 대사식과 화면은 그대로이고, 대사 결과 탭의 R04·R05 가 새 계산에서도 차이 0 이 되는지로 변경이 맞는지 확인합니다.

감사인에게 어떻게 설명합니까?

화면은 기준서 해석을 대신하지 않고 회사가 정한 배부 결과의 대사 근거를 보여 줍니다. 대사 결과 탭의 대사식과 CSV 를 근거 자료로 쓰시고, 최종 판단은 회사와 감사인이 합니다. 예외 건은 별도 표시되어 있어 설명 자료를 따로 만들 필요가 줄어듭니다.

도입과 운영

좁은 화면에서도 쓸 수 있습니까?

데스크톱과 태블릿을 대상으로 만들었습니다. 열이 많은 명세 표는 가로 스크롤을 쓰고 요약 상자는 줄바꿈으로 내려옵니다. 휴대폰은 대상이 아닙니다.

운영 데이터로 연결하는 절차와 시간은 어느 정도입니까?

CDS 큐브와 서비스를 올리고 manifest 의 서비스 주소만 바꾸는 순서입니다. 기술 작업은 며칠 단위이고, 오래 걸리는 쪽은 제품군 매핑·배부율 방식·허용 비중 같은 합의입니다. 합의가 끝나면 코드는 이 글의 CDS 구성을 출발점으로 쓰시면 됩니다.

적용 시기나 범위가 정해져 있습니까?

정해진 것은 없습니다. 이 글의 숫자는 검증용 샘플 데이터 기준이며, 회사의 결산 일정과 원가계산 방식에 맞춰 범위를 정합니다. 기준서 적용 시기에 관해 확인된 사실이 필요한 경우에는 해당 기준서의 시행 시점을 회사가 직접 확인하셔야 합니다.

기존 관리회계 보고서를 이 화면으로 대체해야 합니까?

대체가 아니라 병행입니다. 기존 보고서는 그대로 두고, 두 이익이 다르다는 질문이 나올 때 이 화면으로 품목·월까지 내려가 차이의 근거를 대사합니다. 몇 달 병행해 숫자가 맞는 것을 확인한 뒤 쓰임새를 정하시면 됩니다.

유지보수에서 매달 손이 가는 곳은 어디입니까?

제품군 매핑과 허용 비중 검토가 중심입니다. 새 제품이 생길 때 제품군을 지정하고, 점검 필요 건수가 너무 많거나 적으면 기준값을 조정합니다. 화면 코드를 고칠 일은 거의 없습니다.