bcquality/microsoft/knowledge/finance/post-ledger-entries-through-posting-codeunits.md
Jesper Schulz-Wedde 7c17aa3ab8 Fix Finance review applicability and ownership boundaries
Remove application-area gating and later VAT-field dependencies, align dynamic shared conventions, separate SCM ownership, and keep journal examples focused on the intended invariant.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-09-17 18:10:21 +02:00

3.5 KiB

bc-version domain keywords technologies countries application-area
all
finance
g-l-entry
ledger-entry
gen-jnl-post-line
gen-jnl-post-batch
journal-line
register
insert
al
w1
all

Create financial ledger entries through the owning posting engine

Description

Standard financial ledger entries are outputs of posting, not independent rows an extension manufactures. Even two manually inserted G/L rows with balanced amounts bypass posting checks, register bookkeeping, and transaction/source relationships. G/L Entry.Insert(true) runs the table trigger; it does not invoke the posting engine.

Best Practice

Use the owning document or journal posting workflow. For a normal persisted general-journal batch, use "Gen. Jnl.-Post Batch"; the example posts an existing batch containing one self-balancing, non-VAT G/L transfer. Let posting allocate entries and maintain the register rather than reconstructing its tables.

"Gen. Jnl.-Post Line".RunWithCheck is appropriate for a complete journal line inside a correctly owned posting lifecycle, but it does not invent a balancing account or document number, allocate numbering merely from Posting No. Series, or replace batch document-balancing policy. The line codeunit is stateful; its checked wrapper owns its start/continue/finish work. Normal batch posting owns its numbering and commits by default; do not imply these entry points are transaction-neutral.

Exclude temporary buffers and the standard engine's own insertion points. A checked parent may legitimately use RunWithoutCheck; do not replace it without inspecting that parent. This rule owns G/L Entry, Cust. Ledger Entry, Vendor Ledger Entry, their detailed customer/vendor entries, VAT Entry, and financial-posting/register records, not a custom table merely named Ledger Entry or a supported, specifically reviewed migration/repair workflow.

Item Ledger Entry, Value Entry, Capacity/Warehouse entries, Item Application Entry, and other inventory-posting records are SCM concerns, not this rule's financial-ledger scope. That exclusion includes the financial-row leg of a single inventory-posting bypass when restoring the inventory workflow corrects the whole operation. Distinct, independently actionable financial defects remain in scope.

See sample: post-ledger-entries-through-posting-codeunits.good.al.

Anti Pattern

Create posted financial effects by directly inserting the Finance-owned records named above outside their owning posting workflow. Resolve the actual record type, operation, and lifecycle; do not match *Ledger Entry as a wildcard. Balanced debit/credit values, copied dimensions, Insert(true), and a lock around entry-number allocation do not turn raw inserts into a complete posting.

See sample: post-ledger-entries-through-posting-codeunits.bad.al.

References