コンテンツにスキップ

iDempiere 原価調整伝票の使い方|在庫管理 操作マニュアル・技術仕様

📖 在庫管理の全体像: 在庫管理の業務フロー全体図 も合わせてご覧ください。

原価調整伝票は、品目の在庫原価(Cost Price)を手動で修正するための伝票です。棚卸伝票と同じ M_Inventory テーブルを使いますが、**伝票タイプの在庫サブタイプが「原価調整(Cost Adjustment)」**である点が実地棚卸との違いです。数量は動かさず、原価だけを調整します。

📌 ポイント: 原価調整伝票では在庫数量は変動しません。動かすのは原価のみです。数量を修正したい場合は 実地棚卸 を使用してください。

期首移行時の原価取込み、仕入原価の遡及修正、標準原価の改定など、在庫評価額を正しい金額に是正したい場面で使用します。

  • 品目ごとの現在の原価から新しい原価への変更
  • 属性セットインスタンス(ロット・バッチ)単位での原価調整
  • 在庫評価方法(Costing Method)を指定した調整
  • 通貨・通貨レートタイプを指定した外貨建て原価の調整
  • プロジェクト・アクティビティ・営業活動・コストセンター・部門などの会計ディメンション付与
  • 完了後の会計仕訳(転記)と、逆仕訳による取り消し

原価調整伝票はヘッダー+明細の2タブ構成です。

タブ名テーブル項目数役割
Cost AdjustmentM_Inventory20項目伝票番号・伝票タイプ・移動日付・在庫評価方法・会計ディメンション
Cost Adjustment LineM_InventoryLine12項目品目・属性セットインスタンス・現在の原価・新しい原価

💡 ヒント: M_Inventory は実地棚卸・内部使用棚卸・原価調整の3種類の伝票で共有されるテーブルです。どの動作になるかは伝票タイプの在庫サブタイプで決まります。原価調整用の伝票タイプが未整備の場合、先に伝票タイプを準備してください。

graph TD
    A["📂 メニューから<br/>原価調整伝票を開く"] --> B["➕ 新規<br/>伝票タイプ(原価調整)を選択"]
    B --> C["📅 移動日付を入力<br/>通貨は会計スキーマ通貨が自動設定"]
    C --> D["⚙️ 在庫評価方法を選択<br/>(標準原価・平均原価など)"]
    D --> E["💾 ヘッダーを保存"]
    E --> F["📋 明細タブで品目を選択"]
    F --> G{"原価計算レベルが<br/>バッチ/ロット?"}
    G -->|"Yes"| H["🏷 属性セットインスタンスを必ず指定"]
    G -->|"No"| I["現在の原価が自動セットされる"]
    H --> I
    I --> J["💰 新しい原価を入力"]
    J --> K["▶ 棚卸プロセス(DocAction)で<br/>「完了」を実行"]
    K --> L["📒 原価が更新され<br/>転記対象になる"]

メニューから 原価調整伝票を開く 新規 伝票タイプ(原価調整)を選択 移動日付を入力 通貨は会計スキーマ通貨が自動設定 在庫評価方法を選択 (標準原価・平均原価など) ヘッダーを保存 明細タブで品目を選択 原価計算レベルが バッチ/ロット? 属性セットインスタンスを必ず指定 現在の原価が自動セットされる 新しい原価を入力 ▶ 棚卸プロセス(DocAction)で 「完了」を実行 原価が更新され 転記対象になる

アクセス方法(メニューパス)

Section titled “アクセス方法(メニューパス)”

