Form extensions in Dynamics 365 Finance and Operations

How to extend forms in F&O — extending standard forms, adding controls and groups, handling events, and avoiding common form-extension pitfalls.

Updated 2026-09-18

Forms in F&O are the visible surfaces of the application — pages users interact with. Adding a field to a vendor card, a new button to a sales order, custom logic on field changes — all of these are done through form extensions. They're a core extensibility mechanism; mastering them is essential for productive F&O development.

The extension model. F&O doesn't allow modifying the standard form directly. Instead:

  • Create a Form Extension object in your model.
  • Reference the standard form being extended.
  • Add controls, change properties, add event handlers.
  • At runtime, F&O renders the standard form plus the extension's contributions.

This enables Microsoft to update the standard form without breaking your additions.

What you can extend.

  • Add new controls — fields, buttons, groups, tabs.
  • Move controls within the layout (with limitations).
  • Change properties of existing controls (caption, visibility).
  • Add event handlers — pre/post on form methods.
  • Add data sources — additional tables joined.
  • Add menu items to the form's command bar.

What you cannot do.

  • Delete standard controls. Hide via Visible = No; cannot remove.
  • Reorder major sections freely; some constraints.
  • Override standard methods completely — you can extend via Chain of Command but not replace.

The constraints maintain forward compatibility.

Adding a field.

  1. Create form extension for the form.
  2. Add an Extension control of type Field.
  3. Bind to a data source field (either standard or your custom table extension).
  4. Position via the design surface.

The extension's controls are visually merged with the standard form at runtime.

Adding a tab page. Common pattern:

  • Add a Tab control.
  • Add TabPage for new tab.
  • Inside, group controls relevant to the new functionality.

Place tabs in a logical position — typically after standard tabs.

Adding a button.

  • Add a Button control.
  • Bind to a menu item action (which targets a class with main method).
  • Set position, caption, image.

The button's click invokes the menu item; the menu item invokes a class method.

Event handlers in form extensions. When you need code triggered by form events:

class MyFormEventHandler
{
    [FormDataSourceEventHandler(formDataSourceStr(CustTable, CustTable), FormDataSourceEventType::Written)]
    public static void CustTable_OnWritten(FormDataSource sender, FormDataSourceEventArgs e)
    {
        // logic when CustTable is written
    }
}

Decorators specify the form, data source, and event. Methods are static.

Common form events.

  • OnInit / OnInitializing — form startup.
  • OnActivated — when form becomes active.
  • OnClosing — closing.
  • OnFieldModified — field changed.
  • OnDataSourceWritten — record saved.
  • OnClicked — control clicked.

Each has specific signature and use case.

Chain of Command on form controls. For overriding behaviour:

[ExtensionOf(formStr(CustTable))]
final class CustTable_Extension
{
    public void clicked()
    {
        // pre-logic
        next clicked();
        // post-logic
    }
}

next clicked() invokes the original method; logic wraps it.

Data source extensions. Add a new table to the form's data sources:

  • Link to existing data source via join.
  • New table accessible from form context.
  • New controls bind to the new data source.

Useful when standard form's data set is insufficient.

Visibility and enablement. Often more useful than adding new controls:

  • Hide a button users shouldn't use.
  • Disable based on record state.
  • Show / hide tabs based on permissions.

These small UX changes can significantly improve user experience.

Form patterns. F&O has standard form patterns:

  • List page — grid with filters.
  • Details master — single record with sections and tabs.
  • Transaction details — header + lines.
  • Workspace — KPI-driven landing page.

Extending forms requires understanding the pattern; e.g., adding a tab to a list page works differently than to a details form.

Form personalisation vs extension.

  • Personalisation — per-user; users adjust their views.
  • Extension — per-tenant code; everyone sees.

Don't use extensions for things users could personalise; reserve for true customisation needs.

Performance considerations.

  • Heavy event handlers slow form opening.
  • Cross-table queries in handlers — careful.
  • Lazy load patterns — show data only when tab is opened.

Common pitfalls.

  • Overcomplicated extensions. Many extensions stacking; form behaviour unpredictable.
  • Hidden controls. Setting Visible=No without context; users confused.
  • Event handler not firing. Wrong event signature; debugging confused.
  • Conflicting extensions. Two extensions modify same control; last one wins (sometimes).
  • No labels. Custom controls without labels; non-accessible.
  • Permission gaps. New controls visible to users who shouldn't see them; security review.

Testing. Form extensions should be tested:

  • Open form in each role.
  • Verify visibility / enablement.
  • Test event handlers.
  • Performance on opening.

Manual testing essential; automated UI testing is heavier in F&O.

Best practices.

  • One extension per functional area — don't stuff everything in one extension.
  • Document the extension — what it adds, why.
  • Clear namingCustTable_Extension_LoyaltyFields vs cryptic.
  • Version per release — tied to your codebase versioning.

Strategic positioning. Form extensions are how F&O is tailored to specific business needs. They're a core developer skill. Mastery includes understanding the extension model, the event system, the form patterns, and the maintenance discipline. Over a project's lifetime, accumulated form extensions become significant code; treating them with the same engineering rigour as any production code — review, testing, documentation — keeps the customisation maintainable. Without discipline, accumulated extensions become a tangle no one wants to touch.

Related guides