관리회계

SAP 매출원가 대사 점검 — 판매 출고 기준 기대액과 원장 전기액을 자재 한 줄에 놓고, 차이를 수량·단가·수기 조정으로 가른다

기대 매출원가와 전기 매출원가의 대사 · 수량 · 단가 · 수기 조정 세 요인 분해 · 자재 · 제품군 · 계정 · 월 단위 점검 · 한도 밖만 가려내는 판정 — 소개 영상과 실제 화면 8종, 그리고 CDS 코드까지

소개 영상블로그 목차 순서대로 · 자막 포함8개 장면표지 → 문제 → 조회 → 요인 분해 → 집계 → 대사 → 정리

도입 포인트 — 이 앱을 사용해야 하는 이유

월마감에서 매출원가를 점검하는 질문은 늘 같습니다. 판매한 만큼의 원가가 장부에 올라갔나, 어긋났다면 수량 때문인가 단가 때문인가 수기 전표 때문인가, 그래서 어디부터 열어 봐야 하나. 지금은 이 세 답이 빌링 문서, 자재 문서, 원장 전표에 흩어져 있고, 엑셀에서 손으로 맞춥니다. 이 앱은 세 자료를 자재 · 월 한 줄에 놓고 차이를 요인으로 가릅니다.

한 줄 요약 — 합계가 맞아 보인다고 안심하기 전에, 자재 단위에서 서로 상쇄되는 차이를 찾아냅니다. 기대 매출원가(판매 수량 × 평가 단가)와 전기 매출원가(출고 수량 × 전기 단가 + 수기 조정)를 견주고, 세 요인의 합이 총 차이와 1원도 어긋나지 않는지 매번 검산합니다.

핵심 포인트 여섯 가지

포인트고객이 얻는 것지금 방식이라면
① 기대액과 전기액을 한 줄에판매 수량 × 평가 단가와 출고 수량 × 전기 단가 + 수기 조정을 자재 · 월 한 줄에서 견줍니다.빌링 · 자재 문서 · 원장 전표를 따로 열어 엑셀에서 맞춥니다.
② 차이를 세 요인으로수량 요인 · 단가 요인 · 수기 조정 요인으로 가르고, 합이 총 차이와 같은지 보여 줍니다.차이 금액만 보고 원인은 사람이 하나씩 추적합니다.
③ 한도 밖만 가려낸다차이율 절대값 0.5% 이내는 정상으로 두고, 넘는 자재만 점검 필요로 올립니다.전 품목을 훑다가 경미한 차이에 시간을 씁니다.
④ 수기 조정 계정을 따로수기 전표가 쌓이는 계정은 사유와 증빙 확인 대상으로 표시합니다.수기 전표가 전체 숫자 속에 섞여 보이지 않습니다.
⑤ 대사식으로 스스로 검산정합성 대사 여섯 가지의 차이 건수가 0 인지 화면에서 바로 확인합니다."이 숫자 맞아?" 를 회의에서 매번 되묻습니다.
⑥ 사내망 · 보안 친화OpenUI5 표준 컨트롤만 쓰고 데이터는 OData V2 서비스로 받습니다. 외부 차트 라이브러리가 없습니다.라이브러리 하나를 들이려면 보안 검토부터 거칩니다.

사례로 보는 효과 — 합계는 +1.9백만원, 그런데 자재 여섯 건이 서로 상쇄되고 있었다

2026년 1~6월 전체를 보면 기대 매출원가는 1,811.6백만원, 전기 매출원가는 1,813.5백만원으로 차이는 +1.9백만원(0.10%) 입니다. 합계 리포트만 보면 문제가 없습니다. 그런데 자재 단위로 내려가면 한도 0.5% 를 넘는 건이 여섯 개입니다. 정밀 기어박스 3월은 월말 출고 18개가 청구 수량보다 많아 +3.87백만원(+11.39%), 서보 드라이브 5월은 수기 조정 전표 −2.45백만원(−7.23%) 가 들어갔습니다. 플러스와 마이너스가 서로 지워져 합계는 얌전해 보였던 것입니다.

자재 i 마다
수량 요인 = (출고 수량 − 판매 수량) × 평가 단가  ·  단가 요인 = 출고 수량 × (전기 단가 − 평가 단가)  ·  수기 조정 요인 = 수기 조정 전표 금액