メニューから「在庫管理 > 原価調整伝票」を開きます。

  1. ツールバーの「新規」ボタンをクリック
  2. ヘッダー情報を入力:
    • 伝票タイプ: 在庫サブタイプが「原価調整」の伝票タイプを選択(必須
    • 移動日付: 調整を計上する日付(初期値は当日)
    • 在庫評価方法: 調整対象の原価計算方法(標準原価・平均原価等)
    • 通貨: 未入力の場合、保存時に主会計スキーマの通貨が自動設定されます
    • 説明: 調整理由のメモ(任意)
  3. 必要に応じて会計ディメンション(プロジェクトアクティビティ営業活動Cost CenterDepartmentユーザー1/2)を入力
  4. 保存」をクリック
  5. Cost Adjustment Line」タブに移動して明細を登録:
    • 品目: 調整対象の品目(必須
    • 属性セットインスタンス: ロット/バッチ単位で原価管理する場合は必須
    • 現在の原価: 保存時に既存の原価レコードから自動セットされます
    • 新しい原価: 調整後の原価を入力
  6. ヘッダーに戻り、**棚卸プロセス(DocAction)**で「完了」を実行

⚠️ 注意: 明細を1件でも登録した後は倉庫を変更できませんCannotChangeWarehouse エラー)。倉庫を変えたい場合は明細をすべて削除してから変更してください。

伝票アクション処理内容
完了(Complete)原価調整を確定し、原価レコードを更新
承認 / 却下承認金額に基づく承認処理
無効化(Void)未転記の伝票を無効化
締切(Close)伝票を締め切る
逆仕訳-訂正 / 逆仕訳-発生完了済み伝票を反対仕訳で取り消す
再有効化(Re-activate)完了済み伝票を編集可能な状態に戻す

完了後は「転記」ボタンで会計仕訳の転記状況を確認できます。

項目名必須説明
伝票番号必須文字列伝票採番
伝票タイプ必須選択在庫サブタイプ = 原価調整のもの
移動日付必須日付調整の計上日(初期値 当日)
在庫評価方法-リスト標準原価・平均原価等
通貨-選択未指定なら主会計スキーマ通貨を自動設定
通貨レートタイプ-選択為替換算のレートタイプ
説明-文字列調整理由
プロジェクト-選択会計ディメンション
アクティビティ-選択会計ディメンション
営業活動-選択会計ディメンション
Cost Center-選択コストセンター
Department-選択部門
伝票状態必須リスト初期値 DR(ドラフト)
棚卸プロセス必須ボタン伝票アクション(初期値 CO)
転記必須ボタン転記状態
項目名必須説明
明細番号-整数自動採番(既存最大+10)
品目必須検索調整対象の品目
属性セットインスタンス必須品目属性原価計算レベルがバッチ/ロットなら必須
現在の原価-原価・価格保存時に自動セット(初期値 0)
新しい原価-原価・価格調整後の原価(初期値 0)
料金-選択追加費用の勘定科目
説明-文字列明細のメモ

全項目一覧はリファレンスを参照

M_Inventory は在庫サブタイプによって役割が変わります。

在庫サブタイプウィンドウ数量の変動原価の変動主な用途
実地棚卸(Physical Inventory)実地棚卸あり間接的棚卸差異の反映
内部使用(Internal Use)在庫減少・増加あり間接的社内消費の払出(料金勘定が必須)
原価調整(Cost Adjustment)原価調整伝票なしあり在庫評価額の是正

Q. 「原価レコードがありません」と表示されて保存できません。

Section titled “Q. 「原価レコードがありません」と表示されて保存できません。”

明細保存時に対象品目(および属性セットインスタンス)の現在原価レコードが見つからない場合のエラーです。在庫評価方法が標準原価(Standard Costing)以外のときは現在原価が必須のため保存できません。先に取引実績を作るか、標準原価方式で登録してください。

Q. 属性セットインスタンスが必須になるのはどんなときですか?

Section titled “Q. 属性セットインスタンスが必須になるのはどんなときですか?”

品目の原価計算レベル(Costing Level)がバッチ/ロットの場合です。この場合、属性セットインスタンスが未指定だと FillMandatory エラーになります。原価計算レベルは品目カテゴリ・会計スキーマの設定で決まります。

Q. 明細に保管場所を入力しても保存すると消えてしまいます。

Section titled “Q. 明細に保管場所を入力しても保存すると消えてしまいます。”

仕様です。原価調整伝票では保存時に保管場所(M_Locator_ID)が 0 にクリアされます。原価調整は保管場所単位ではなく品目(+属性セットインスタンス)単位で行われるためです。

Q. 通貨を入力しなかった場合はどうなりますか?

Section titled “Q. 通貨を入力しなかった場合はどうなりますか?”

保存時に主会計スキーマの通貨が自動設定されます。ヘッダーの通貨と一致する会計スキーマが明細処理時に選択されるため、複数会計スキーマ環境では通貨の指定が実質的にスキーマの指定になります。

Q. 「伝票の在庫サブタイプが設定されていません」というエラーが出ます。

Section titled “Q. 「伝票の在庫サブタイプが設定されていません」というエラーが出ます。”

伝票タイプの**在庫サブタイプ(DocSubTypeInv)**が「実地棚卸」「内部使用」「原価調整」のいずれにも設定されていない場合のエラーです。伝票タイプ設定で在庫サブタイプを「原価調整」に設定してください。

Q. 完了後に間違いに気づいた場合は?

Section titled “Q. 完了後に間違いに気づいた場合は?”

逆仕訳-訂正(Reverse-Correct)または逆仕訳-発生(Reverse-Accrual)で取り消します。逆仕訳伝票が新たに生成され、元伝票には逆仕訳への参照(Reversal_ID)が記録されます。

🛠 技術仕様(開発者向け)

原価調整伝票は伝票(Document)型のウィンドウ(AD_Window_ID: 200043)で、実地棚卸・内部使用棚卸と同じ M_Inventory / M_InventoryLine テーブルを共有します。MInventory クラス(1,354行)が DocAction を実装し、MInventoryLine クラス(544行)が在庫サブタイプ別のバリデーションを担当します。どのモードで動くかは MDocType.getDocSubTypeInv() の値(DOCSUBTYPEINV_CostAdjustment 等)で分岐します。両テーブルとも AccessLevel = 1(Organization)です。

classDiagram
    class MInventory {
        +beforeSave(boolean) boolean
        +prepareIt() String
        +completeIt() String
        +voidIt() boolean
        +reverseCorrectIt() boolean
        +getLines(boolean) MInventoryLine[]
        #reverse(boolean) MInventory
        #checkMaterialPolicy(MInventoryLine, BigDecimal) void
    }
    class MInventoryLine {
        +beforeSave(boolean) boolean
        +getCurrentCostPriceForCostAdjustment() BigDecimal
        +isInternalUseInventory() boolean
        +getMovementQty() BigDecimal
    }
    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
    MInventoryLine --> MProduct : adjusts cost of
    MInventoryLine --> MAttributeSetInstance : batch/lot

+beforeSave(boolean) boolean +prepareIt() String +completeIt() String +voidIt() boolean +reverseCorrectIt() boolean +getLines(boolean) MInventoryLine[] #reverse(boolean) MInventory #checkMaterialPolicy(MInventoryLine, BigDecimal) void +beforeSave(boolean) boolean +getCurrentCostPriceForCostAdjustment() BigDecimal +isInternalUseInventory() boolean +getMovementQty() BigDecimal <> <> <> > X_M_Inventory X_M_Inventory --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MInventory.java(1,354行) / MInventoryLine.java(544行)

M_Inventory(原価調整伝票ヘッダー)

Section titled “M_Inventory(原価調整伝票ヘッダー)”
カラム名必須説明備考
M_Inventory_IDIDPK伝票ID主キー
AD_Client_IDTable DirectYテナント既定 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定 @#AD_Org_ID@
DocumentNoStringY伝票番号
C_DocType_IDTable DirectY伝票タイプ在庫サブタイプで動作が決まる
MovementDateDateY移動日付既定 @#Date@
CostingMethodListN在庫評価方法
C_Currency_IDTable DirectN通貨未設定時は主会計スキーマ通貨
C_ConversionType_IDTable DirectN通貨レートタイプ
M_Warehouse_IDTable DirectN倉庫明細作成後は変更不可
DocStatusListY伝票状態既定 DR
DocActionButtonY伝票アクション既定 CO
PostedButtonY転記状態
IsApprovedYes-NoY承認済み
ApprovalAmtAmountN承認金額
Reversal_IDSearchN逆仕訳伝票逆仕訳時に設定
C_CostCenter_IDTable DirectNコストセンター
C_Department_IDTable DirectN部門
ProcessedYes-NoY処理済み

M_InventoryLine(原価調整伝票明細)

Section titled “M_InventoryLine(原価調整伝票明細)”
カラム名必須説明備考
M_InventoryLine_IDIDPK明細ID主キー
M_Inventory_IDSearchY親伝票FK
LineIntegerN明細番号既定 MAX(Line)+10 の SQL 既定値
M_Product_IDSearchY品目
M_AttributeSetInstance_IDProduct AttributeY属性セットインスタンス原価計算レベル=バッチ/ロットで必須
CurrentCostPriceCosts+PricesN現在の原価既定 0・保存時に自動設定
NewCostPriceCosts+PricesN新しい原価既定 0
C_Charge_IDTable DirectN料金内部使用棚卸で使用
InventoryTypeListY在庫タイプ既定 D
M_Locator_IDLocator (WH)N保管場所原価調整では 0 にクリア
QtyBook / QtyCountQuantityY帳簿数量/実棚数量実地棚卸で使用
QtyInternalUseQuantityN内部使用数量内部使用棚卸で使用
ProcessedYes-NoY処理済み
erDiagram
    C_DocType ||--o{ M_Inventory : "doc sub type inv"
    M_Inventory ||--o{ M_InventoryLine : "lines"
    M_InventoryLine }o--|| M_Product : "product"
    M_InventoryLine }o--o| M_AttributeSetInstance : "batch/lot"
    M_InventoryLine }o--o| C_Charge : "charge"
    M_Inventory }o--o| M_Warehouse : "warehouse"
    M_Inventory ||--o| M_Inventory : "reversal"

