---
id: object/table/9650
type: object
title: Table 9650 "Custom Report Layout"
summary: Table 9650 "Custom Report Layout" in Base Application (Microsoft.Foundation.Reporting). 14 fields, 33 public procedures, 11 events. Present since at least BC23, still in BC30, changed in BC24-25, BC28-29.
tier: official
language: en
tags:
  - table
  - base application
versions:
  introduced: null
  last_changed: "29"
  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: bcd8c340e781860815ed0e9ec8f9a1ee833463e87f9e31961905aaef4b539386
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Foundation/Reporting/CustomReportLayout.Table.al
    title: src/Layers/W1/BaseApp/Foundation/Reporting/CustomReportLayout.Table.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn:
    - https://learn.microsoft.com/dynamics365/business-central/ui-define-customer-vendor-document-layouts
    - https://learn.microsoft.com/dynamics365/business-central/ui-excel-report-layouts
    - https://learn.microsoft.com/dynamics365/business-central/ui-get-started-layouts
    - https://learn.microsoft.com/dynamics365/business-central/ui-how-change-layout-currently-used-report
    - https://learn.microsoft.com/dynamics365/business-central/ui-how-create-custom-report-layout
    - https://learn.microsoft.com/dynamics365/business-central/ui-how-import-and-export-report-layout
    - https://learn.microsoft.com/dynamics365/business-central/ui-manage-report-layouts
    - https://learn.microsoft.com/dynamics365/business-central/ui-rdlc-report-layouts
    - https://learn.microsoft.com/dynamics365/business-central/ui-set-report-layout
    - https://learn.microsoft.com/dynamics365/business-central/ui-update-report-layouts
  objects: []
  features: []
  topics:
    - topic/business-central/analytics-business-intelligence-and-repo/develop-reports/develop-report-layouts
    - topic/business-central/analytics-business-intelligence-and-repo/use-reports-in-daily-work
    - topic/business-central/get-started/get-productive-in-business-central/change-the-look-of-externally-facing-doc
    - topic/business-central/get-started/get-productive-in-business-central/change-the-look-of-externally-facing-doc/use-obsolete-features
    - topic/business-central/integrate-with-other-applications/microsoft-office-apps-and-microsoft-365/microsoft-excel
    - topic/dev-itpro/development/data-analytics-and-reporting
    - topic/dev-itpro/development/programming-in-the-al-language/developing-reports/report-layouts
    - topic/dev-itpro/integration/integrating-business-central-with-office/integrating-with-microsoft-excel
  localizations: []
  videos: []
  posts: []
  guidelines: []
object_type: table
object_id: 9650
name: Custom Report Layout
namespace: Microsoft.Foundation.Reporting
app: Base Application
extends: null
first_version: "23"
last_version: "30"
present_in:
  - "23"
  - "24"
  - "25"
  - "26"
  - "27"
  - "28"
  - "29"
  - "30"
changed_in:
  - "24"
  - "25"
  - "28"
  - "29"
source_major: "29"
obsolete: null
countries: []
ms_search_form_ids: []
counts:
  fields: 14
  procedures: 61
  events: 11
  subscribers: 0
relations:
  out: 2
  referenced_by: 11
  pages: 2
  extended_by: 0
  event_subscribers: 0
  calls: 3
  called_by: 0
  implements: 0
---

# Table 9650 "Custom Report Layout"

> Table 9650 "Custom Report Layout" in Base Application (Microsoft.Foundation.Reporting). 14 fields, 33 public procedures, 11 events. Present since at least BC23, still in BC30, changed in BC24-25, BC28-29.

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

Learn documents this table through its pages: [Page 9650 "Custom Report Layouts"](../page/9650.md) (10 Learn pages).

## Properties

| Property | Value |
|---|---|
| Caption | Custom Report Layout |
| DataClassification | CustomerContent |
| Permissions | TableData "Custom Report Layout" = rimd |

## Fields

Explanation: the field's ToolTip in the code; without one, the ToolTip of a page control bound to the field (marked via the page); without that, its Caption (marked caption) when that differs from the name.