세 항을 더하면 전기 매출원가 − 기대 매출원가와 정확히 같아집니다. 전개하면 교차항이 서로 지워지도록 정의했기 때문입니다.

분해에는 조건을 걸었습니다. 세 요인의 합이 총 차이와 1원도 어긋나면 안 됩니다. 이 사례 데이터에서 대사 R01 이 60건 전수로 이 등식을 검산했고 차이는 0 입니다. 보고 자리에서 "이 숫자 맞아?" 라는 질문에 바로 답할 수 있다는 뜻입니다.

도입하면 달라지는 것

  • 마감 점검 시간 — 전 품목을 훑는 대신 한도 밖 자재 여섯 줄만 열어 봅니다.
  • 회의의 주제 — "합계가 왜 이래" 가 아니라 "이 자재의 출고 시점을 누가 확인할 것인가" 를 이야기합니다.
  • 수기 전표의 가시성 — 수기 조정 계정과 금액이 따로 보여, 사유와 증빙을 확인할 대상이 분명해집니다.
  • 다음 달로 이어지는 기준 — 한도와 점검 코드가 화면에 박혀 있어 담당자가 바뀌어도 같은 기준으로 봅니다.

이런 회사에 맞습니다

S/4HANA 에서 매출원가를 월마감 때 엑셀로 맞추고 있는 관리회계팀, 판매 · 출고 · 원장 숫자가 어긋날 때 어느 쪽이 원인인지 찾는 데 시간을 쓰는 원가 담당자, 수기 조정 전표를 감사 대응용으로 한눈에 보고 싶은 경영지원 조직에 맞습니다.

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

점검 도구에서 가장 비싼 질문은 "이 숫자 맞아?" 입니다. 그래서 만드는 쪽에서 먼저 대사식을 세워 두고 전수로 돌렸습니다. 아래는 이 사례 데이터의 결과입니다.

대사식검사 건수차이
수량 · 단가 · 수기 요인 합계 = 총 차이 (자재 라인)600
기대 매출원가 = 판매 수량 × 평가 단가 (자재 라인)600
제품군 합계 = 자재 라인 합계 (제품군 · 월)180
월 합계 = 제품군 합계 (월)60
원장 매출원가 계정 전기액 합계 = 월 전기 매출원가 (월)60
계정별 전기액 = 자재 라인 계정별 합계 (계정 · 월)180
의도적 예외 — 한도 0.5% 초과 자재 라인606 (의도적)

정합성 대사 여섯 가지는 모두 차이 0 이고, 한도를 넘도록 일부러 심어 둔 자재 여섯 건은 대사 차이와 섞이지 않게 따로 적었습니다. 화면 쪽은 이와 별도로 브라우저 자동화로 확인했습니다 — 조회조건 · 정렬 · 행 클릭 상세 · 서비스 호출 형식을 매번 다시 잽니다.

사용 방법

  1. 회계연도를 확인하고(필수, 4자리) 필요하면 전기 월 시작 · 종료, 제품군, 자재, 점검 결과를 고릅니다. 비워 두면 전체입니다.
  2. 조회 버튼을 누르거나 입력 칸에서 Enter 를 누릅니다. 화면을 처음 열 때는 한 번 자동으로 조회됩니다.
  3. 위쪽 요약 숫자에서 기대 · 전기 매출원가, 차이, 점검 필요 자재 · 제품군, 수기 조정 합계, 대사 차이 건수를 봅니다.
  4. 탭을 자재 명세 → 제품군별 집계 → 원가 계정 → 월별 추이 → 대사 결과 순서로 오가며 범위를 넓혀 봅니다.
  5. 궁금한 행을 누르면 상세 창이 열려 값 전체와 같은 조건의 자재 라인이 나옵니다.
  6. 현재 탭의 결과가 필요하면 CSV 내려받기 로 UTF-8 CSV 를 받습니다.

실행 화면

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

처음 연 화면 — 조회조건과 요약 숫자, 자재 명세
처음 연 화면 — 조회조건과 요약 숫자, 자재 명세 — 조회조건 줄 아래에 요약 숫자 일곱 개가 놓이고, 그 아래 자재 명세 탭이 열립니다. 화면을 열면 한 번 자동 조회됩니다.