doc sub type inv batch/lot

  1. C_DocType_ID が未設定なら FillMandatory で保存拒否
  2. 既存レコードで M_Warehouse_ID が変更された場合、M_InventoryLine の件数を SQL で確認し、1件でもあれば CannotChangeWarehouse で保存拒否
  3. 伝票タイプの DocSubTypeInvCostAdjustment の場合、C_Currency_ID が 0 なら主会計スキーマの通貨MClient.get(ctx).getAcctSchema().getC_Currency_ID())を自動設定

MInventoryLine.beforeSave() — 原価調整分岐

Section titled “MInventoryLine.beforeSave() — 原価調整分岐”
flowchart TD
    A["beforeSave()"] --> B{"親伝票が Processed<br/>かつ新規?"}
    B -->|"Yes"| C["ParentComplete エラー"]
    B -->|"No"| D["明細番号の自動採番<br/>MAX(Line)+10"]
    D --> E["数量の UOM 精度を強制"]
    E --> F{"DocSubTypeInv"}
    F -->|"InternalUse"| G["料金必須・帳簿/実棚数量禁止"]
    F -->|"PhysicalInventory"| H["内部使用数量禁止<br/>料金は在庫タイプに応じ制御"]
    F -->|"CostAdjustment"| I["原価調整バリデーション"]
    F -->|"その他"| J["サブタイプ未設定エラー"]
    I --> K{"原価計算レベル<br/>= バッチ/ロット?"}
    K -->|"Yes かつ ASI 未指定"| L["FillMandatory エラー"]
    K -->|"No"| M["通貨から会計スキーマを特定"]
    M --> N["getCurrentCostPriceForCostAdjustment()"]
    N --> O{"現在原価 = null?"}
    O -->|"Yes かつ 標準原価以外"| P["NoCostingRecord エラー"]
    O -->|"No"| Q["CurrentCostPrice にセット"]
    Q --> R["M_Locator_ID を 0 にクリア"]