| No. | Name | Type | Explanation | Notes |
|---|---|---|---|---|
| 1 | Code | Code[20] | Specifies the Code. |  |
| 2 | Report ID | Integer | Specifies the object ID of the report. | TableRelation AllObjWithCaption."Object ID" where("Object Type" = const(Report)) |
| 3 | Report Name | Text[250] | Specifies the name of the report. | FlowField: lookup(AllObjWithCaption."Object Caption" where("Object Type" = const(Report), "Object ID" = field("Report ID"))); not editable |
| 4 | Company Name | Text[30] | Specifies the Business Central company that the report layout applies to. You to create report layouts that can only be used on reports when they are run for a specific to a company. If the field is blank, then the layout will be available for use in all companies. | TableRelation Company |
| 6 | Type | Enum "Custom Report Layout Type" | Specifies the file type of the report layout. The following table includes the types that are available: | enum [Enum 9656 "Custom Report Layout Type"](../enum/9656.md) |
| 7 | Layout | BLOB | — |  |
| 8 | Last Modified | DateTime | Specifies the date and time of the last change to the report layout entry. | not editable |
| 9 | Last Modified by User | Code[50] | Specifies the user who made the last change to the report layout entry. | TableRelation User."User Name"; not editable; DataClassification EndUserIdentifiableInformation |
| 10 | File Extension | Text[30] | — | not editable |
| 11 | Description | Text[250] | Specifies a description of the report layout. |  |
| 12 | Custom XML Part | BLOB | — |  |
| 13 | App ID | Guid | — | not editable |
| 14 | Built-In | Boolean | Specifies if the report layout is built-in or not. | not editable |
| 15 | Layout Last Updated | DateTime | Layout Last Modified <small>caption</small> | not editable |

## Keys

- Key1: Code (clustered)
- Key2: Report ID, Company Name, Type

## Events published

- `OnBeforeCanBeModified(var CustomReportLayout: Record "Custom Report Layout"; var IsHandled: Boolean)` (integration)
- `OnBeforeUpdateLayout(var LayoutUpdated: Boolean; var IsHandled: Boolean)` (integration)
- `OnBeforeExportReportLayout(CustomReportLayout: Record "Custom Report Layout"; var DefaultFileName: Text; ShowFileDialog: Boolean)` (integration)
- `OnBeforeExportSchema(CustomReportLayout: Record "Custom Report Layout"; var DefaultFileName: Text; ShowFileDialog: Boolean; var IsHandled: Boolean)` (integration)
- `OnCopyRecordOnBeforeInsertLayout(var ToCustomReportLayout: Record "Custom Report Layout"; FromCustomReportLayout: Record "Custom Report Layout")` (integration)
- `OnGetNonBuiltInLayout(CustomReportLayout: Record "Custom Report Layout"; var InStream: InStream)` (integration)
- `OnGetFileExtension(CustomReportLayout: Record "Custom Report Layout"; var FileExt: Text[4])` (integration)
- `OnImportLayoutBlob(CustomReportLayout: Record "Custom Report Layout"; var TempBlob: Codeunit "Temp Blob"; FileExtension: Text[30]; XmlPart: Text; DocumentOutStream: OutStream)` (integration)
- `OnImportLayoutSetFileFilter(CustomReportLayout: Record "Custom Report Layout"; var FileFilterTxt: Text)` (integration)
- `OnInitBuiltInLayout(var CustomReportLayout: Record "Custom Report Layout"; ReportID: Integer; LayoutType: Option)` (integration)
- `OnLookupLayoutOKOnBeforePageRun(var CustomReportLayout: Record "Custom Report Layout")` (integration, obsolete 28.0)

## Procedures