처음 열면 2026년 1~6월 전체가 조회됩니다. 요약 타일은 기대 매출원가 1,811.6 · 전기 매출원가 1,813.5 · 차이 +1.9 백만원, 점검 필요 자재 6, 점검 필요 제품군 6, 수기 조정 합계 −2.1 백만원, 대사 차이 0 입니다. 전체 차이가 +1.9백만원, 0.10% 로 한도 안쪽이라 이 숫자만 보면 문제가 없어 보이는데, 아래 표에는 점검 필요 자재가 여섯 줄 숨어 있습니다.

조건 조회 — 제품군을 고르고 Enter
조건 조회 — 제품군을 고르고 Enter — 제품군을 구동 장치로 고르고 입력 칸에서 Enter 를 누른 화면입니다. 조회 버튼과 같은 동작입니다.

조회조건은 회계연도(필수), 전기 월 시작·종료, 제품군, 자재, 점검 결과입니다. 비워 두면 전체이고, 전체는 필터를 만들지 않습니다. 입력 칸에서 Enter 를 눌러도 조회됩니다.

제품군별 집계 — 제품군 × 월
제품군별 집계 — 제품군 × 월 — 제품군과 월 단위로 합친 표입니다. 기대 · 전기 매출원가와 차이, 세 요인, 점검 필요 자재 수가 한 줄에 있습니다.

자재 라인을 제품군·월로 합산한 18줄입니다. 제품군 한도는 자재보다 느슨한 1.0% 로 두었습니다. 제품군 줄은 원인을 말하지 않고 "점검 필요 자재 1건 — 자재 상세에서 확인" 으로 자재 명세로 돌려보냅니다.

원가 계정 — 원장 전기액과 자재 라인 합계
원가 계정 — 원장 전기액과 자재 라인 합계 — 매출원가 계정별로 원장에 전기된 금액과 자재 라인 합계를 대조한 표입니다.

제품매출원가(510100), 상품매출원가(510200), 매출원가 수기 조정(510900) 세 계정을 월별로 봅니다. 수기 조정 계정은 3월과 5월에 전표가 있어 점검 필요로 표시됩니다. 원장 금액과 자재 라인 합계의 차이는 모두 0 입니다.

월별 추이 — 기대·전기 매출원가와 차이율
월별 추이 — 기대·전기 매출원가와 차이율 — 월 단위 합계입니다. 월별 차이율이 한눈에 보입니다.

월별 차이율은 0.08% · 0.01% · 1.34% · 0.45% · −0.84% · −0.42% 입니다. 3월만 한도 0.5% 를 넘고, 5월과 6월은 부호가 반대입니다. 월 합계로만 보면 4월의 0.45% 는 정상이지만, 그 안에 커플링의 +5.43% 가 들어 있습니다.

행 클릭 상세 — 자재 한 줄의 내역
행 클릭 상세 — 자재 한 줄의 내역 — 자재 한 줄을 누르면 열리는 상세 창입니다. 값 전체와 같은 조건의 자재 라인이 함께 나옵니다.

커플링 4월입니다. 판매 · 출고 수량은 873개로 같고, 평가 단가 27,600원에 전기 단가 29,100원이 들어가 단가 요인 +1,309,500원이 생겼습니다. 단가 갱신일이 4월 1일이라 점검 내용에는 "표준단가 갱신 전 단가로 전기 — 단가 갱신 시점 확인 필요" 가 적힙니다.

점검 필요만 조회 — 자재 여섯 줄
점검 필요만 조회 — 자재 여섯 줄 — 점검 결과를 점검 필요로 고른 자재 명세입니다.

여섯 줄이 남습니다. 정밀 기어박스 3월(수량 +11.39%), 커플링 4월(단가 +5.43%), 서보 드라이브 5월(수기 −7.23%), 인버터 모듈 6월(복합 −3.14%), 케이블 어셈블리 3월(수기 +1.08%), 제어 패널 1월(단가 +0.61%) 입니다.

대사 결과 — 검사 건수와 차이 건수
대사 결과 — 검사 건수와 차이 건수 — 대사식별 검사 건수와 차이 건수를 보여 줍니다.

