---
id: object/codeunit/414
type: object
title: Codeunit 414 "Release Sales Document"
summary: Codeunit 414 "Release Sales Document" in Base Application (Microsoft.Sales.Document). 8 public procedures, 38 events. Present since at least BC23, still in BC30, changed in BC24, BC26.
tier: official
language: en
tags:
  - codeunit
  - base application
versions:
  introduced: null
  last_changed: "26"
  deprecated: null
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:31:51.816Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: 494b7eeda1add13c08fb9a08d8ed5e2ad2822aeb4d81950534e1e478f871a453
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Sales/Document/ReleaseSalesDocument.Codeunit.al
    title: src/Layers/W1/BaseApp/Sales/Document/ReleaseSalesDocument.Codeunit.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations:
    - localization/ru
  videos: []
  posts: []
  guidelines: []
object_type: codeunit
object_id: 414
name: Release Sales Document
namespace: Microsoft.Sales.Document
app: Base Application
extends: null
first_version: "23"
last_version: "30"
present_in:
  - "23"
  - "24"
  - "25"
  - "26"
  - "27"
  - "28"
  - "29"
  - "30"
changed_in:
  - "24"
  - "26"
source_major: "29"
obsolete: null
countries:
  - ru
ms_search_form_ids: []
counts:
  fields: 0
  procedures: 55
  events: 38
  subscribers: 0
relations:
  out: 1
  referenced_by: 0
  pages: 0
  extended_by: 0
  event_subscribers: 7
  calls: 5
  called_by: 17
  implements: 0
---

# Codeunit 414 "Release Sales Document"

> Codeunit 414 "Release Sales Document" in Base Application (Microsoft.Sales.Document). 8 public procedures, 38 events. Present since at least BC23, still in BC30, changed in BC24, BC26.

Base Application · Microsoft.Sales.Document · BC23-30 · [source at ea08af5e](https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Sales/Document/ReleaseSalesDocument.Codeunit.al) · facts from BC29

## Properties

| Property | Value |
|---|---|
| TableNo | Sales Header |
| Permissions | TableData "Sales Header" = rm, TableData "Sales Line" = r |

## Events published

- `OnBeforeCalcInvDiscount(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var LinesWereModified: Boolean; var SalesLine: Record "Sales Line"; var IsHandled: Boolean)` (integration): Raised before calculating the invoice discount for a sales document.
- `OnBeforeManualReleaseSalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean)` (integration): Raised before manually releasing a sales document.
- `OnBeforeTestSellToCustomerNo(var SalesHeader: Record "Sales Header"; var IsHandled: Boolean)` (integration): Raised before testing the Sell-to Customer No. field on the sales header.
- `OnBeforeOnRun(var SalesHeader: Record "Sales Header")` (integration): Raised before the OnRun trigger executes for the Release Sales Document codeunit.
- `OnBeforeReleaseSalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var IsHandled: Boolean; var SkipCheckReleaseRestrictions: Boolean; SkipWhseRequestOperations: Boolean)` (integration): Raised before releasing a sales document.
  - subscribers: [Codeunit 6103 "E-Document Subscribers"](../codeunit/6103.md) OnBeforeReleaseSalesDoc
- `OnAfterReleaseSalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var LinesWereModified: Boolean; SkipWhseRequestOperations: Boolean)` (integration): Raised after releasing a sales document.
  - subscribers: [Codeunit 1520 "Workflow Event Handling"](../codeunit/1520.md) RunWorkflowOnAfterReleaseSalesDoc, [Codeunit 38504 "Sales External Events"](../codeunit/38504.md) OnAfterReleaseSalesDoc, [Codeunit 5346 "CRM Sales Document Posting Mgt"](../codeunit/5346.md) CreateACRMPostOnAfterReleaseSalesDoc, [Codeunit 6103 "E-Document Subscribers"](../codeunit/6103.md) OnAfterReleaseSalesDoc
- `OnAfterManualReleaseSalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean)` (integration): Raised after manually releasing a sales document.
- `OnBeforeCheckSalesHeaderPendingApproval(var SalesHeader: Record "Sales Header"; var IsHandled: Boolean)` (integration): Raised before checking if a sales header has pending approval.
- `OnBeforeCheckSalesLines(var SalesHeader: Record "Sales Header"; var SalesLine: Record "Sales Line"; var IsHandled: Boolean; var LinesWereModified: Boolean)` (integration): Raised before checking sales lines during document release.
- `OnBeforeManualReOpenSalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean)` (integration): Raised before manually reopening a sales document.
- `OnBeforeReopenSalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var IsHandled: Boolean; SkipWhseRequestOperations: Boolean)` (integration): Raised before reopening a sales document.
- `OnBeforeModifySalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var IsHandled: Boolean)` (integration): Raised before modifying the sales document during the release process.
- `OnBeforePerformManualRelease(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var IsHandled: Boolean)` (integration): Raised before performing the manual release of a sales document.
- `OnBeforePerformManualReleaseProcedure(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var IsHandled: Boolean)` (integration): Raised before the PerformManualRelease procedure executes.
- `OnBeforeSalesLineFind(var SalesLine: Record "Sales Line"; var SalesHeader: Record "Sales Header"; var LinesWereModified: Boolean; var IsHandled: Boolean)` (integration): Raised before finding sales lines during document release validation.
  - subscribers: [Codeunit 8063 "Sales Documents"](../codeunit/8063.md) SkipQuantityCheckForSubscriptionBillingOnBeforeSalesLineFind
- `OnAfterReopenSalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; SkipWhseRequestOperations: Boolean)` (integration): Raised after reopening a sales document.
- `OnAfterManualReOpenSalesDoc(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean)` (integration): Raised after manually reopening a sales document.
- `OnAfterPerformManualCheckAndRelease(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean)` (integration): Raised after performing the manual check and release of a sales document.
- `OnAfterReleaseATOs(var SalesHeader: Record "Sales Header"; var SalesLine: Record "Sales Line"; PreviewMode: Boolean)` (integration): Raised after releasing assemble-to-order documents for the sales document.
- `OnAfterUpdateSalesDocLines(var SalesHeader: Record "Sales Header"; var LinesWereModified: Boolean; PreviewMode: Boolean)` (integration): Raised after updating sales document lines during the release process.
- `OnCodeOnAfterCheck(SalesHeader: Record "Sales Header"; var SalesLine: Record "Sales Line"; var LinesWereModified: Boolean)` (integration): Raised after checking the sales document during the release process.
  - subscribers: [Codeunit 5012 "Service Declaration Mgt."](../codeunit/5012.md) OnReleaseSalesDoc
- `OnCodeOnAfterSalesLineCheck(var SalesLine: Record "Sales Line"; var SalesHeader: Record "Sales Header"; var Item: Record "Item")` (integration): Raised after checking a sales line during mandatory field validation.
- `OnCodeOnBeforeSalesLineCheck(var SalesLine: Record "Sales Line"; var IsHandled: Boolean)` (integration): Raised before checking a sales line during mandatory field validation.
- `OnCodeOnAfterCalcShouldSetStatusPrepayment(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var ShouldSetStatusPrepayment: Boolean)` (integration): Raised after calculating whether to set the status to Pending Prepayment.
- `OnCodeOnCheckTracking(SalesHeader: Record "Sales Header"; var SalesLine: Record "Sales Line")` (integration): Raised when checking item tracking during the release process.
- `OnBeforeCheckCustomerCreated(var SalesHeader: Record "Sales Header"; var IsHandled: Boolean)` (integration): Raised before checking if a customer was created from a quote.
- `OnBeforeCheckReopenStatus(SalesHeader: Record "Sales Header"; var IsHandled: Boolean)` (integration): Raised before checking the status when reopening a sales document.
- `OnBeforePerformManualCheckAndRelease(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var IsHandled: Boolean)` (integration): Raised before performing the manual check and release of a sales document.
- `OnReopenOnBeforeSalesHeaderModify(var SalesHeader: Record "Sales Header")` (integration): Raised before modifying the sales header during the reopen process.
- `OnPerformManualReleaseOnBeforeTestSalesPrepayment(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var IsHandled: Boolean)` (integration): Raised before testing for sales prepayment during manual release.
- `OnPerformManualCheckAndReleaseOnBeforeSalesHeaderModify(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean)` (integration): Raised before modifying the sales header during manual check and release.
- `OnCodeOnAfterCheckCustomerCreated(var SalesHeader: Record "Sales Header"; PreviewMode: Boolean; var IsHandled: Boolean; var LinesWereModified: Boolean)` (integration): Raised after checking if a customer was created from a quote.
- `OnCodeOnAfterModifySalesDoc(var SalesHeader: Record "Sales Header"; var LinesWereModified: Boolean)` (integration): Raised after modifying the sales document during the release process.
- `OnBeforeCheckMandatoryFields(var SalesHeader: Record "Sales Header"; var IsHandled: Boolean)` (integration): Raised before checking mandatory fields on sales lines.
- `OnCodeOnBeforeSetStatusReleased(var SalesHeader: Record "Sales Header")` (integration): Raised before setting the sales document status to Released.
- `OnBeforeReleaseATOs(var SalesHeader: Record "Sales Header"; var IsHandled: Boolean)` (integration): Raised before releasing assemble-to-order documents for the sales document.
- `OnRunOnAfterCopy(var SalesHeader: Record "Sales Header"; var SalesHeaderCopy: Record "Sales Header")` (integration): Raised after copying the sales header in the OnRun trigger.
- `OnReleaseSalesHeaderOnAfterCopySalesHeader(var SalesHeader: Record "Sales Header"; var SalesHeaderCopy: Record "Sales Header")` (integration): Raised after copying the sales header in the ReleaseSalesHeader procedure.

