SAP 자기주식 거래 회계처리 점검 — IAS 32, 내 주식을 사고판 차익은 이익이 아니다
자기주식 취득·처분·소각을 이동평균으로 다시 따라가며 거래원가와 처분손익이 자본에서 처리됐는지 원장 데이터로 먼저 확인해 둡니다
회사가 자기 회사 주식을 사들이면 그 주식은 자산이 아니라 자본에서 빼는 항목이 됩니다. IAS 32 금융상품: 표시(K-IFRS 제1032호)는 자기주식을 사고팔거나 소각해도 당기손익을 인식하지 않도록 합니다. 산 값보다 비싸게 팔아 생긴 차익도, 싸게 팔아 생긴 손실도 자본 안에서 처리하고, 취득할 때 낸 수수료 같은 거래원가도 비용이 아니라 자기주식 원가에 넣습니다.
실무에서는 매매 수수료가 습관처럼 수수료비용 계정으로 가거나, 처분 차익이 영업외수익으로 잡히거나, 여러 번 나눠 산 주식을 팔면서 가장 최근 단가로 원가를 잡는 일이 생깁니다. 원장 데이터를 그대로 이어받아 거래를 시간 순서로 따라가며 이동평균 원가와 처분손익을 다시 계산해 장부와 나란히 놓는 과정을 OpenUI5 화면으로 확장했습니다. 실제 구동 화면 6종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 원장 — 자기주식·처분손익·수수료 계정 전표(
ACDOCA)를 그대로 사용 - 재무 거래 — 매매 계약(
VTBFHA)의 주식수·단가를 거래 근거로 사용 - 표준 화면 — G/L 잔액(FS10N) · G/L 개별항목(FAGLL03) · 전표 조회(FB03) · 재무 거래 관리(FTR_00)
| 항목 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 자본 |
| 관련 기준서 | IAS 32 금융상품: 표시(K-IFRS 제1032호) — 자기지분상품(자기주식)을 재취득하면 자본에서 차감하고, 자기지분상품의 매입·매도·발행·소각과 관련해 당기손익을 인식하지 않으며, 자본거래의 거래원가는 자본에서 차감 |
| Namespace | zui5.treasury |
| 셸 구조 | 조회조건 영역(우측 조회) + 자기주식 거래 대사 요약 + 자기주식 거래 명세·거래 유형별·분기별·거래 경로별·점검 예외 5개 탭, 상세 Dialog |
| 화면 수 | 조회 화면 1개 + 상세 다이얼로그 |
| SAP 표준 T-code | FS10N · FAGLL03 · FB03 · FTR_00 · F.01(§7 참고) |
| 데이터 연동 방식 | OData V2 — 화면 블록마다 엔티티셋에 직접 바인딩 |
| 성격 | 조회·대사·점검형 — 계정 재분류 전표 기표는 화면 밖 프로세스 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 6종 둘러보기
회사코드·회계연도를 넣고 조회하면 자기주식 거래 대사 요약과 명세가 한 화면에 뜹니다 → 탭을 옮겨 거래 유형별·분기별·거래 경로별 집계를 보고 → 점검 예외에서 확인이 필요한 건만 추려 봅니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
사용 방법
- 회사코드와 회계연도를 넣습니다. 거래 유형·거래 경로·판정 상태는 비워 두면 전체가 조회됩니다.
- 조회 버튼은 조회조건 입력 필드 줄의 가장 오른쪽에 있습니다. 입력 필드에서 Enter 키를 눌러도 같은 조회가 실행됩니다.
- 자기주식 거래 대사 요약에서 기말 보유 주식수·잔액과 기준·장부 처분손익, 장부 당기손익 인식액, 차이 합계를 먼저 확인합니다.
- 탭을 옮겨 가며 자기주식 거래 명세 → 거래 유형별 → 분기별 → 거래 경로별 → 점검 예외 순으로 좁혀 봅니다.
- 행을 누르면 거래일 시가·직전 평균단가·순처분대가와 거래 후 잔고가 상세 다이얼로그로 열립니다.
- 자기주식 거래 명세와 점검 예외 탭에서는 CSV 내려받기(UTF-8 BOM)로 결과를 저장할 수 있습니다.
자본거래는 손익이 아니다 — 유형별 처리 규칙
자기주식 거래는 주주와의 자본거래입니다. 원가는 자본에서 빼고, 사고팔아 생긴 차이는 손익계산서가 아니라 자본에서 처리합니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 취득 | 원가 = 대가 + 거래원가 | 수수료까지 자기주식 원가에 넣어 자본에서 차감합니다. |
| 처분 | 처분손익 → 자본 | 평균단가로 처분원가를 잡고, 순처분대가와의 차이를 자본에서 처리합니다. |
| 소각 | 손익 없음 | 평균단가로 원가를 줄이고 자본 계정끼리 정리합니다. |
| 취득 거래원가를 비용 처리 | 점검 필요 | 수수료를 자기주식 원가로 옮깁니다. |
| 처분이익을 당기손익으로 인식 | 점검 필요 | 영업외수익을 자기주식처분이익으로 옮깁니다. |
| 처분손실을 당기손익으로 인식 | 점검 필요 | 영업외비용을 자본으로 옮깁니다. |
| 처분원가를 최근 취득단가로 계산 | 점검 필요 | 평균단가로 다시 계산합니다. |
| 처분가가 시가의 90% 미만 | 확인 필요 | 주식기준보상·특수관계자 거래 해당 여부를 확인합니다. |
이 화면이 대신 정하지 않는 것
판정 결과는 확인 대상을 알리는 표시이며, 기준서 충족 여부를 단정하지 않습니다. 처분손익을 자본 안의 어느 계정에 두고 이익·손실을 어떤 순서로 상계할지는 회사 정책과 관련 법령에 따릅니다. 이 화면은 이동평균법을 기준으로 계산하며, 90% 기준은 확인 대상을 고르는 참고값입니다. 최종 판단은 기준서 원문에 따라 회사와 감사인이 합니다.
자기주식 거래에서 자본 대사까지 5단계 산출
| 단계 | 내용 |
|---|---|
| 1단계 | 거래를 시간 순서로 늘어놓는다 — 취득 / 처분 / 소각, 월 순서 |
| 2단계 | 취득원가를 구한다 — 취득원가 = 주식수 × 거래단가 + 거래원가 |
| 3단계 | 평균단가로 처분원가를 구한다 — 처분원가 = 주식수 × (직전 잔액 ÷ 직전 보유 주식수) |
| 4단계 | 처분손익을 구한다 — 처분손익(자본) = (주식수 × 처분단가 − 거래원가) − 처분원가 |
| 5단계 | 장부와 대사한다 — 원가 차이 = 장부 − 기준, 당기손익 인식액은 0 이어야 함 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 회사코드 | 필수 | 대사 요약 단건 조회의 키로도 씁니다. |
| 회계연도 | 필수 | 대사 요약 단건 조회의 키로도 씁니다. |
| 거래 유형 | 선택 | 전체 / 취득 / 처분 / 소각 |
| 거래 경로 | 선택 | M 장내 시장 · O 장외 거래 · E 임직원 지급 · N 해당 없음(소각 거래) |
| 판정 상태 | 선택 | 전체 / 정상 / 점검 필요 / 확인 필요 |
결과 컬럼
| 영역 | 컬럼 · 표시 |
|---|---|
| 자기주식 거래 대사 요약 | 거래 건수 · 기말 보유 주식수 · 기말 잔액 · 기준/장부 처분손익 · 장부 당기손익 · 차이 합계 · 예외 건수 |
| 자기주식 거래 명세 | 거래번호 · 월 · 거래 유형 · 거래 경로 · 주식수 · 거래단가 · 거래원가 · 기준/장부 원가 · 기준/장부 처분손익 · 장부 당기손익 · 판정 |
| 거래 유형별 · 분기별 · 거래 경로별 집계 | 구분 · 건수 · 주식수 · 기준/장부 원가 · 기준/장부 처분손익 · 장부 당기손익 |
| 점검 예외 | 예외번호 · 거래번호 · 예외 유형 · 내용 · 차이 · 중요도 |
SAP 표준 기능 매핑
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 그 데이터에 자기주식 거래 관점의 조회·검증을 더해 확장합니다.
| 표준 T-code | 표준 기능 | 이 화면이 더한 것 |
|---|---|---|
FS10N | G/L 계정 잔액 조회 | 자기주식·자기주식처분손익 계정 잔액을 기준과 대사합니다 |
FAGLL03 | G/L 개별항목 조회 | 수수료비용·영업외손익 계정에 자기주식 거래가 섞였는지 건별로 확인합니다 |
FB03 | 전표 조회 | 취득·처분·소각 전표의 계정 조합을 확인합니다 |
FTR_00 | 재무 거래 관리 | 자기주식 매매 거래와 수수료를 확인합니다 |
F.01 | 재무제표 조회 | 자본변동 표시와 당기손익 영향을 확인합니다 |
IFRS 요구사항 매핑표
| 기준서 | 요구사항 | 이 화면의 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| IAS 32 (K-IFRS 제1032호) | 재취득한 자기지분상품은 자본에서 차감 | 취득원가 산출과 기말 잔액 대사 | ACDOCA | 자기주식 계정은 자본 차감 계정입니다. |
| IAS 32 (K-IFRS 제1032호) | 자기지분상품의 매입·매도·발행·소각과 관련해 당기손익을 인식하지 않음 | 처분손익 당기손익 인식 검출 | ACDOCA · BKPF | 처분손익 계정 분류는 회사 정책입니다. |
| IAS 32 (K-IFRS 제1032호) | 자본거래의 거래원가는 자본에서 차감 | 취득 거래원가 비용 처리 검출 | ACDOCA | 직접 관련된 증분원가만 해당합니다. |
| IAS 32 (K-IFRS 제1032호) | 처분 대가와 장부금액의 차이는 자본으로 인식 | 평균단가 처분원가 재계산과 최근 단가 적용 검출 | ACDOCA · BSEG | 원가흐름 가정은 회사 정책으로 일관되게 적용합니다. |
참고 CDS 뷰
| 원천 테이블 | 주요 필드 | 쓰임 |
|---|---|---|
ACDOCA | RBUKRS · GJAHR · RACCT · HSL · BELNR | 자기주식·처분손익·수수료 전표 |
BKPF | BELNR · BLDAT · BLART · XBLNR | 거래 전표 헤더 |
BSEG | BELNR · MENGE · SGTXT | 거래 주식수·적요 |
VTBFHA | RFHA · SGSART · BZBETR | 재무 거래(매매 계약) |
SKA1 | SAKNR · KTOKS | 자본 계정 분류 |
define view entity ZC_TreasuryShareTx
as select from ZI_EquityTransaction as tx
left outer join ZI_TreasuryGLPosting as gl on gl.AccountingDocument = tx.AccountingDocument
{
key tx.TransactionId as TxId,
tx.TransactionType as TxType,
tx.Quantity as Shares,
tx.UnitPrice as UnitPrice,
gl.TreasuryShareAmount as BookCostAmt,
gl.ProfitLossAmount as BookPl
}
표준 CDS 뷰 이름과 필드는 시스템 릴리스에 따라 다를 수 있으므로, 도입 시 실제 시스템에서 확인해 확정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 · 구성 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 패널 · 대사 요약 패널 · sap.m.IconTabBar 5개 탭 |
| 데이터 연동 | 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/model/Sorter와 모델의 페이징 기능으로 처리 — 전체를 받아 화면에서 걸러내지 않습니다 |
| 명세·예외 표 | sap.ui.table.Table — 행 클릭 시 상세 다이얼로그 |
| 집계 표 | sap.m.Table — sap.m.ObjectStatus로 판정 상태를 표준 ValueState 로만 표시 |
| 공통 처리 | CSV 다운로드 공통 컨트롤러(UTF-8 BOM), 전역 오류 처리기 — 메타데이터 로드 실패·요청 실패·빈 응답을 구분해 안내 |
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon · lodash · moment, OData 서비스에 연결 |
Component.js | 화면 상태·조회조건 모델 초기화, 전역 오류 처리기 연결 |
manifest.json | 앱 디스크립터 — zui5.treasury · ko 로케일, OData 서비스와 모델 선언 |
view/Main.view.xml | 조회조건 · 대사 요약 · 5개 탭 |
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 서비스가 제공하며, 검증용 샘플 데이터는 화면과 완전히 분리해 별도로 둡니다. 화면과 판정 로직은 그대로 씁니다.
검증 결과
화면 구성에 쓴 검증용 샘플 데이터는 거래 12건을 시간 순서대로 따라가며 이동평균 원가와 거래 후 잔고가 원(KRW) 단위로 이어지도록 구성했습니다.
| 검증 항목 | 결과 |
|---|---|
| 취득원가 = 주식수 × 거래단가 + 거래원가 | 통과(차이 0) |
| 처분·소각 원가 = 주식수 × 직전 보유분 평균단가, 잔고 이월 일치 | 통과(차이 0) |
| 처분손익 = (주식수 × 처분단가 − 거래원가) − 처분원가 | 통과(차이 0) |
| 기준 당기손익 인식액 = 0 (자본거래) | 통과(의도적 예외 제외 차이 0) |
| 장부 원가·손익 = 기준 | 통과(의도적 예외 제외 차이 0) |
| 거래 유형별 집계 = 명세 집계 | 통과(차이 0) |
| 분기별 집계 = 명세 집계 | 통과(차이 0) |
| 거래 경로별 집계 = 명세 집계 | 통과(차이 0) |
| 대사 요약행 = 실제 집계 결과 | 통과(차이 0) |
| 금액 차이 건 = 예외 등록 건 | 통과(의도적 예외 제외 차이 0) |
| 확인 대상 건 안내 | 거래원가 비용 처리 1건 · 처분이익 당기손익 1건 · 처분손실 당기손익 1건 · 최근 단가 적용 1건 · 저가 처분 1건(의도적으로 구성한 케이스) |
| 조회 조건 전달 — 12건 전체 · 거래 유형 필터 6건 · 주식수 내림차순 top 3 정렬 확인 · __count 12 일치 | 확인 |
| 표시 금지 검사 — 커스텀 프로그램ID·앱 식별자·출처 표현 검출 | 0건 |
| 화면 렌더링 — 실브라우저에서 조회 → 탭 이동 → 행 클릭 상세까지 실동작 후 캡처 | 6/6 |
조회 버튼 위치 · sap_horizon 테마 · Enter 키 조회 · 서비스 미연결 시 오류 안내 | 확인 |
모든 데이터는 검증용으로 구성한 가상 데이터입니다.
자주 묻는 질문
이 화면의 판정이 곧 기준서 충족 여부인가요?
아닙니다. 이 화면은 자기주식 거래의 원가 계산과 처분손익 처리 결과를 집계·대사해 확인이 필요한 건을 가려내는 점검 도구입니다. 최종 판단은 기준서 원문에 따라 회사와 감사인이 합니다.
적용 시기와 범위는 어떻게 되나요?
IAS 32 금융상품: 표시(K-IFRS 제1032호)는 이미 시행 중인 기준서입니다. 이 화면은 회사가 직접 사고팔거나 소각한 자기 회사 주식 거래를 다룹니다. 취득·처분이 생긴 달마다, 그리고 결산 때 점검할 대상입니다.
자기주식을 비싸게 팔았는데 왜 이익이 아닌가요?
자기주식 거래는 회사가 주주와 하는 자본거래입니다. 회사가 영업으로 번 돈이 아니라 주주에게서 받은 돈의 크기가 바뀐 것이므로, 차익은 손익계산서가 아니라 자본에서 처리합니다. 손실이 난 경우도 마찬가지입니다.
처분원가는 왜 평균단가로 계산하나요?
같은 주식을 여러 번에 나눠 사면 단가가 제각각입니다. 어느 주식을 팔았는지 구분할 수 없으므로 보유분 전체의 평균단가로 처분원가를 잡는 것이 일반적입니다. 이 화면은 이동평균법을 기준으로 하며, 회사가 다른 원가흐름 가정을 쓴다면 그 기준에 맞춰 읽어야 합니다.