정합성 대사 R01~R06 의 차이 건수는 모두 0 이고, E01 은 한도 초과 자재 6건을 의도적 예외로 분리해 적었습니다. 화면 위쪽 요약 타일의 "대사 차이 건수" 가 이 표와 같은 값입니다.

SAP 표준 기능 확장 포인트

이 앱은 SAP 표준을 대체하지 않습니다. 표준이 이미 잘하는 일은 표준에 맡기고, 표준이 끊기는 자리만 이어 붙이는 쪽으로 만들었습니다. 어디까지가 표준이고 어디서부터 이 앱인지를 먼저 적습니다.

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

하고 싶은 일SAP 표준표준에서 걸리는 자리이 앱이 하는 일
판매 수량 확인VF03문서 단위라 자재 · 월 합계를 따로 만들어야 합니다자재 · 월로 합산해 기대액에 씁니다
출고 수량 · 출고일 확인MB51청구 수량과 나란히 놓고 보지 못합니다판매 수량과 한 줄에서 견줍니다
매출원가 계정 전기액FAGLL03전표 라인이 길어 자재별 차이를 찾기 어렵습니다계정 · 월 합계와 자재 라인 합계를 대조합니다
평가 단가 확인CKM3자재를 하나씩 열어야 합니다평가 단가와 전기 단가의 차이를 단가 요인으로 보여 줍니다
자재 마스터 확인MM03평가 클래스와 자재 유형을 한 자재씩 봅니다자재 구분(완제품 · 상품)과 원가 계정을 같은 줄에 둡니다
자동 계정 결정OBYC출고가 어느 매출원가 계정으로 가는지 설정을 열어 봅니다제품매출원가 · 상품매출원가 계정을 월별로 대조합니다
차이의 원인 분해—표준에 없습니다. 보통 엑셀로 만듭니다수량 · 단가 · 수기 조정 세 요인으로 가르고 합계를 검산합니다

이 앱이 더하는 관점

  • 자재 한 줄에서 세 자료를 대조 — 빌링, 자재 문서, 원장 전표를 한 줄에 놓습니다.
  • 한도 판정과 점검 코드 — 차이율 0.5% 를 넘으면 가장 큰 요인에 따라 QTY · PRC · MAN · MIX 코드를 답니다.
  • 상쇄 차이의 노출 — 합계가 작아도 자재별 차이는 따로 보입니다.
  • 대사 결과의 상시 표시 — 정합성 대사 차이 건수를 요약 숫자로 계속 보여 줍니다.

도입할 때 정할 것

① 판매 · 출고 수량의 출처 — 빌링 품목(취소 · 반품 처리 포함)과 출고 자재 문서(이동 유형) 중 무엇을 합산할지 정합니다.

② 수기 조정 식별 기준 — 전용 계정, 전표 유형, 입력 경로 중 어느 것으로 수기 전표를 가릴지 정합니다.

③ 차이율 한도 — 자재 0.5% · 제품군 1.0% 는 샘플 기준이며 회사의 내부 통제 기준으로 바꿉니다.

④ 회계기간 매핑 — 이 사례는 달력월과 같다고 가정했습니다.

CDS 구성

이 사례의 화면은 샘플 데이터를 서비스 파일에서 읽습니다. 운영 데이터에서는 집계를 CDS 로 내리는 것이 첫 작업입니다. 아래는 그때 만드는 뷰의 스케치입니다.

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

뷰 레이어 구성

레이어뷰하는 일왜 나누나
판매ZI_CogsReconSales빌링 품목을 자재 · 월로 합산취소 전표 제외 규칙을 한 곳에 둡니다.
출고ZI_CogsReconIssue출고 자재 문서를 자재 · 월로 합산이동 유형을 회사 설정으로 바꾸기 쉽게 둡니다.
수기 조정ZI_CogsReconManual수기 조정 계정 전표를 합산식별 기준이 바뀌어도 이 뷰만 고칩니다.
라인ZI_CogsReconLine세 뷰를 합쳐 기대액 · 전기액 · 세 요인 계산요인 산식을 한 번만 정의합니다.
집계ZI_CogsReconGrp · ZI_CogsReconAcct제품군 · 월, 계정 · 월 집계화면이 들고 묶던 일을 DB 로 내립니다.
서비스 · 권한ZUI_COGSRECON · DCLOData V2 로 노출, 회사코드 권한집계를 읽는 자리에 권한을 겁니다.

