SAP 코스트센터 비용예산 통제 — 추경·대체·이월이 오가도 통제기간 잔여로 가용 예산을 지킨다
예산계정 · 원가요소 매핑 · 기초예산 · 추경·부서대체·계정대체·이월 · 통제기간 잔여를 한 화면에서 관리합니다
비용예산은 세우는 것보다 지키는 것이 어렵습니다. 연초에 부서별·계정별로 나눈 예산은 분기마다 추경과 부서 간 대체가 오가고, 다 쓰지 못한 예산은 다음 달로 넘어가며, 그 사이 실제 비용 전표는 원가요소 단위로 계속 쌓입니다. 이 흐름을 엑셀로 따라가면 "지금 이 부서가 이 계정에 얼마를 더 쓸 수 있는가"라는 가장 단순한 질문에 답하기가 어려워집니다.
이 화면은 예산계정 → 원가요소 매핑 → 기초예산 → 예산조정(추경·부서대체·계정대체·이월) → 집행 → 예산잔액의 흐름을 한 화면에 담았습니다. 핵심은 통제기간입니다. 예산계정마다 월·분기·연 중 하나를 정해 두면, 잔액과 가용 예산을 그 창(월이면 그 달, 분기면 같은 분기 3개월, 연이면 연간) 안에서 계산하고, 보내는 쪽 가용 예산을 넘는 대체·감액은 저장 단계에서 거절합니다.
| 항목 | 내용 |
|---|---|
| 업무 영역 | 관리회계(CO) — 코스트센터 비용예산 편성·조정·통제 |
| SAP 표준 T-code | KP06 · KS03 · KA03 · KSB1 · S_ALR_87013611 |
| Namespace | zui5.budgetctrl |
| 화면 성격 | 입력·조정·조회·점검 (생성·수정·삭제 포함) |
| 데이터 연동 | OData V2 — 엔티티셋 8종, 조회조건은 전부 $filter |
| 테마 | sap_horizon · 한국어 |
| 가상 데이터 | 가상 회사 1000 · 코스트센터 8개 · 예산계정 9개 · 2026년 1~12월 예산, 1~9월 실적 |
| 셸 구조 | 단일 페이지 + 6개 탭(대시보드·예산계정 관리·기초예산 입력·예산조정·예산잔액·대사 결과) |
| 화면 수 | 메인 1 · 편집·이월·상세 다이얼로그 3 |
| 요약 | 내용 |
|---|---|
| 대상 | 코스트센터 × 예산계정 × 회계기간 단위 비용예산 — 기초예산, 추경·부서대체·계정대체·이월, 원가요소 실적 |
| 핵심 산식 | 최종예산 = 기초 + 이월 + 조정 · 잔여 = 최종예산 − 집행 · 통제기간 잔여 = 창 안의 Σ최종예산 − Σ집행 |
| 결과 표시 | 정상 / 주의(통제기간 집행률 95% 이상) / 예산 초과(통제기간 잔여 음수) |
실제 화면 12종 둘러보기