beforeSave() 親伝票が Processed かつ新規? ParentComplete エラー 明細番号の自動採番 MAX(Line)+10 数量の UOM 精度を強制 料金必須・帳簿/実棚数量禁止 内部使用数量禁止 料金は在庫タイプに応じ制御 原価調整バリデーション その他 サブタイプ未設定エラー 原価計算レベル = バッチ/ロット? Yes かつ ASI 未指定 FillMandatory エラー 通貨から会計スキーマを特定 getCurrentCostPriceForCostAdjustment() 現在原価 = null? Yes かつ 標準原価以外 NoCostingRecord エラー CurrentCostPrice にセット M_Locator_ID を 0 にクリア

原価調整分岐の要点は次のとおりです。

  1. 属性セットインスタンス必須判定: product.getCostingLevel(as)COSTINGLEVEL_BatchLot の場合、M_AttributeSetInstance_ID が 0 なら FillMandatory エラー
  2. 会計スキーマの特定: 親伝票の C_Currency_ID と主会計スキーマの通貨が異なる場合、MAcctSchema.getClientAcctSchema() から通貨が一致するスキーマを検索して使用
  3. 現在原価のセット: getCurrentCostPriceForCostAdjustment() の戻り値が null かつ在庫評価方法が COSTINGMETHOD_StandardCosting 以外なら NoCostingRecord エラー。取得できた場合は新規時・品目変更時・ASI変更時に CurrentCostPrice を再設定
  4. 保管場所のクリア: setM_Locator_ID(0)
  5. 最後に、料金(C_Charge_ID)が未設定なら AD_Org_ID を親伝票の組織に揃える