## Procedures

- `Reopen(var SalesHeader: Record "Sales Header")`: Reopens a released or pending prepayment sales document to allow modifications.
- `PerformManualRelease(var SalesHeader: Record "Sales Header")`: Performs a manual release of a sales document with prepayment and approval validation.
- `PerformManualCheckAndRelease(var SalesHeader: Record "Sales Header")`: Validates prepayment status and pending approval before releasing the sales document.
- `PerformManualReopen(var SalesHeader: Record "Sales Header")`: Performs a manual reopen of a sales document with approval status validation.
- `ReleaseSalesHeader(var SalesHdr: Record "Sales Header"; Preview: Boolean): Boolean`: Releases a sales header with optional preview mode for posting preview scenarios.
- `SetSkipCheckReleaseRestrictions()`: Skips checking release restrictions during the release process.
- `SetSkipWhseRequestOperations(NewSkipWhseRequestOperations: Boolean)`: Specifies whether to skip warehouse request operations during release and reopen.
- `CalcAndUpdateVATOnLines(var SalesHeader: Record "Sales Header"; var SalesLine: Record "Sales Line"): Boolean`: Calculates and updates VAT amounts on all sales lines for the document.

Plus 9 local procedures.

## Triggers

OnRun

## Relations

- runs on [Table 36 "Sales Header"](../table/36.md)

## Calls

From the extracted call graph of BC29 (graphify-al on the snapshot checkout): calls whose target is known from a declared type or an `Object::"Name"` argument. Interface dispatch and calls through events are not counted, so the list is not complete.

- [Codeunit 441 "Prepayment Mgt."](../codeunit/441.md) (3 calls: `CheckPrepaymentsForManualRelease → TestSalesPrepayment`, `Code → TestSalesPrepayment`, `PerformManualCheckAndRelease → TestSalesPayment`)
- [Codeunit 5771 "Whse.-Sales Release"](../codeunit/5771.md) (2 calls: `Code → Release`, `Reopen → Reopen`)
- [Codeunit 903 "Release Assembly Document"](../codeunit/903.md) (2 calls: `ReleaseATOs → (object)`, `ReopenATOs → Reopen`)
- [Codeunit 1535 "Approvals Mgmt."](../codeunit/1535.md) (1 call: `CheckSalesHeaderPendingApproval → IsSalesHeaderPendingApproval`)
- [Codeunit 60 "Sales-Calc. Discount"](../codeunit/60.md) (1 call: `Code → (object)`)

## Called by

