---
id: release/al-15.2
type: release
title: AL Language extension 15.2
summary: "AL Language extension 15.2 for Business Central 2025 release wave 1 (BC26): released 2025-07-11; 7 changelog entries, 1 GitHub issue linked."
tier: official
language: en
system: development
tags:
  - allow deprecating external business events
  - example code
  - remarks
  - implicit conversion between record and recordref
  - appsourcecop
  - github issues
  - miscellaneous
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-09T15:15:16.906Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: d4878432d7c2c418ab7cec3f675c29fef20266890a4f3c44f527959ce4bd614e
evidence:
  - kind: marketplace
    url: https://marketplace.visualstudio.com/items/ms-dynamics-smb.al/changelog
    title: AL Language extension changelog, version 15.2
    date: "2025-07-11"
    commit: null
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
source_id: al-language-extension
extension: ms-dynamics-smb.al
version: "15.2"
wave: 2025 release wave 1
major: "26"
preview_at: null
released_at: "2025-07-11"
published_at: "2025-07-11"
prerelease: false
entry_count: 7
issues:
  - 7790
changes: []
---

# AL Language extension 15.2

> AL Language extension 15.2 for Business Central 2025 release wave 1 (BC26): released 2025-07-11; 7 changelog entries, 1 GitHub issue linked.

[Changelog on the Visual Studio Marketplace](https://marketplace.visualstudio.com/items/ms-dynamics-smb.al/changelog) · Business Central 2025 release wave 1 · BC26

## Allow deprecating external business events

We have added support for deprecating `ExternalBusinessEvent` type events.

The process follows the standard obsoletion steps for procedures with one additional requirement:

Step 1: Mark the event as obsolete pending
 - Decorate the procedure with the `[Obsolete('<Reason>','<Tag>')]` attribute.
 - Prefix the `DisplayName` of the `ExternalBusinessEvent` attribute with an `[OBSOLETE]` marker.

Step 2: Remove the obsolete pending event in an upcoming version

### Example code

```AL
codeunit 10 MyCodeunit
{
    [ExternalBusinessEvent('MyEvent', '[OBSOLETE] MyEventDisplayName', 'Description', EventCategory::MyValue, '1.0')]
    [Obsolete('The event will be replaced by version 2.0 of MyEvent', '27.0')]
    procedure MyEvent()
    begin
    end;

    [ExternalBusinessEvent('MyEvent', 'MyEventDisplayName', 'Description', EventCategory::MyValue, '2.0')]
    procedure MyEvent2()
    begin
    end;
}
```

### Remarks

It is also possible to obsolete the containing object without deprecating the external business event itself. This is because external business events are identified by their (app ID - event name - event version) triplet from the external subscriber's perspective, independent of their containing object or procedure within AL.
In such scenarios, you must relocate the event within the same app while following the standard obsoletion process for the original containing object.

## Implicit conversion between Record and RecordRef

We have introduced support for implicit conversion between `Record` and `RecordRef` instances, allowing direct assignment between these types.

```AL
codeunit 10 RecordAndRecordRefConversion
{

    procedure RecordToRecordRef()
    var
        Customer: Record Customer;
        RecRef: RecordRef;
    begin
        RecRef := Customer;      // Similar to RecRef.GetTable(Customer);
        ProcessRecord(Customer); // Argument conversion
    end;

    procedure RecordRefToRecord()
    var
        Customer: Record Customer;
        RecRef: RecordRef;
    begin
        Customer := RecRef;      // Similar to RecRef.SetTable(Customer); This will cause an error if the table is different
        ProcessCustomer(RecRef); // Argument conversion.
    end;

    procedure ProcessCustomer(r: record Customer)
    begin
        Message('Process Customer');
    end;

    procedure ProcessRecord(rr: RecordRef)
    var
        Customer: record Customer;
    begin
        case rr.Number of
            Database::Customer:
                Message('Process Customer');
            else
                Error('Unable to process record');
        end;
    end;
}
```

## AppSourceCop

- Updated rule [AS0018](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/analyzers/appsourcecop-as0106) to allow removing or renaming events in extension objects when the event name conflicts with the name of the events defined in the target object.
- Updated rules [AS0034](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/analyzers/appsourcecop-as0034) and [AS0039](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/analyzers/appsourcecop-as0039) to allow modifying the [InherentEntitlments](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/properties/devenv-inherententitlements-property) on tables.
- Updated rule [AS0106](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/analyzers/appsourcecop-as0106) to allow removing protected global variables conflicting with built-in members. For instance, variables named `Language` on reports which conflict with the built-in [Language](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/methods-auto/report/reportinstance-language-method) method.
- Updated rule [AS0034](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/analyzers/appsourcecop-as0034) to be more strict about the `Compressed` property, because changing it could lead to extensions not being able to update. Now it will be an error to change the property from `true` to `false` and vice versa. The default value is `true`, so adding the property with `false` will similarly be considered a breaking change.
- Adding new AppSourceCop configuration settings enabling validation of breaking changes on objects which are Obsolete, marked with OnPrem, or marked with Internal accessibility. By default, these objects are not validated by AppSourceCop nor by the AppSource technical validation process. For more info, see [AppSourceCop Configuration](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/analyzers/appsourcecop#configuration).
- New rule [AS0134](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/analyzers/appsourcecop-as0134) to detect breaking changes of the version attribute parameter of external business events. The rule will not fail AppSource submissions as the default severity is `Warning`.
- New rule [AS0135](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/analyzers/appsourcecop-as0135) to validate that external business events are correctly obsoleted prior to removal.

## GitHub Issues

- [#7790](https://github.com/microsoft/AL/issues/7790) Support for multiple extensions to same target introduces the translations bug

## Miscellaneous

- Introduced a new Warning Error that is thrown when a field from a table extension is referenced from a key in another table extension, which extends the same base table. This will become an error from Business Central 2026 Wave 2.  Learn more about the limitation described in our [docs](https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/devenv-table-keys#keys-in-table-extension-objects).
- Fixed issues with .ToText formatting on `Decimal`, `Boolean`, `Byte`, and `Guid` data types. Added text methods to the `TextConstant` data type and removed static methods on the `Label` type.
- When authenticating using Entra ID, interactive login is now the default. This uses MSAL (Microsoft Authentication Library) and opens authentication in the system's default browser, which means it does not respect the AL extension settings for browser selection or incognito mode during the interactive authentication flow. You can go back to device authentication by setting `"useInteractiveLogin" : false`.
- Updated the maximum allowed CSV length to 2048 to resolve import errors in the Bank Reconciliation Journal via Data Exchange Definition.

Source: Visual Studio Marketplace, ms-dynamics-smb.al changelog, Microsoft's text unchanged. Dates from the gallery's upload records.
