iDempiere 実地棚卸の使い方|在庫管理 操作マニュアル・技術仕様
実地棚卸は、倉庫の実際の在庫数量を確認し、帳簿在庫との差異を調整する機能です。棚卸表(カウントリスト)を自動生成し、実数を入力して差異を処理できます。
📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。
実地棚卸でできること
Section titled “実地棚卸でできること”- 棚卸表(カウントリスト)の自動生成
- 実数(実地棚卸数量)の入力
- 帳簿在庫と実数の差異表示
- 差異の自動調整(完了処理時に在庫を修正)
- ロケーター単位・品目カテゴリ単位での棚卸
🖥️ インタラクティブ画面レイアウト: AD メタデータから自動生成した 棚卸伝票の全タブ・全フィールド レイアウト(HTML版) で、実際の画面配置をご確認いただけます。
graph TD
subgraph "実地棚卸ウィンドウ(Window ID: 168)"
T1["📋 棚卸伝票<br/>M_Inventory<br/>22項目"]
T2["📝 棚卸伝票明細<br/>M_InventoryLine<br/>12項目"]
T2a[" └ 属性<br/> M_InventoryLineMA<br/> 7項目"]
end
T1 --> T2
T2 --> T2a
📌 ポイント: 棚卸明細行は「棚卸明細行の自動生成」ボタンで一括生成できます。倉庫・ロケーター・品目カテゴリを絞り込んで生成することも可能で、部分的な棚卸(ロケーション別棚卸等)にも対応しています。
| タブ名 | テーブル | 役割 |
|---|---|---|
| 棚卸伝票 | M_Inventory | ヘッダー(倉庫・日付・説明) |
| 棚卸伝票明細 | M_InventoryLine | 品目ごとの帳簿数量・実数・差異 |
| 属性 | M_InventoryLineMA | ロット・シリアル番号の割当 |
基本操作手順
Section titled “基本操作手順”graph TD
A["① 棚卸計画<br/>(対象倉庫・<br/>基準日を決定)"] --> B["② 棚卸伝票作成<br/>倉庫・日付・<br/>説明を入力"]
B --> C["③ 明細行の自動生成<br/>帳簿在庫が<br/>自動セットされる"]
C --> D["④ 実地カウント<br/>現場で実数を<br/>数える"]
D --> E["⑤ 実棚卸数量を入力<br/>差異が自動計算<br/>される"]
E --> F{"差異あり?"}
F -->|"あり"| G["⑥ 原因調査・<br/>上長承認"]
F -->|"なし"| H["⑦ 完了処理"]
G --> H
H --> I["帳簿在庫更新<br/>+差異仕訳<br/>自動生成"]
⚠️ 注意: 完了処理を実行すると帳簿在庫が実数に書き換えられ、差異分の会計仕訳が自動生成されます。差異が大きい場合は原因調査・承認フローを経てから完了処理を行ってください。
💡 ヒント: 棚卸基準日の帳簿数量が自動セットされるため、棚卸中に入出庫が発生しても基準日時点の数量と比較できます。ただし差異の原因分析が複雑になるため、可能な限り棚卸中の入出庫は最小化することを推奨します。
アクセス方法
Section titled “アクセス方法”メニューから「在庫管理 > 棚卸伝票」を開きます。
棚卸の実施手順
Section titled “棚卸の実施手順”- 「新規」ボタンをクリック
- ヘッダー情報を入力:
- 倉庫: 棚卸対象の倉庫
- 移動日付: 棚卸基準日
- 説明: 「2026年3月期末棚卸」等
- 「保存」をクリック
- 「棚卸明細行の自動生成」ボタンで棚卸表を自動作成
- 倉庫内の在庫品目が自動的に明細行として生成される
- 帳簿数量(Book Quantity)が自動セット
- 「棚卸伝票明細」タブに移動
- 各品目の実数を入力:
- 実棚卸数量(QtyCount): 実際に数えた数量
- 差異(= 実数 - 帳簿数量)が自動計算
- 全品目の実数入力後、「伝票アクション」で「完了」を実行
完了処理により:
- 帳簿在庫が実数に修正される
- 差異分の在庫調整仕訳が自動生成
📐 画面レイアウト: ヘッダータブのフィールド配置は 画面構成 セクションのレイアウト図を参照してください。
項目リファレンス
Section titled “項目リファレンス”棚卸伝票タブ
Section titled “棚卸伝票タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 倉庫 | 必須 | 選択 | 棚卸対象の倉庫 |
| 移動日付 | 必須 | 日付 | 棚卸基準日 |
| 説明 | - | テキスト | 棚卸の目的・備考 |
棚卸伝票明細タブ
Section titled “棚卸伝票明細タブ”| 項目名 | 型 | 説明 |
|---|---|---|
| ロケーター | 選択 | 保管場所 |
| 品目 | 検索 | 対象品目 |
| 帳簿数量 | 数量 | システム上の在庫数量(自動セット) |
| 実棚卸数量 | 数量 | 実際に数えた数量(入力) |
| 差異数量 | 数量 | 実数 - 帳簿数量(自動計算) |
| 属性セットインスタンス | 選択 | ロット・シリアル番号 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 棚卸明細を手動で追加できますか?
Section titled “Q. 棚卸明細を手動で追加できますか?”はい。自動生成後に手動で明細行を追加できます。帳簿数量が0の品目(帳簿上は在庫なしだが実物がある場合)を追加する際に使用します。
Q. 差異が出た場合の会計処理は?
Section titled “Q. 差異が出た場合の会計処理は?”完了処理時に「在庫差異」勘定に自動仕訳されます。差異勘定は品目カテゴリの会計パラメータで設定します。
Q. 棚卸中に出荷・入荷を止める必要はありますか?
Section titled “Q. 棚卸中に出荷・入荷を止める必要はありますか?”理想的には棚卸中は入出庫を停止すべきですが、iDempiereでは棚卸基準日の帳簿数量を使用するため、厳密な在庫凍結は必須ではありません。ただし差異の原因分析が複雑になる場合があります。
Q. 在庫増減伝票との違いは?
Section titled “Q. 在庫増減伝票との違いは?”- 実地棚卸: 帳簿と実数を比較し差異を調整
- 在庫増減: 理由が明確な在庫の増減(社内使用、廃棄等)を記録
graph TD
A[棚卸計画] -->|棚卸表生成| B[棚卸伝票作成]
B -->|実地カウント| C[実数入力]
C -->|差異確認| D{差異あり?}
D -->|あり| E[原因調査]
E -->|承認| F[完了処理]
D -->|なし| F
F -->|在庫修正| G[帳簿在庫更新]
F -->|会計仕訳| H[在庫差異勘定]
OSS ERP導入についてのご相談
Section titled “OSS ERP導入についてのご相談”As-Link株式会社では、iDempiereの導入支援・カスタマイズ開発を承っております。
🛠 技術仕様(開発者向け)
棚卸は Document 型の伝票で、M_Inventory テーブルに格納されます。実地棚卸の結果を記録し、帳簿在庫と実在庫の差異を調整します。MInventory クラス(1,354行)が中核ビジネスロジックを担い、DocAction インターフェースを実装しています。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MInventory {
+prepareIt() String
+completeIt() String
+voidIt() boolean
+closeIt() boolean
+reverseCorrectIt() boolean
+getLines(requery) MInventoryLine[]
}
class X_M_Inventory {
<<generated>>
}
class PO {
<<abstract>>
}
class DocAction {
<<interface>>
}
MInventory --|> X_M_Inventory
X_M_Inventory --|> PO
MInventory ..|> DocAction
MInventory --> MInventoryLine : has many
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MInventory.java
関連DBテーブル
Section titled “関連DBテーブル”M_Inventory(棚卸ヘッダー)
Section titled “M_Inventory(棚卸ヘッダー)”⚠️ 注意:
M_InventoryテーブルはIsInternalUseInventoryカラムで通常の棚卸差異調整(N)と社内使用消費(Y)を兼用しています。社内消費はQtyInternalUseを入力して在庫を費用化する処理で、棚卸とは全く異なるユースケースです。Model Validator でのフック時はIsInternalUseInventoryを必ず確認してください。
| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_Inventory_ID | ID | PK | 棚卸ID | 主キー |
| AD_Client_ID | TableDirect | Y | クライアント | |
| AD_Org_ID | TableDirect | Y | 組織 | |
| DocumentNo | String | Y | 伝票番号 | |
| C_DocType_ID | TableDirect | Y | 伝票タイプ | MMI(棚卸) |
| DocStatus | List | Y | 伝票状態 | DR/IP/CO/CL/VO/RE |
| DocAction | Button | Y | 伝票アクション | |
| MovementDate | Date | Y | 棚卸日付 | |
| Description | Text | N | 説明 | |
| M_Warehouse_ID | TableDirect | Y | 倉庫 | 棚卸対象倉庫 |
| C_Charge_ID | TableDirect | N | 科目 | 差異調整の費用科目 |
| Processed | YesNo | Y | 処理済み | |
| Posted | Button | Y | 転記 | |
| IsInternalUseInventory | YesNo | Y | 社内使用 | Y=社内消費, N=棚卸差異 |
M_InventoryLine(棚卸明細)
Section titled “M_InventoryLine(棚卸明細)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_InventoryLine_ID | ID | PK | 明細ID | |
| M_Inventory_ID | Search | Y | ヘッダーFK | |
| Line | Integer | Y | 行番号 | |
| M_Product_ID | Search | Y | 品目 | |
| M_Locator_ID | TableDirect | Y | ロケーター | |
| QtyBook | Quantity | Y | 帳簿数量 | システム上の在庫数量 |
| QtyCount | Quantity | Y | 実数量 | 実地棚卸の数量 |
| QtyInternalUse | Quantity | N | 社内使用数量 | IsInternalUseInventory=Y時 |
| M_AttributeSetInstance_ID | PAttribute | N | 属性セットインスタンス | |
| Description | Text | N | 説明 | 差異理由等 |
| InventoryType | List | N | 棚卸タイプ | D=差異, C=科目 |
erDiagram
M_Inventory ||--o{ M_InventoryLine : "has"
M_Inventory }o--|| M_Warehouse : "target warehouse"
M_Inventory }o--|| C_DocType : "references"
M_Inventory }o--o| C_Charge : "expense account"
M_InventoryLine }o--|| M_Product : "references"
M_InventoryLine }o--|| M_Locator : "location"
M_Inventory ||--o{ Fact_Acct : "posted"
M_InventoryLine }o--o| M_AttributeSetInstance : "attributes"
ビジネスロジック
Section titled “ビジネスロジック”カウントリスト生成
Section titled “カウントリスト生成”📌 ポイント: カウントリスト生成プロセスは
M_StorageOnHandの時点在庫をQtyBookとしてスナップショットします。カウントリスト生成後に他の伝票(出荷・入荷等)が処理されてもQtyBookは更新されません。棚卸中の在庫異動は最小化し、生成後は速やかに実数入力・完了させることが重要です。
棚卸明細の一括生成プロセス:
- 対象倉庫のロケーターを選択
- 品目カテゴリ、品目等でフィルタリング
M_StorageOnHandから現在の帳簿数量(QtyBook)を取得M_InventoryLineを自動生成(QtyCount は空欄)- 棚卸担当者が実数量(QtyCount)を入力
prepareIt() の主要処理
Section titled “prepareIt() の主要処理”ModelValidator.TIMING_BEFORE_PREPAREイベント発火- 会計期間のオープンチェック
- 明細行の存在チェック
- 各明細行の品目・ロケーター妥当性チェック
ModelValidator.TIMING_AFTER_PREPAREイベント発火
completeIt() の主要処理
Section titled “completeIt() の主要処理”ModelValidator.TIMING_BEFORE_COMPLETEイベント発火- 各明細行の差異計算(QtyCount - QtyBook)
- 在庫数量の調整(
MStorageOnHandの更新)- 差異がプラス: 在庫増加
- 差異がマイナス: 在庫減少
- 社内使用在庫の場合:
QtyInternalUse分の在庫減少 - 会計転記用データの生成(差異金額の計算)
- 原価明細(
M_CostDetail)の更新 ModelValidator.TIMING_AFTER_COMPLETEイベント発火
伝票処理フロー
Section titled “伝票処理フロー”stateDiagram-v2
[*] --> Drafted : カウントリスト生成
Drafted --> InProgress : prepareIt()
InProgress --> Completed : completeIt()
Completed --> Closed : closeIt()
Completed --> Voided : voidIt()
Completed --> Reversed : reverseCorrectIt()
差異調整の会計転記
Section titled “差異調整の会計転記”棚卸差異の会計転記パターン:
| 差異タイプ | 借方 | 貸方 |
|---|---|---|
| 棚増(実数 > 帳簿) | 棚卸資産勘定 | 棚卸差異勘定 |
| 棚減(実数 < 帳簿) | 棚卸差異勘定 | 棚卸資産勘定 |
| 社内消費 | 費用科目(C_Charge) | 棚卸資産勘定 |
社内使用在庫
Section titled “社内使用在庫”IsInternalUseInventory=Y の場合、棚卸ではなく社内消費として処理:
QtyInternalUseで消費数量を入力C_Charge_IDで費用科目を指定- 在庫を減少させ、費用を計上
Callout
Section titled “Callout”| Calloutクラス | メソッド | トリガーフィールド | 処理内容 |
|---|---|---|---|
| CalloutInventory | product | M_Product_ID | 品目選択時の帳簿数量自動セット |
Calloutソース: org.adempiere.base.callout/src/org/compiere/model/CalloutInventory.java
💡 ヒント:
CalloutInventory.productは品目選択時にM_StorageOnHandを集計してQtyBookを自動セットします。手動で明細行を追加する場合に帳簿数量が表示されない場合は、このCallout が正しく動作しているか AD_Column の Callout 設定を確認してください。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”棚卸に独自バリデーションを追加する最も安全な方法:
public class CustomInventoryValidator implements ModelValidator { @Override public String docValidate(PO po, int timing) { if (po instanceof MInventory) { MInventory inventory = (MInventory) po; if (timing == TIMING_BEFORE_COMPLETE) { // 例: 大量差異の警告チェック MInventoryLine[] lines = inventory.getLines(false); for (MInventoryLine line : lines) { BigDecimal diff = line.getQtyCount().subtract(line.getQtyBook()); BigDecimal threshold = line.getQtyBook().multiply(new BigDecimal("0.1")); if (diff.abs().compareTo(threshold) > 0) { // 10%以上の差異は承認が必要 if (!isApproved(inventory)) { return "棚卸差異が10%を超えています。承認が必要です: 行 " + line.getLine(); } } } } } return null; }}カウントリストのカスタマイズ
Section titled “カウントリストのカスタマイズ”カウントリスト生成プロセスを拡張し、ABC分析に基づく循環棚卸や、ロケーション別の棚卸スケジュール管理を実装可能。
🔧 カスタマイズ: 大量の棚卸差異が発生した場合の承認フロー追加は
TIMING_BEFORE_COMPLETEで差異率を計算する Model Validator が最適です。差異率の許容閾値はカスタムのAD_SysConfigキー(例:INVENTORY_VARIANCE_THRESHOLD)で外部化しておくと、本番後の閾値変更が容易になります。MSysConfig.getValue()で参照できます。
関連プロセス
Section titled “関連プロセス”| プロセス名 | 説明 |
|---|---|
| 伝票アクション (DocAction) | 伝票の完了・無効・取消等 |
| カウントリスト生成 | 帳簿在庫から棚卸明細を一括生成 |
| 在庫帳簿数量更新 | 帳簿数量を最新状態に更新 |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”iDempiereの棚卸機能は Model Validator や Callout で安全にカスタマイズできます。 循環棚卸、差異承認フロー、社内消費管理をコア改変なしで拡張可能です。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。