원천 테이블

테이블용도
VBRK · VBRP빌링 헤더 · 품목 (판매 수량)
MKPF · MSEG자재 문서 헤더 · 품목 (출고 수량 · 출고일)
MBEW자재 평가 (평가 단가 · 갱신일)
ACDOCA유니버설 저널 (매출원가 계정 전기액 · 수기 조정)
T030자동 계정 결정 (출고 → 매출원가 계정)

① 판매 수량 집계

청구 취소 전표를 빼고 자재 · 월로 합산합니다. 회계기간을 달력월로 단순화한 자리가 있어 운영에서는 기간 매핑으로 바꿉니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출원가 대사 — 판매 수량 집계 (스케치)'
define view entity ZI_CogsReconSales
  as select from I_BillingDocumentItem as bi
    inner join   I_BillingDocument     as bh
      on bh.BillingDocument = bi.BillingDocument
{
  key bh.CompanyCode                                  as CompanyCode,
  key left( bh.BillingDocumentDate, 4 )               as Gjahr,
  key substring( bh.BillingDocumentDate, 5, 2 )       as Period,   " 달력월 가정 — 확인 필요
  key bi.Product                                      as MatCode,
      bi.BaseUnit                                     as BaseUnit,
      @Semantics.quantity.unitOfMeasure: 'BaseUnit'
      sum( bi.BillingQuantityInBaseUnit )             as SalesQty
}
where bh.BillingDocumentIsCancelled = ''              " 취소 전표 제외
group by bh.CompanyCode, bh.BillingDocumentDate, bi.Product, bi.BaseUnit

② 출고 수량 · 전기 단가 집계

납품 출고 이동 유형의 수량과 금액을 합산합니다. 이동 유형은 회사마다 달라 확인이 필요한 자리입니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출원가 대사 — 출고 수량·전기 단가 집계 (스케치)'
define view entity ZI_CogsReconIssue
  as select from I_MaterialDocumentItem_2 as mi
{
  key mi.CompanyCode                                  as CompanyCode,
  key left( mi.PostingDate, 4 )                       as Gjahr,
  key substring( mi.PostingDate, 5, 2 )               as Period,
  key mi.Material                                     as MatCode,
      mi.MaterialBaseUnit                             as BaseUnit,
      @Semantics.quantity.unitOfMeasure: 'BaseUnit'
      sum( mi.QuantityInBaseUnit )                    as IssueQty,
      sum( mi.TotalGoodsMvtAmtInCCCrcy )              as IssueAmt,   " 출고 금액 — 원장과 대사 필요
      max( mi.PostingDate )                           as GiDate
}
where mi.GoodsMovementType = '601'                    " 납품 출고 — 이동 유형은 회사별 확인
group by mi.CompanyCode, mi.PostingDate, mi.Material, mi.MaterialBaseUnit

③ 수기 조정 전표 집계

수기 조정 전용 계정에 전기된 금액을 자재 · 월로 합산합니다. 수기 전표를 어떻게 가릴지는 도입에서 가장 먼저 합의할 항목입니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출원가 대사 — 수기 조정 전표 집계 (스케치)'
define view entity ZI_CogsReconManual
  as select from I_JournalEntryItem as je
{
  key je.CompanyCode                                  as CompanyCode,
  key je.FiscalYear                                   as Gjahr,
  key je.FiscalPeriod                                 as Period,
  key je.Material                                     as MatCode,
      sum( je.AmountInCompanyCodeCurrency )           as ManualAmt,
      count( distinct je.AccountingDocument )         as DocCnt
}
where je.GLAccount = '0000510900'                     " 수기 조정 전용 계정 — 식별 기준은 회사가 정한다
  and je.Ledger    = '0L'
group by je.CompanyCode, je.FiscalYear, je.FiscalPeriod, je.Material

④ 라인 통합 — 기대액 · 전기액 · 세 요인