- `InitBuiltInLayout(ReportID: Integer; LayoutType: Option): Code[20]`
- `CopyBuiltInReportLayout()`
- `CopyReportLayout(): Code[20]`
- `ImportReportLayout(DefaultFileName: Text)`
- `ImportLayoutBlob(var TempBlob: Codeunit "Temp Blob"; FileExtension: Text[30])`
- `ExportReportLayout(DefaultFileName: Text; ShowFileDialog: Boolean): Text`
- `ValidateLayout(useConfirm: Boolean; UpdateContext: Boolean): Boolean`
- `UpdateReportLayout(ContinueOnError: Boolean; IgnoreDelete: Boolean): Boolean`
- `TryUpdateLayout(IgnoreDelete: Boolean): Text`
- `ExportSchema(DefaultFileName: Text; ShowFileDialog: Boolean): Text`
- `GetFileExtension(): Text[4]`
- `GetWordXmlPart(ReportID: Integer): Text`
- `RunCustomReport()`
- `ApplyUpgrade(var ReportUpgrade: DotNet ReportUpgradeSet; var ReportChangeLogCollection: DotNet IReportChangeLogCollection; testOnly: Boolean)`
- `LookupLayoutOK(ReportID: Integer): Boolean` (obsolete 28.0: This procedure is obsolete because the lookup page 9650 Custom Report Layouts is obsoleted.)
- `GetDefaultCode(ReportID: Integer): Code[20]`
- `CanBeModified(): Boolean`
- `NewExtensionLayout(ExtensionAppId: Guid; LayoutDataTable: DotNet DataTable)`
- `HasLayout(): Boolean`
- `HasCustomXmlPart(): Boolean`
- `GetLayout(): Text`
- `GetCustomXmlPart(): Text`
- `GetLayoutBlob(var TempBlob: Codeunit "Temp Blob")`
- `ClearLayout()`
- `ClearCustomXmlPart()`
- `CanModify(): Boolean`
- `TestLayout()`
- `TestCustomXmlPart()`
- `SetLayout(Content: Text)`
- `SetCustomXmlPart(Content: Text)`
- `SetDefaultCustomXmlPart()`
- `SetLayoutBlob(var TempBlob: Codeunit "Temp Blob")`
- `SetLayoutLastUpdated()` (internal)

Plus 17 local procedures.

## Triggers

OnDelete, OnInsert, OnModify

## Relations

- drill-down page [Page 9650 "Custom Report Layouts"](../page/9650.md)
- lookup page [Page 9650 "Custom Report Layouts"](../page/9650.md)

## Referenced by

11 fields in 4 objects relate to this table (TableRelation or CalcFormula).

- [Table 9657 "Custom Report Selection"](../table/9657.md): Custom Report Description, Email Body Layout Description, Custom Report Layout Code, Email Body Layout Code
- [Table 77 "Report Selections"](../table/77.md): Email Body Layout Description, Custom Report Layout Code, Email Body Layout Code
- [Table 5103 "Interaction Tmpl. Language"](../table/5103.md): Custom Layout Description, Custom Layout Code
- [Table 9651 "Report Layout Selection"](../table/9651.md): Report Layout Description, Custom Report Layout Code

## Pages and codeunits on this table

- [Page 9650 "Custom Report Layouts"](../page/9650.md) (source table)
- [Page 9653 "Report Layouts Part"](../page/9653.md) (source table)

## 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 4100 "Temp Blob"](../codeunit/4100.md) (20 calls: `ApplyUpgrade → CreateInStream`, `ApplyUpgrade → CreateOutStream`, `ApplyUpgrade → HasValue`, …)
- [Codeunit 9651 "Document Report Mgt."](../codeunit/9651.md) (7 calls: `ImportLayoutBlob → TryUpdateRdlcLayout`, `ImportLayoutBlob → TryUpdateWordLayout`, `ImportLayoutBlob → ValidateWordLayout`, …)
- [Codeunit 419 "File Management"](../codeunit/419.md) (4 calls: `ExportReportLayout → BLOBExport`, `ExportSchema → BLOBExport`, `ImportReportLayout → BLOBImportWithFilter`, …)

## Across versions

- Present in: BC23-30
- Changed (declaration) in: BC24-25, BC28-29

## Deprecations

- procedure FilterOnReport: guarded (#if not CLEAN28)
- procedure LookupLayoutOK: Pending 28.0 (#if not CLEAN28), "This procedure is obsolete because the lookup page 9650 Custom Report Layouts is obsoleted."
- procedure OnLookupLayoutOKOnBeforePageRun: Pending 28.0 (#if not CLEAN28), "This procedure is obsolete because the procedure LookupLayoutOK is obsoleted."

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: "table", object_name: "Custom Report Layout")`, then `bcatlas_get_procedure_body` or `bcatlas_get_neighbors` on the returned id.