사용 방법
- 조회조건 입력 — 회사코드와 회계연도(필수)를 넣고, 회계기간 범위를 고릅니다. 코스트센터·예산계정·통제 상태는 여러 개를 함께 고를 수 있고(전체 선택 지원), 비워 두면(전체) 그 조건은 보내지 않습니다.
- 조회 — 조회조건을 고르거나 바꾸면 바로 조회됩니다(여러 값 선택은 목록을 닫을 때, 입력 칸은 Enter 나 포커스 이동 때). 조회조건 줄 오른쪽 끝의 조회 · 초기화 버튼으로 다시 조회하거나 기본 조건으로 되돌립니다. 화면을 열면 2026년 1~12월로 한 번 자동 조회됩니다.
- 대시보드 확인 — 예산 현황 요약 표에서 기초예산·조정 순증감·최종예산·집행·잔여·집행률·예산 초과 건수를 보고, 통제 단위 점검 표의 행을 누르면 상세가 열립니다.
- 예산계정 관리 — 예산계정 / 예산계정 매핑 단추로 표를 바꾸고, 추가·수정·삭제로 관리합니다. 행을 고른 채 추가하면 그 행의 값을 복사해 시작합니다.
- 기초예산 입력 — 추가에서 회계연도기간(YYYY.MM)·코스트센터·예산계정·금액을 넣습니다. 금액 칸은 입력하는 대로 천 단위 구분 기호가 붙습니다.
- 예산조정 — 추경·부서대체·계정대체 단추를 고른 뒤 추가합니다. 추경 감액은 음수로 넣습니다. 이월은 예산잔액 탭에서 만듭니다.
- 예산잔액·이월 — 행을 고르고 이월을 누르거나, 행 끝 화살표로 상세를 열어 이월을 누릅니다. 받을 기간과 금액을 넣으면 두 줄이 한 그룹으로 만들어집니다.
- 대사 결과·CSV — 대사 결과 탭에서 정합성을 확인하고, 각 탭의 CSV 다운로드로 현재 조건의 전체 결과를 UTF-8 CSV 로 내려받습니다.
예산 통제 규칙
잔액과 상태는 서비스의 업무 규칙 파일 한 곳에서 계산하고, 저장 규칙도 같은 파일이 판단합니다. 검증 화면도 같은 파일을 그대로 씁니다.
| 규칙 | 판정·산식 | 비고 |
|---|---|---|
| 잔액 산식 | 최종예산 = 기초 + 이월 + 조정, 잔여 = 최종예산 − 집행, 집행률 = 집행 ÷ 최종예산 | 기간·코스트센터·예산계정 행마다 계산 |
| 통제기간 잔여 | 예산계정의 통제기간 창 안에서 Σ최종예산 − Σ집행 (월: 같은 달 / 분기: 같은 분기 3개월 / 연: 같은 연도 12개월) | 분기·연 통제 계정은 다른 달의 잔여로 이번 달 초과를 메울 수 있음 |
| 통제 상태 | 통제기간 잔여 < 0 → 예산 초과 · 통제기간 집행률 ≥ 95% → 주의 · 그 밖 → 정상 | 상태는 확인용 표시이며 원인 판단은 담당자가 함 |
| 가용 예산 점검 | 부서대체·계정대체·추경 감액을 넣었다고 보고 다시 계산한 보내는 쪽 통제기간 잔여가 음수면 저장 거절(400) | 수정 저장도 같은 점검 |
| 이월 | 보내는 행 잔여금액 > 0, 이월 금액 ≤ 잔여금액, 받는 기간 > 보내는 기간일 때만 생성. (−금액, +금액) 두 줄을 같은 이월 그룹 ID 로 저장 | 이월 행은 수정 불가(409), 한 줄 삭제 시 그룹 전체 삭제 |
| 예산계정 | 통제기간은 월·분기·연 중 하나. 매핑·기초예산·조정에서 쓰는 계정은 삭제 거절(409) | 계정 코드는 3~10자리 숫자 |
| 예산계정 매핑 | 원가요소 하나는 예산계정 하나에만 매핑(중복 409). 매핑 없는 원가요소의 실적은 잔액에 잡히지 않고 대사 결과 C01 로 표시 | 원가요소 코드는 4~10자리 숫자 |
| 기초예산 | 같은 기간·코스트센터·예산계정은 한 줄(중복 409). 금액 > 0. 수정은 금액·비고만 | 코스트센터·예산계정은 등록된 값만 |
편성에서 이월까지 처리 단계
- 예산계정 정의 — 예산을 통제할 계정과 통제기간(월·분기·연)을 정합니다.
- 원가요소 매핑 — 실적이 기록되는 원가요소를 예산계정에 묶습니다.
- 기초예산 편성 — 기간·코스트센터·예산계정 단위로 금액을 넣습니다.
- 예산조정 — 추경(증액·감액), 부서대체(같은 계정·다른 코스트센터), 계정대체(같은 코스트센터·다른 계정)를 넣습니다. 감액·대체는 보내는 쪽 가용 예산 점검을 거칩니다.
- 집행 집계 — 원가요소 단위 실적 전표를 매핑으로 예산계정에 올려 기간·코스트센터·예산계정별로 더합니다.
- 잔액 산출 — 최종예산·잔여·집행률과 통제기간 잔여·통제 상태를 계산합니다.
- 이월 — 잔여가 남은 행을 다음 기간으로 넘깁니다(두 줄 한 그룹).
- 대사 — R01~R06 대사식과 C01~C02 확인 항목으로 계산과 원천이 맞는지 봅니다.
조회조건
| 조건 | 필수 | 설명 | 전달 방식 |
|---|---|---|---|
| 회사코드 | 필수 | 4자리 (가상 1000) | Bukrs eq — 모든 엔티티셋 |
| 회계연도 | 필수 | 4자리 | Gjahr eq — 기초예산·조정·잔액·대사 |
| 회계기간 | 선택 | 01~12월 범위 (기본 1~12월) | (Period ge … and Period le …) 한 묶음 |
| 코스트센터 | 선택·여러 값 | 코스트센터 목록에서 여러 개 선택, 비우면 전체 | (Kostl eq … or Kostl eq …) 한 묶음 (조정은 보내는 쪽 KostlFr) |
| 예산계정 | 선택·여러 값 | 예산계정 목록에서 여러 개 선택, 비우면 전체 | (BudAcct eq … or …) 한 묶음 (조정은 BudAcctFr, 매핑에도 적용) |
| 통제 상태 | 선택·여러 값 | 예산 초과 · 주의 · 정상 중 여러 개 | (Status eq … or …) — 예산잔액 표에만 적용 |
결과 컬럼
| 영역 | 컬럼 |
|---|---|
| 대시보드 | 예산 현황 요약 표 — 예산계정 수(매핑 원가요소 수) · 기초예산 · 조정 순증감(추경 + 이월, 대체 금액 별도 표기) · 최종예산 · 집행금액 · 예산잔액 · 집행률 · 예산 초과(주의) 통제 단위 수 · 예산계정별/월별 최종예산 대비 집행 차트 · 통제 단위 점검 표(상태·코스트센터·예산계정·통제기간·통제기간 예산·집행·잔여·집행률) |
| 예산계정 | 회사코드 · 예산계정 · 예산계정명 · 통제기간 · 매핑 원가요소 수 · 변경일시 |
| 예산계정 매핑 | 회사코드 · 원가요소 · 원가요소명 · 예산계정(명) · 변경일시 |
| 기초예산 | 회사코드 · 회계연도기간 · 코스트센터(명) · 예산계정(명) · 예산금액 · 비고 · 변경일시 |
| 예산조정 | 이월 그룹 ID(이월) · 회사코드 · 회계연도기간 · 코스트센터(from) · 코스트센터(to)(부서대체) · 예산계정(from) · 예산계정(to)(계정대체) · 예산금액 · 비고 · 변경일시 |
| 예산잔액 | 회계연도기간 · 코스트센터 · 예산계정 · 기초금액 · 이월금액 · 조정금액 · 최종예산 · 집행금액 · 잔여금액 · 집행률 · 통제기간 · 통제기간 잔여 · 통제 상태 |
| 잔액 상세 | 예산 구성(구분·이월 그룹 ID·상대·금액·비고) · 집행 전표(전표번호·전기일·원가요소·적요·집행금액) |
| 대사 결과 | 번호 · 구분(대사/확인) · 대사 항목 · 대사식 · 좌변 · 우변 · 점검 건수 · 차이 건수 · 최대 차이 · 결과 |
SAP 표준 기능 매핑
| SAP 표준 T-code | 표준 기능 | 이 화면과의 관계 |
|---|---|---|
KP06 | 원가요소/활동투입 계획 변경 | 코스트센터·원가요소 단위 계획을 예산계정 단위 기초예산으로 묶어 입력·조정 |
KS03 | 코스트센터 조회 | 코스트센터 마스터 — 화면의 코스트센터 목록·이름 |
KA03 | 원가요소 조회 | 원가요소 마스터 — 예산계정 매핑의 원천 |
KSB1 | 코스트센터 실적 개별 항목 | 집행 전표 — 잔액 상세의 집행 전표 목록과 같은 단위 |
S_ALR_87013611 | 코스트센터 계획/실적 비교 | 계획 대비 실적 보고 — 이 화면은 여기에 조정 이력·통제기간 잔여·가용 예산 점검을 더함 |
표준 계획(KP06)과 계획/실적 비교(S_ALR_87013611)는 그대로 두고, 이 화면은 예산계정 단위 통제, 조정 이력(추경·대체·이월), 통제기간 잔여와 저장 시 가용 예산 점검을 더해 확장합니다.
참고 CDS 뷰
원천 테이블
| 테이블 | 용도 |
|---|---|
| ACDOCA | 유니버설 저널 — 코스트센터(RCNTR)·원가요소(RACCT)·기간(POPER)별 실적 금액(HSL) |
| CSKS · CSKT | 코스트센터 마스터·이름 |
| SKA1 · SKAT (원가요소 = G/L 계정) | 원가요소 마스터·이름 |
| 예산계정·매핑·예산 전표 (확인 필요) | 예산계정 마스터, 원가요소 매핑, 기초예산·조정 전표는 표준에 같은 구조가 없어 회사별 테이블로 둠 |
필드 매핑 (OData 엔티티·프로퍼티 → 원천)
| 엔티티.프로퍼티 | 원천 / 산출 |
|---|---|
| ActualSet.Kostl · Kstar · Period · Amount | ACDOCA.RCNTR · RACCT · POPER(앞에 연도) · HSL |
| ActualSet.Belnr · Buzei · Budat · Sgtxt | ACDOCA.BELNR · DOCLN · BUDAT · SGTXT |
| CostCenterSet.Kostl · KostlTxt | CSKS.KOSTL · CSKT.KTEXT |
| MappingSet.Kstar · KstarTxt · BudAcct | SKA1.SAKNR · SKAT.TXT20 · 매핑 테이블 (확인 필요) |
| AccountSet · InitialSet · AdjustSet | 예산계정 마스터 · 예산 전표 (확인 필요) |
| BalanceSet · ReconSet | 위 원천에서 요청 시점에 계산 (파생값) |
CDS 뷰 스케치 (참고용 — 매핑 테이블 이름은 예시)
@EndUserText.label: '코스트센터 예산계정별 집행 (스케치)'
define view entity BudgetActualCds
as select from acdoca as j
inner join zbud_map as m on m.bukrs = j.rbukrs and m.kstar = j.racct
{
key j.rbukrs as Bukrs,
key concat( j.gjahr, substring( j.poper, 2, 2 ) ) as Period,
key j.rcntr as Kostl,
key m.budacct as BudAcct,
sum( j.hsl ) as Executed,
count( * ) as DocCnt
}
where j.rldnr = '0L' and j.rcntr <> ''
group by j.rbukrs, j.gjahr, j.poper, j.rcntr, m.budacctOpenUI5 구성
| 구성 | 내용 |
|---|---|
| 서비스 선언 | manifest.json 의 dataSources.mainService 에 상대 경로(./odata/budgetctrl_srv/)로 OData V2 서비스를 선언합니다. 절대 URL 은 쓰지 않습니다. |
| 모델 | 이름 없는(기본) 모델이 mainService 를 씁니다. OneWay 바인딩, 건수 모드 Inline, 배치 미사용, 수정 메서드 PUT. 화면 상태·조회조건은 ui 모델, 편집·이월·상세 다이얼로그는 각자 JSON 모델을 씁니다. |
| 표 | 건수가 많은 예산계정·매핑·기초예산·조정·잔액은 sap.ui.table.Table(단일 선택, 100건 단위 추가 조회), 대시보드 점검 목록·대사 결과·상세는 sap.m.Table. |
| 필터·정렬 | 조회조건은 sap.ui.model.Filter 로 만들어 $filter 로 보냅니다. 기간 범위는 ge·le 를 한 묶음(and)으로, 여러 값을 고른 코스트센터·예산계정·통제 상태는 eq 를 한 묶음(or)으로 만들어 보냅니다. "전체"(빈 선택)는 필터를 만들지 않습니다. 조회조건을 바꾸면 짧게 모아 한 번만 바로 조회합니다. 열 머리글 정렬은 $orderby. |
| 쓰기 | 추가·수정·삭제·이월은 같은 모델의 create · update · remove 로 보냅니다. 업무 규칙(가용 예산·이월 쌍·중복·사용 중 계정)은 서비스가 판단하고, 화면은 서비스 메시지를 그대로 보여 준 뒤 표와 대시보드를 다시 읽습니다. |
| 차트 | 외부 차트 라이브러리 없이 컨트롤러에서 SVG 묶음 막대를 그려 core:HTML 로 넣습니다. 집행이 예산을 넘은 막대는 빨간색입니다. |
| 연결 실패 안내 | ErrorHandler 가 메타데이터 로드 실패와 조회 실패를 구분해 알리고, 쓰기 실패는 화면이 서비스 메시지로 안내합니다. |
파일 구성
| 구분 | 내용 |
|---|---|
| 앱 본체 | index.html · manifest.json · Component.js · controller · view(+ fragments 3종) · model · i18n · css |
| 데이터 서비스 | OData 서비스 정의(metadata) · 서비스 처리 · 업무 규칙 파일 · 엔티티셋별 데이터 |
| 검증 전용 | 앱 본체와 분리된 검증용 샘플 데이터 구성 — 업무 규칙은 서비스와 같은 파일을 그대로 사용 |
| 설명서 | readme.html (13개 절) |
검증 결과
검증용 샘플 데이터(예산계정 9 · 매핑 14 · 코스트센터 8 · 기초예산 384 · 조정 13 · 실적 482건)를 업무 규칙 파일과 별개로 python 으로 다시 계산해 전수 대조했습니다.
| 독립 대사식 | 검사 건수 | 차이 건수 | 최대 차이(원) |
|---|---|---|---|
| V1 잔액 행 구성 — 원천(기초·조정·실적)에서 나오는 기간·코스트센터·예산계정 키 = 잔액 행 키 | 384 | 0 | 0 |
| V2 기초·이월·조정·최종예산 재계산 (최종 = 기초 + 이월 + 조정) | 384 | 0 | 0 |
| V3 집행·잔여 재계산 (매핑된 원가요소 실적 합계, 잔여 = 최종 − 집행) | 384 | 0 | 0 |
| V4 통제기간 잔여·통제 상태 재계산 (월·분기·연 창) | 384 | 0 | 0 |
| V5 이월 그룹별 합계 = 0 | 2 | 0 | 0 |
| V6 부서대체·계정대체 순액 0 (Σ조정 = Σ추경) | 5 | 0 | 0 |
| V7 집행 원장 대사 (Σ집행 = Σ실적 − Σ매핑 없는 실적) | 482 | 0 | 0 |
화면 대조 — 2026년 1~12월·전체 조건에서 렌더링한 대시보드 요약 표 값(기초예산 5,046,000,000원, 최종예산 5,065,000,000원, 집행 3,395,802,000원, 잔여 1,669,198,000원, 집행률 67.0%, 예산 초과 2건·주의 1건)이 검증 스크립트 합계와 같았고, 대사 결과 탭의 R01~R06 차이 건수도 모두 0 이었습니다.
의도적 예외 — 통제 동작을 보이기 위해 일부러 넣은 건이며 위 대사 차이와 분리해 기록합니다.
| 구분 | 대상 | 내용 |
|---|---|---|
| 예산 초과 | 영업2팀 · 접대비 (분기 통제) 2026년 3분기 | 8월 거래처 행사 9,000,000원 집행 — 분기 잔여 −6,264,000원 (잔액 행 3개) |
| 예산 초과 | 마케팅팀 · 광고선전비 (연 통제) 2026년 | 9월 집중 집행 95,000,000원 — 연 잔여 −7,438,000원 (잔액 행 12개) |
| 주의 | 경영지원팀 · 지급수수료 (분기 통제) 2026년 3분기 | 분기 집행률 97.0% (잔액 행 3개) |
| 매핑 없는 실적 | 원가요소 60090020 법률자문 2건 | 4,000,000원 — 잔액에 잡히지 않고 대사 C01 로 표시 |
저장 규칙 실측 — 검증 화면과 운영 서비스 양쪽에서 확인했습니다.
| 시나리오 | 결과 |
|---|---|
| 부서대체 — 보내는 쪽 통제기간 잔여 초과 | 400 거절 · "가용 예산이 부족합니다 … 잔여 -6,264,000원, 요청 500,000원" |
| 부서대체 — 가용 범위 안 (영업1팀 → 영업2팀 여비교통비 300,000원) | 201 생성 · 부서대체 3건 → 4건 |
| 이월 생성 (인사팀 소모품비 2026.05 잔여 199,000원 → 2026.06) | 201 · 같은 그룹 두 줄 (−199,000 / +199,000) |
| 이월 행 수정 | 409 거절 · 삭제 후 다시 이월 안내 |
| 이월 한 줄 삭제 | 204 · 같은 그룹 2줄 함께 삭제, R05 차이 0 유지 |
| 사용 중 예산계정 삭제 (60010 급여) | 409 거절 · 매핑·기초예산·조정 98건 사용 중 |
| 기초예산 중복 등록 (같은 기간·코스트센터·예산계정) | 409 거절 · 해당 행 수정 안내 |
| 예산계정 생성·수정(PUT·MERGE)·삭제 (미사용 계정) | 201 · 200 · 200 · 204 |
그 밖에 조회·초기화 버튼이 이 순서로 조회조건 영역 오른쪽 끝에 렌더링되는 것, 코스트센터 2개(영업1팀·영업2팀)를 고르면 바로 잔액 96행으로 좁혀지고 통제 상태 예산 초과·주의를 함께 고르면 3행이 남는 것, 적용 테마가 sap_horizon 인 것, 입력 칸 Enter 로 조회되는 것, 기간 범위 7~9월 조회 시 잔액 96행만 남는 것, CSV 가 UTF-8 BOM 으로 내려받아지는 것을 렌더링 상태에서 확인했습니다.
자주 묻는 질문
통제기간을 월·분기·연으로 나누는 이유는 무엇인가요?
계정마다 지출 성격이 다르기 때문입니다. 급여·통신비처럼 매달 고르게 나가는 비용은 월 단위로, 출장비·접대비처럼 달마다 몰리는 비용은 분기 단위로, 광고선전비·교육훈련비처럼 시기를 정해 집행하는 비용은 연 단위로 보는 것이 현실적입니다. 분기·연 통제 계정은 같은 창 안의 다른 달 잔여로 이번 달 초과를 메울 수 있고, 창 전체가 음수가 되어야 예산 초과로 표시됩니다.
매핑이 없는 원가요소의 실적은 어떻게 되나요?
잔액의 집행에 잡히지 않습니다. 대신 대사 결과 C01 "매핑 없는 원가요소 실적"에 건수와 금액이 나오므로, 예산계정 매핑을 추가하면 다음 조회부터 해당 예산계정의 집행으로 들어갑니다. 샘플에는 이 경우 2건(4,000,000원)을 일부러 넣었습니다.
이월은 왜 두 줄로 만들어지나요?
보내는 기간의 최종예산에서 빼고(−) 받는 기간의 최종예산에 더하는(+) 두 효과를 모두 남겨야, 기간별 잔액과 연간 합계가 동시에 맞기 때문입니다. 두 줄은 같은 이월 그룹 ID 로 묶이며, 대사 R05 가 그룹별 합계 0 을 확인합니다.
"예산 초과"가 나오면 회계처리가 잘못된 건가요?
그렇게 단정하지 않습니다. 통제기간 안에서 집행이 예산보다 많다는 계산 결과이며, 추경이나 대체가 늦게 들어왔는지, 원가요소 매핑이 맞는지, 전표의 코스트센터가 맞는지 같은 원인 후보를 확인하는 출발점입니다. 최종 판단은 담당 부서가 합니다.
실제 회사 데이터로 쓰려면 무엇이 필요한가요?
같은 형식의 OData 서비스를 연결하면 됩니다. 화면의 회사·코스트센터·금액은 모두 가상의 검증용 샘플 데이터입니다. 실적은 ACDOCA 에서 읽을 수 있지만, 예산계정·매핑·예산 전표를 어느 테이블에 둘지와 엑셀 일괄 업로드 방식은 회사마다 달라 확인 필요 항목으로 남겼습니다.
예산은 세우는 것보다 지키는 것이 어렵습니다
추경과 대체, 이월이 엑셀로 흩어지면 "지금 얼마를 더 쓸 수 있는가"에 바로 답하기 어렵습니다. 통제기간 잔여와 저장 시 가용 예산 점검으로 초과 집행을 미리 막아 두세요.