- [Codeunit 5746 "Sales Whse. Post Shipment"](../codeunit/5746.md) (4 calls: `OnInitSourceDocumentHeader → (object)`, `OnInitSourceDocumentHeader → Reopen`, `OnInitSourceDocumentHeader → SetSkipCheckReleaseRestrictions`, …)
- [Codeunit 5760 "Whse.-Post Receipt"](../codeunit/5760.md) (4 calls: `InitSourceDocumentHeader → ReleaseSalesHeader`, `InitSourceDocumentHeader → Reopen`, `InitSourceDocumentHeader → SetSkipCheckReleaseRestrictions`, …)
- [Codeunit 7324 "Whse.-Activity-Post"](../codeunit/7324.md) (4 calls: `ReleaseSalesDocument → (object)`, `ReleaseSalesDocument → Reopen`, `ReleaseSalesDocument → SetSkipCheckReleaseRestrictions`, …)
- [Codeunit 90 "Purch.-Post"](../codeunit/90.md) (4 calls: `CheckAndUpdateAssocOrderPostingDate → (object)`, `CheckAndUpdateAssocOrderPostingDate → Reopen`, `CheckAndUpdateAssocOrderPostingDate → SetSkipCheckReleaseRestrictions`, …)
- [Codeunit 6620 "Copy Document Mgt."](../codeunit/6620.md) (3 calls: `CopySalesDoc → (object)`, `CopySalesDoc → Reopen`, `CopySalesDoc → SetSkipCheckReleaseRestrictions`)
- [Codeunit 1371 "Sales Batch Post Mgt."](../codeunit/1371.md) (2 calls: `PerformManualReleaseOrReopenSalesHeader → PerformManualReopen`, `ReleaseSalesHeader → (object)`)
- [Codeunit 1521 "Workflow Response Handling"](../codeunit/1521.md) (2 calls: `OpenDocument → Reopen`, `ReleaseDocument → PerformManualCheckAndRelease`)
- [Codeunit 5341 "CRM Int. Table. Subscriber"](../codeunit/5341.md) (2 calls: `ChangeValidateSalesOrderStatus → PerformManualRelease`, `ChangeValidateSalesOrderStatus → PerformManualReopen`)
- [Codeunit 4140 "Sales Manual Release"](../codeunit/4140.md) (1 call: `OnRun → PerformManualRelease`)
- [Codeunit 4141 "Sales Manual Reopen"](../codeunit/4141.md) (1 call: `OnRun → PerformManualReopen`)
- [Codeunit 427 "ICInboxOutboxMgt"](../codeunit/427.md) (1 call: `SendSalesDoc → (object)`)
- [Codeunit 441 "Prepayment Mgt."](../codeunit/441.md) (1 call: `UpdatePendingPrepaymentSales → (object)`)
- [Codeunit 5063 "ArchiveManagement"](../codeunit/5063.md) (1 call: `RestoreSalesDocument → Reopen`)
- [Codeunit 80 "Sales-Post"](../codeunit/80.md) (1 call: `ReleaseSalesDocument → ReleaseSalesHeader`)
- [Codeunit 88 "Sales Post via Job Queue"](../codeunit/88.md) (1 call: `EnqueueSalesDocWithUI → (object)`)
- [Page 402 "Sales Order Statistics"](../page/402.md) (1 call: `OnQueryClosePage → CalcAndUpdateVATOnLines`)
- [Table 37 "Sales Line"](../table/37.md) (1 call: `UpdateVATRoundingFromVATAmountLines → CalcAndUpdateVATOnLines`)

## Across versions

- Present in: BC23-30
- Changed (declaration) in: BC24, BC26

## Countries that replace it

[RU](../../localizations/ru.md)

Source: AL metadata extracted from the code (names, ids, signatures, properties); no code bodies (D10).

## Ask your agent

Procedure bodies are not stored here (D10). The call sections above are our own, per object, from the BC29 call graph. For a procedure body or the calls of one procedure, ask bc-code-atlas (external, by Stefan Maron, MIT; default corpus w1-28), which the bc-observatory plugin connects: `bcatlas_resolve_node(object_type: "codeunit", object_name: "Release Sales Document")`, then `bcatlas_get_procedure_body` or `bcatlas_get_neighbors` on the returned id.