세 집계를 합치고 기대 매출원가, 전기 매출원가, 수량 · 단가 · 수기 조정 요인을 계산합니다. 화면의 차이 컬럼이 이 뷰에서 나옵니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출원가 대사 라인 (스케치)'
define view entity ZI_CogsReconLine
  as select from ZI_CogsReconSales as s
    left outer join ZI_CogsReconIssue  as i
      on  i.CompanyCode = s.CompanyCode and i.Gjahr = s.Gjahr
      and i.Period = s.Period           and i.MatCode = s.MatCode
    left outer join ZI_CogsReconManual as m
      on  m.CompanyCode = s.CompanyCode and m.Gjahr = s.Gjahr
      and m.Period = s.Period           and m.MatCode = s.MatCode
    left outer join I_ProductValuation as v
      on  v.Product = s.MatCode                           " 평가 단가 — 확인 필요
{
  key s.Gjahr, key s.Period, key s.MatCode,
      s.SalesQty,
      i.IssueQty,
      v.StandardPrice                                     as UnitCost,
      cast( i.IssueAmt / i.IssueQty as abap.dec(11,0) )   as PostUnit,
      cast( s.SalesQty * v.StandardPrice as abap.curr(15,0) )
                                                          as CalcCogs,
      cast( i.IssueAmt + coalesce( m.ManualAmt, 0 ) as abap.curr(15,0) )
                                                          as PostCogs,
      " 수량 요인 = (출고 − 판매) × 평가 단가
      cast( ( i.IssueQty - s.SalesQty ) * v.StandardPrice as abap.curr(15,0) )
                                                          as QtyEff,
      " 단가 요인 = 출고 × (전기 단가 − 평가 단가)
      cast( i.IssueAmt - i.IssueQty * v.StandardPrice as abap.curr(15,0) )
                                                          as PrcEff,
      coalesce( m.ManualAmt, 0 )                          as ManEff
}

⑤ 제품군 · 월 집계

라인 뷰를 제품군 · 월로 합산하고 점검 필요 자재 수를 셉니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출원가 대사 — 제품군·월 집계 (스케치)'
define view entity ZI_CogsReconGrp
  as select from ZI_CogsReconLine as l
    inner join   ZI_CogsReconMat  as g on g.MatCode = l.MatCode
{
  key l.Gjahr, key l.Period, key g.MatGrp,
      count( * )                                          as LineCnt,
      sum( l.CalcCogs )                                   as CalcCogs,
      sum( l.PostCogs )                                   as PostCogs,
      sum( l.QtyEff )                                     as QtyEff,
      sum( l.PrcEff )                                     as PrcEff,
      sum( l.ManEff )                                     as ManEff,
      sum( l.PostCogs ) - sum( l.CalcCogs )               as DiffAmt,
      sum( case when abs( l.DiffRate ) > 0.5 then 1 else 0 end )
                                                          as NeedCnt
}
group by l.Gjahr, l.Period, g.MatGrp

⑥ 계정 · 월 대조

원장의 매출원가 계정 월 전기액과 자재 라인에서 계정별로 합친 값을 견줍니다. 차이가 0 이 아니면 대사 R06 에 잡힙니다.

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '매출원가 대사 — 계정·월 대조 (스케치)'
define view entity ZI_CogsReconAcct
  as select from ZI_CogsReconGl    as gl            " 원장 매출원가 계정 월 전기액
    left outer join ZI_CogsReconAcctLine as al
      on  al.Gjahr = gl.Gjahr and al.Period = gl.Period
      and al.GlAcct = gl.GlAcct
{
  key gl.Gjahr, key gl.Period, key gl.GlAcct,
      gl.PostAmt,
      al.LineAmt,                                         " 자재 라인에서 계정별로 합친 값
      gl.PostAmt - al.LineAmt                             as DiffAmt,
      gl.DocCnt
}

⑦ 서비스 정의와 권한

다섯 뷰를 엔티티셋으로 노출하고 회사코드 권한을 겁니다. 서비스 이름은 화면이 부르는 cogsrecon_srv 와 맞춥니다.

@EndUserText.label: '매출원가 대사 점검 서비스'
define service ZUI_COGSRECON {
  expose ZI_CogsReconLine  as Line;
  expose ZI_CogsReconGrp   as Grp;
  expose ZI_CogsReconAcct  as Acct;
  expose ZI_CogsReconMonth as Month;
  expose ZI_CogsReconCheck as Recon;
}
" 서비스 바인딩은 OData V2 UI 로 만든다. 화면이 부르는 서비스 이름은 cogsrecon_srv 이다.