MInventory.completeIt() は明細ループ内で DocSubTypeInv により処理を分岐し、CostAdjustment の場合は line.getCurrentCostPriceForCostAdjustment() で取得した現在原価を基準に原価レコードを更新します。実地棚卸のみで実行される後処理(checkMaterialPolicy() による在庫引当・材料ポリシー処理)は原価調整では実行されません。

reverse(boolean accrual) が逆仕訳伝票を生成し、reverseCorrectIt()(訂正)と reverseAccrualIt()(発生日逆仕訳)から共通で呼ばれます。生成された伝票は元伝票の Reversal_ID、明細は ReversalLine_ID で相互参照されます。

拡張ポイント(カスタマイズ箇所)

Section titled “拡張ポイント(カスタマイズ箇所)”
public class CustomCostAdjustmentValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MInventoryLine
&& (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
MInventoryLine line = (MInventoryLine) po;
MDocType dt = MDocType.get(line.getCtx(), line.getParent().getC_DocType_ID());
if (MDocType.DOCSUBTYPEINV_CostAdjustment.equals(dt.getDocSubTypeInv())) {
// 例: 原価の変動率が 50% を超える調整を禁止する
BigDecimal cur = line.getCurrentCostPrice();
BigDecimal neu = line.getNewCostPrice();
if (cur.signum() != 0
&& neu.subtract(cur).abs().divide(cur, 4, RoundingMode.HALF_UP)
.compareTo(new BigDecimal("0.5")) > 0) {
throw new AdempiereException("原価の変動率が50%を超えています。承認を得てください");
}
}
}
return null;
}
}

M_Inventory / M_InventoryLine の各カラムには標準の Callout は設定されていません(AD メタデータ上 Callout 列は空)。現在原価の自動セットは Callout ではなく beforeSave() で行われるため、画面上は保存後に値が反映されます。

docValidate()TIMING_BEFORE_COMPLETE / TIMING_AFTER_COMPLETE を使うと、原価調整の完了前後に独自処理(承認チェック、原価改定履歴の記録など)を差し込めます。原価計算エンジン自体を差し替える場合は ICostingMethod の実装を OSGi サービスとして登録します。

プロセス名説明
棚卸プロセス(DocAction)原価調整の準備・完了・無効化・逆仕訳を実行
転記(Posted)会計仕訳の転記状況確認・再転記

原価調整は在庫評価額と損益に直結するため、承認フローや変動率チェックを組み込みたいというご要望が多い領域です。 Model Validator を使えば、コア改変なしに原価改定のガバナンスを効かせられます。

As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。

OSS ERP導入・カスタマイズサービスの詳細はこちら