SAP 내부거래 상계 점검 — 회사 간 거래가 상계 전 서로 맞물려 있는가
제거분개를 넣기 전에, 그룹 내 두 회사가 서로 기록한 거래금액이 맞물리는지부터 대사합니다
연결 결산을 준비할 때 가장 먼저 막히는 지점은 내부거래 금액 불일치입니다. 한 회사가 관계사에 100을 팔았다고 기록해도, 상대 회사가 90을 샀다고 기록해 두면 그 차이부터 찾아야 제거분개를 넣을 수 있습니다. 관련 국제회계기준의 특정 문단을 꼽기보다는, 연결 결산이라는 대상 영역 안에서 "회사 간 거래가 상계 전에 서로 맞물려 있는가"를 먼저 확인하는 절차입니다.
표준 회계전표 구조를 그대로 이어받아 회사코드·거래처(Trading Partner)·거래유형·회계기간별로 양쪽 회사가 각각 기표한 금액을 나란히 모으고, 일치하는 금액만큼만 제거분개 대상을 산출하는 화면을 OpenUI5로 확장했습니다. 실제 구동 화면 4종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 원장 라인 — 회계전표 라인아이템의 거래처(Trading Partner) 필드가 설정된 라인을 그대로 사용
- 계정·회사 마스터 — 표준 계정 마스터·회사코드 마스터 구조를 그대로 사용
- 표준 화면 — 총계정원장 라인아이템 조회(FBL3N) · 신 총계정원장 라인아이템 조회(FAGLL03) · 계정 잔액 조회(FS10N)
| 항목 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 연결 결산 |
| 관련 대상 영역 | - (연결 결산 · 내부거래 상계) |
| Namespace | zui5.icelim |
| 셸 구조 | 조회조건 영역(우측 조회) + 대사 요약 + 거래 명세·거래쌍 대사·제거분개 미리보기 3개 탭, 상세 Dialog |
| 화면 수 | 조회 화면 1개 + 상세 다이얼로그 |
| SAP 표준 T-code | FBL3N · FAGLL03 · FS10N(§7 참고) |
| 데이터 연동 방식 | OData V2 — 화면 블록마다 엔티티셋에 직접 바인딩 |
| 성격 | 조회·대사·점검형 — 제거분개 기표는 화면 밖 프로세스 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 4종 둘러보기
조회조건을 넣고 조회하면 대사 요약과 거래 명세가 뜹니다 → 거래쌍 대사 탭에서 회사측·상대회사측 금액을 나란히 보고 → 제거분개 미리보기 탭에서 산출된 제거 대상을 확인하고 → 행을 클릭해 상세 내역을 봅니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드·상대회사·회계연도·기간·거래유형을 지정합니다. 비워 두면 해당 조건은 전체로 조회됩니다.
- 조회조건 입력 필드에서 Enter 키를 누르거나 조회조건 영역 오른쪽 끝의 조회 버튼을 누르면 재조회됩니다. 초기화 버튼은 조건을 기본값으로 되돌립니다.
- 상단 대사 요약에서 거래 라인 건수·대사 대상 쌍·회사측/상대회사측 금액 합계·매칭/차이 건수를 먼저 확인합니다.
- 거래 명세 → 거래쌍 대사 → 제거분개 미리보기 순으로 탭을 옮기며 원장 라인부터 대사, 제거분개 산출까지 단계별로 봅니다.
- 행을 클릭하면 상세 다이얼로그가 열립니다.
- 거래 명세 탭에서 CSV 내려받기(UTF-8 BOM)로 결과를 저장할 수 있습니다.
대사·판정 로직
거래쌍(회사-상대회사-거래유형-기간) 단위로 회사측 금액과 상대회사측 금액을 비교해 상태를 가릅니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 회사측 금액 = 상대회사측 금액(차이 0) | 대사 일치 | 제거분개 반영 대상으로 두고 다음 결산 주기로 진행 |
| 회사측 금액 ≠ 상대회사측 금액(차이 발생) | 차이 발생 — 점검 필요 | 상대회사 전표·기표시점을 확인한 뒤 제거분개를 조정 |
| 거래 라인이 매칭 쌍에 속함 | 매칭완료 | 추가 조치 없음 |
| 거래 라인이 차이 발생 쌍에 속함 | 부분매칭 — 점검 필요 | 상대편 기표 누락·시점 차이 여부를 확인 |
이 화면이 대신 정하지 않는 것
판정 결과는 확인이 필요한 거래쌍을 알리는 표시이며, 차이의 원인을 단정하지 않습니다. 시점 차이인지 실제 금액 차이인지는 상대편 전표를 직접 확인해야 하며, 최종 회계처리 판단은 회사와 감사인이 합니다.
대사·제거 처리 단계
| 단계 | 내용 |
|---|---|
| 1단계 | 내부거래 원장 라인을 회사·상대회사·회계연도·기간·거래유형별로 집계해 거래쌍 대사 금액을 산출 |
| 2단계 | 회사측 금액 − 상대회사측 금액 = 차이를 계산 — 차이 0 → 대사 일치, 차이 ≠ 0 → 점검 필요 |
| 3단계 | 대사가 일치한 금액(양측 중 작은 값)만큼 제거분개 차변·대변 계정과 금액을 산출 — 차이가 있는 쌍은 매칭되는 부분까지만 반영 |
| 4단계 | 회계연도·기간별로 거래 건수·대사 쌍 수·매칭/미매칭 건수·제거 대상 합계·총 차이를 모아 요약 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 회사코드 | 선택 | 비우면 전체 회사코드 |
| 상대회사 | 선택 | 비우면 전체 상대회사 |
| 회계연도 | 선택 | 비우면 전체 회계연도 |
| 기간 | 선택 | 비우면 전체 기간 |
| 거래유형 | 선택 | 전체 / 상품 매출입 / 용역·수수료 / 자금대여·이자 |
결과 컬럼
| 영역 | 컬럼 · 표시 |
|---|---|
| 거래 명세 | 전표ID · 회사 · 상대회사 · 회계연도/기간 · 전표번호 · 계정 · 거래유형 · 금액 · 상대전표번호 · 매칭상태 |
| 거래쌍 대사 | 회사 · 상대회사 · 거래유형 · 회사측 금액 · 상대회사측 금액 · 차이 · 대사상태(소계 행 포함) |
| 제거분개 미리보기 | 회사 · 상대회사 · 거래유형 · 제거분개 차변 · 제거분개 대변 · 제거 금액 · 처리상태 |
SAP 표준 기능 매핑
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 그 원장 데이터에 회사 간 대사 관점을 더해 확장합니다.
| 표준 T-code | 표준 기능 | 이 화면이 더한 것 |
|---|---|---|
FBL3N | 총계정원장 라인아이템 조회 | 거래처(Trading Partner) 필드가 설정된 라인을 상대회사쌍 단위로 모읍니다 |
FAGLL03 | 신 총계정원장 라인아이템 조회 | 회사코드·계정별 라인아이템을 거래쌍 대사로 재구성합니다 |
FS10N | 계정 잔액 조회 | 계정별 잔액을 거래쌍 소계와 대사합니다 |
분석 지표 정의표
| 관련 대상 영역 | 요구사항 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| - | 회사 간 거래 잔액이 상계 전 서로 일치하는지 확인 | 거래쌍 대사(#sec-cycle 2단계) | 회사코드·상대회사별 원장 라인 | 대상 영역: 연결 결산 |
| - | 대사가 일치한 금액만큼 제거분개 대상을 산출 | 제거 대상 산출(#sec-cycle 3단계) | 거래쌍 대사 결과 | 차이가 있는 쌍은 매칭 금액까지만 반영 |
참고 CDS 뷰
| 원천 테이블 | 주요 필드 | 쓰임 |
|---|---|---|
BKPF | BUKRS · BELNR · GJAHR · BUDAT | 전표 헤더 |
BSEG | BUKRS · VBUND · HKONT · DMBTR · BUZEI | 전표 라인아이템·거래처(Trading Partner) |
SKA1 / SKB1 | SAKNR · TXT50 | 계정 마스터 |
T001 | BUKRS · BUTXT | 회사코드 마스터 |
운영 서비스로 연결할 때를 가정해 새로 스케치한 집계 뷰 예시입니다.
define view entity ZI_ICELIM_TXN
as select from bseg
association [1..1] to bkpf as _Header on _Header.bukrs = bseg.bukrs
and _Header.belnr = bseg.belnr
and _Header.gjahr = bseg.gjahr
{
key bseg.bukrs as CompanyCode,
key bseg.vbund as TradingPartner,
key bseg.gjahr as FiscalYear,
key bseg.buzei as DocItem,
_Header.belnr as DocNo,
_Header.budat as PostDate,
bseg.hkont as GlAccount,
bseg.dmbtr as Amount
}
where bseg.vbund <> '' -- 거래처(Trading Partner) 지정 라인만
거래쌍 대사·제거분개 미리보기는 이 라인 집계를 회사·상대회사·기간·거래유형별로 다시 묶어 산출합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 · 구성 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 패널 · 대사 요약 패널 · sap.m.IconTabBar 3개 탭 |
| 데이터 연동 | manifest.json dataSources.mainService(OData V2, 상대 경로) — 화면 블록마다 엔티티셋에 직접 바인딩. 모델 설정은 useBatch:false · defaultBindingMode:"OneWay" · defaultCountMode:"Inline" |
| 조회조건 | sap.m.Input · sap.m.ComboBox — 우측 끝에 조회·초기화 버튼, Enter 키로 즉시 재조회, sap/ui/model/Filter로 조회조건을 조립. "전체"를 고른 조건은 필터를 만들지 않습니다 |
| 명세 표 | sap.ui.table.Table(컬럼 10개 이상) — 행 클릭 시 상세 다이얼로그 |
| 대사·제거분개 표 | sap.m.Table — sap.m.ObjectStatus로 대사상태를 표준 ValueState 로만 표시 |
| 공통 처리 | CSV 다운로드 공통 컨트롤러(UTF-8 BOM), 전역 오류 처리기 — 메타데이터 로드 실패·요청 실패·빈 응답을 구분해 안내 |
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon · lodash · moment, OData 서비스에 연결 |
Component.js | 화면 상태·조회조건 모델 초기화, 전역 오류 처리기 연결 |
manifest.json | 앱 디스크립터 — zui5.icelim · ko 로케일, OData 서비스와 모델 선언 |
view/Main.view.xml | 조회조건 · 대사 요약 · 3개 탭 |
view/DetailDialog.fragment.xml | 상세 내역 다이얼로그 |
controller/Main.controller.js | 조회조건 조립 · 바인딩 · 다이얼로그 · CSV 다운로드 |
controller/BaseController.js | CSV 다운로드 공통 처리 |
model/ErrorHandler.js | 전역 오류 처리 |
model/formatter.js | 금액·상태 표시 서식 |
i18n/i18n_ko.properties | ko 로케일 리소스 |
운영 데이터는 OData 서비스가 제공하며, 검증에 쓴 샘플 데이터는 화면과 완전히 분리해 별도로 둡니다. 화면과 판정 로직은 그대로 씁니다.
검증 결과
화면 구성에 쓴 검증용 샘플 데이터는 120건의 내부거래 라인, 24개 거래쌍(소계 4행 별도)을 기준으로 구성했습니다.
| 검증 항목 | 결과 |
|---|---|
| 완전성 대사 — 거래 라인 집계 = 거래쌍 대사 금액 | 통과(차이 0) |
| 거래쌍 대사식 — 차이 = 회사측 금액 − 상대회사측 금액 | 통과(차이 0) |
| 제거 대상 합계 — 제거분개 금액 합계 = 대사 일치 거래쌍의 금액 합계 | 통과(차이 0) |
| 소계 행 — 회사·기간별 소계 = 해당 거래쌍 합계 | 통과(차이 0) |
| 전체 요약(IcCheckSet) — 건수·금액 합계 재계산 대사 | 통과(차이 0) |
| 의도적 예외(타이밍 차이 재현 표본) | 2건 — 최대 차이 150,000(의도적 예외 제외 시 차이 0건) |
| 표시 금지 검사 — 커스텀 프로그램ID·앱 식별자·출처 표현 검출 | 0건 |
| 화면 렌더링 — 실브라우저에서 조회 → 탭 이동 → 행 클릭 상세까지 실동작 후 캡처 | 4/4 |
조회 버튼 위치 · sap_horizon 테마 · Enter 키 조회 · 서비스 미연결 시 오류 안내 | 확인 |
| OData 계약 — 동사 경로 미사용, $filter·$orderby·$top 으로 조회조건·정렬·건수 전달 | 확인 |
회사·거래·금액은 모두 검증용으로 구성한 가상 데이터입니다.
자주 묻는 질문
이 화면은 어느 범위에 적용하나요?
그룹 내 회사 간 상품 매출입·용역·수수료·자금대여·이자 거래를 회계연도·기간별로 다룹니다. 특정 공시 기준서의 시행일이 정해진 화면이 아니라, 연결 결산을 준비하는 매 결산기마다 내부거래 잔액을 미리 대사해 두는 점검 도구입니다.
대사상태가 "차이 발생 — 점검 필요"로 뜨면 무엇을 의미하나요?
같은 거래쌍(회사-상대회사-거래유형-기간)에서 회사측이 기표한 금액과 상대회사측이 기표한 금액이 다르다는 뜻입니다. 이 화면은 확인이 필요한 거래쌍을 가려내는 점검 도구이며, 실제 원인 파악과 제거분개 반영 여부의 최종 판단은 회사와 감사인이 합니다.
금액이 다르면 항상 오류인가요?
아닙니다. 한쪽 회사는 이번 기간에 기표했는데 상대 회사는 다음 기간에 기표하는 시점 차이로도 차이가 날 수 있습니다. 그래서 화면은 차이를 곧바로 오류로 단정하지 않고 "점검 필요"로만 표시하며, 상대편 기표 시점을 확인하도록 안내합니다.
왜 매출·매입 집계가 아니라 상대회사 장부를 직접 비교하나요?
제거분개는 두 회사가 각각 기록한 금액이 서로 맞아야 정확한 금액으로 반영할 수 있습니다. 그래서 이 화면은 회사측 원장 금액과 상대회사측 원장 금액을 각각 집계해 나란히 비교하고, 일치하는 금액만큼만 제거 대상으로 산출합니다.