@MappingRole: true
define role ZI_COGSRECONLINE {
  grant select on ZI_CogsReconLine
    where ( CompanyCode ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}

운영 전환에서 정할 항목

항목내용
수기 조정 식별전용 계정 · 전표 유형 · 입력 경로 중 하나로 정합니다.
차이율 한도자재 · 제품군별 한도를 내부 통제 기준에 맞춥니다.
회계기간달력월이 아니면 기간 매핑 뷰를 둡니다.
권한회사코드와 플랜트 권한 객체를 DCL 로 적용합니다.

자주 묻는 질문

도입 상담과 데모에서 나올 만한 질문들입니다. 세 묶음으로 나눠 적었습니다.

숫자와 산식

기대 매출원가와 전기 매출원가는 각각 어떻게 계산합니까?

기대 매출원가는 판매 수량 × 평가 단가, 전기 매출원가는 출고 수량 × 전기 단가 + 수기 조정 합계입니다. 차이는 전기에서 기대를 뺀 값이고, 차이율은 차이를 기대 매출원가로 나눈 값입니다.

세 요인은 어떻게 나뉩니까? 합이 정말 총 차이와 같습니까?

수량 요인은 (출고 수량 − 판매 수량) × 평가 단가, 단가 요인은 출고 수량 × (전기 단가 − 평가 단가), 수기 조정 요인은 수기 조정 전표 금액입니다. 전개하면 세 항의 합이 정확히 총 차이가 되도록 골랐고, 대사 R01 이 60건 전수로 이를 검산해 차이 0 이 나왔습니다.

차이율 0.5% 한도는 어디서 나온 숫자입니까?

이 화면의 기본 점검 기준입니다. 자재는 0.5%, 제품군은 1.0% 로 두었습니다. 회사의 허용 한도와 다를 수 있으므로 도입할 때 내부 통제 기준에 맞춰 바꿔야 합니다.

한도 이내인 차이는 왜 정상으로 둡니까?

단가 반올림이나 평가 시점 차이 같은 경미한 차이는 거의 모든 자재에 있습니다. 센서 유닛 2월(0.13%), 씰 키트 1월(0.39%), 베어링 세트 5월(−0.32%)이 그런 예이고, 이를 모두 올리면 정작 봐야 할 건이 묻힙니다.

전체 차이가 작은데 왜 점검 필요가 여섯 건이나 됩니까?

차이가 서로 상쇄되기 때문입니다. 전체 차이는 +1.9백만원(0.10%)이지만 자재별로는 +3.87백만원과 −2.45백만원이 섞여 있습니다. 합계만 보는 리포트는 이 상쇄를 지나쳐 버립니다.

차이가 음수이면 전기가 덜 된 것입니까?

전기 매출원가가 기대보다 작다는 뜻입니다. 서보 드라이브 5월은 수기 조정 −2,450,000원이 들어가 −7.23% 가 되었습니다. 원인이 수량인지 단가인지 수기 조정인지는 요인 컬럼으로 구분합니다.

기간은 어떻게 정합니까?

회계기간은 이 샘플에서 달력월과 같다고 가정했습니다. 회사의 회계기간 변형이 다르면 기간 매핑을 따로 정의해야 하며, 이 부분은 도입 때 확인할 항목입니다.

화면과 조작

화면을 열면 바로 값이 나옵니까?

네. 화면을 처음 열 때 회계연도 2026 으로 한 번 자동 조회됩니다. 조회 조건을 바꾼 뒤에는 조회 버튼이나 입력 칸의 Enter 로 다시 조회합니다.

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

그 행의 값 전체와, 같은 조건의 자재 라인 목록이 상세 창에 열립니다. 제품군이나 월 행을 누르면 그 제품군·월에 속한 자재 라인이 나와 어느 자재가 차이를 만들었는지 바로 찾을 수 있습니다.

CSV 는 무엇을 내려받습니까?

현재 탭의 조회 결과를 UTF-8 CSV 로 내려받습니다. 조회조건이 걸려 있으면 그 조건에 맞는 행만 담깁니다.

표를 정렬하거나 필터링할 수 있습니까?

열 머리글의 메뉴에서 정렬할 수 있고, 정렬은 서비스에 $orderby 로 전달됩니다. 큰 표를 브라우저에서 다시 정렬하지 않고 서비스가 정렬한 결과를 받습니다.

휴대폰에서도 볼 수 있습니까?

표 열이 많아 데스크톱 화면을 기준으로 설계했습니다. 휴대폰 화면 대응은 이 사례의 범위에 넣지 않았습니다.

도입과 운영

도입하려면 무엇부터 해야 합니까?

순서는 이렇습니다. 먼저 판매 수량, 출고 수량, 원장 전기액의 출처를 정합니다(판매는 빌링 품목, 출고는 자재 문서, 전기액은 원장). 다음으로 수기 조정 전표를 가려내는 기준을 정하고, 차이율 한도를 회사 기준으로 바꿉니다. 마지막으로 CDS 로 집계를 내려 OData 서비스로 노출합니다.

수기 조정 전표는 어떻게 가려냅니까?

이 샘플은 수기 조정 전용 계정(510900)에 전기된 금액을 수기 조정으로 봤습니다. 실제 환경에서는 전표 유형, 입력 경로, 사용자 같은 기준을 회사가 정해야 하며 이 부분이 도입에서 가장 먼저 합의할 항목입니다.

표준 T-code 와 어떻게 다릅니까?

VF03 은 빌링 문서, MB51 은 출고 자재 문서, FAGLL03 은 원장 전표를 각각 보여 줍니다. 이 화면은 세 자료를 자재 · 월 단위로 한 줄에 놓고 차이를 요인으로 나눠 보여 주는 점이 다릅니다. 표준을 대체하지 않고 점검 진입점을 더합니다.

기존 리포트는 없애야 합니까?

없애지 않습니다. 법정 보고와 감사 대응은 표준 거래에 두는 편이 안전합니다. 이 화면은 마감 점검에서 어디를 열어 봐야 하는지 가리는 용도입니다.

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

화면과 서비스 계약은 그대로 쓸 수 있습니다. 다만 ECC 에는 ACDOCA 가 없어 매출원가 계정 전기액을 BSEG · BKPF 에서 만들어야 하고, CDS 뷰도 달라집니다.

권한은 어떻게 겁니까?

CDS 에 DCL 을 붙여 회사코드와 플랜트 권한을 표준 권한 객체로 따릅니다. 서비스는 권한이 걸린 CDS 만 읽으므로 화면에서 따로 권한을 만들지 않습니다.

실제 데이터에 연결하려면 무엇을 바꿉니까?

manifest 의 서비스 경로를 실제 OData 서비스로 바꾸고, 엔티티셋 5개(자재 라인, 제품군, 계정, 월, 대사)를 제공하면 됩니다. 화면은 서비스 이름과 엔티티 이름만 알면 되고, 샘플 데이터는 앱 본체가 읽지 않습니다.

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

아닙니다. 가상의 제조 회사 기준으로 자재 10종, 제품군 3개, 원가 계정 3개, 2026년 1~6월을 만든 값입니다. 실제 고객사의 판매·출고·원장 자료는 쓰지 않았습니다.

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

정기적으로 손이 가는 곳은 수기 조정 식별 기준과 차이율 한도 두 가지입니다. 새 계정이 생기면 매출원가 계정 목록에 더하는 작업이 필요합니다.

숫자가 기존 보고서와 다르면 어떻게 확인합니까?

조회 범위가 같은지 먼저 봅니다(회계연도, 기간, 회사코드). 그다음 판매 수량이 취소 전표를 뺀 값인지, 출고 수량이 반품을 반영했는지 확인합니다. 마지막으로 대사 R05 · R06 으로 원장과 자재 라인이 맞는지 봅니다.

점검 필요가 나오면 그다음에는 무엇을 합니까?

점검 코드가 가리키는 자리를 확인합니다. QTY 는 출고와 청구 시점, PRC 는 단가 갱신 시점, MAN 은 수기 조정 전표의 사유와 증빙, MIX 는 둘 이상을 함께 봅니다. 이 화면은 원인을 단정하지 않으며 최종 판단은 회사와 감사인이 합니다.