AL extension release · 30.0 · pre-releaseAL Developmentofficial - Microsoftderived - from the source, no model text

AL Language extension 30.0

AL Language extension 30.0 for Business Central 2027 release wave 1 (BC30): previewed 2026-10-01, no stable release yet; 10 changelog entries, 23 GitHub issues linked.

Changelog on the Visual Studio Marketplace · Business Central 2027 release wave 1 · BC30

What changed on this page

  • 2026-10-11: added “Parallel workspace compilation”
  • 2026-10-11: added “Modify several fields in one ModifyAll call”
  • 2026-10-11: added “Inherent permissions validation in multi-root workspaces”
  • 2026-10-11: added “ALTool code coverage export”
  • 2026-10-11: added “ALTool changes”
  • 2026-10-11: added “Visual Studio Code Editor changes”
  • 2026-10-11: added “Miscellaneous”
  • 2026-10-11: changed “GitHub issues”
  • 2026-10-11: changed “Bug fixes”
  • 2026-10-11: removed “snapshot-debugging-al-tests”

Parallel workspace compilation

  • Fixed package-cache lock conflicts being reported as invalid-package errors during parallel workspace compilation on Linux and macOS. They are now reported as the existing package-locked warning.

Markdown page fields

  • Added ExtendedDatatype = Markdown for page fields bound to a Text variable, Text table field, or Text-returning procedure, including bounded Text. Requires MultiLine = true and an only-child field in a root-level group in the Content area. The value remains raw Markdown; direct table-field declarations and BigText, Code, Label, TextConst, string literals, and concatenation sources are not supported.

Modify several fields in one ModifyAll call

ModifyAll now accepts up to five field and value pairs on both Record and RecordRef, so a bulk update of several fields no longer needs one call per field. RunTrigger stays optional and last:

Customer.ModifyAll(Blocked, Blocked::All, "Payment Terms Code", 'CM', true);
RecRef.ModifyAll(AmountFieldNo, 0, DescriptionFieldNo, 'Cleared');

RecordRef.ModifyAll is new and requires runtime version 30.0 for every call, including a single pair. Record.ModifyAll keeps its existing single-pair form unchanged; only its new multi-pair forms require runtime version 30.0.

Inherent permissions validation in multi-root workspaces

The compiler now reports AL0720 when an InherentPermissions attribute in one project references an object from another project in a multi-root workspace.

GitHub issues

  • #8134 Fixed code actions blocking other language server messages, which could prevent saving AL files.
  • #8130 Fixed Copy & Open not opening the browser during device login when downloading symbols.
  • #8129 Fixed publishing an extension while an attach session is waiting, allowing breakpoints in install and upgrade codeunits to be hit again.
  • #8274 Added named launch configuration selection to the al_publish and al_debug agent tools so publishing and debugging can run without an interactive configuration prompt.
  • #8244 Added separate test profiles for debugging with or without publishing the app, allowing tests in apps deployed in global or per-tenant scope to be debugged.
  • #8280 Fixed al_publish hanging after successfully publishing a full dependency tree.
  • #8273 Fixed al_downloadsymbols ignoring projectPath in multi-project workspaces.
  • #8297 Fixed authentication becoming unrecoverable when Windows Hello or a Windows profile change invalidates the credentials cache.
  • #8291 Fixed altool IsSymbolOnly and altool IsRuntimePackage so successful False results return exit code 0 instead of a failure code.
  • #8325 Fixed al_compile, al_build, and al_getdiagnostics returning stale results after a loaded dependency project changed.
  • #8326 Fixed al workspace compile failing with Could not locate alc compiler. on macOS and Linux. The architecture-neutral tools package only contains the alc executable of the platform that built it, so no compiler executable exists on macOS and Linux. Each project is now compiled through the tool’s own compile command, which hosts the same compiler, when no alc executable is present.
  • #8330 Fixed AL0192 being reported when Cookie.Name(Text) or Cookie.Value(Text) is used as a setter statement.
  • #8331 Fixed Go to Definition failing when no AL project is active.
  • #8171 Fixed breakpoints in report request page triggers such as OnInit and OnOpenPage not being hit.
  • #8337 Added the doc command to the al .NET tool and included the standalone AL Table Proxy Generator in the Windows development tools dependency package.
  • #8001 Fixed Excel report layouts changing on every project build. A dataitem name that Excel cannot use verbatim as a sheet name (longer than 31 characters or containing @ : / \ * ? [ ]) made each build add its data sheet again and rewrite the layout file, so the file kept showing up as modified in source control. Writing an updated multi-sheet layout also failed with AL0445 (“The file is opened in another application”) even when no other application had the file open.
  • #8034 Fixed an invalid compile error in workspaces mixing source projects and package dependencies: when a project was opened as a live in-set project reference and another package depended on that same project, the package’s own dependency on it failed to resolve, producing a spurious “cannot convert” diagnostic at any call site that passed a value of that project’s type into the package’s API.
  • #7891 Fixed the language server retaining stale contents for closed AL files changed outside Visual Studio Code, such as after switching branches. Watched-file change notifications now reload the file and refresh changed project configuration.
  • #7832 Fixed a compiler crash when a case statement evaluates a FieldRef.Value expression.
  • #8194 Fixed the server-backed symbol download flow only considering the active project in a multi-root workspace. Both AL: Download symbols and the automatic pre-build symbol check now account for referenced projects, downloading their external dependencies into their own package caches so AL: Publish full dependency tree for active project no longer fails with AL1022 for a package that was never downloaded.
  • #8267 Fixed Specified part does not exist in the package / Part URI cannot contain a Fragment component packaging error when a source, report, or Word layout file name contains (, ), ', #, or ?.
  • #8284 Fixed test runs hanging after a compilation or publish failure. The test runner now completes both the test run and the pending language-server request when the run cannot start.
  • #8290 Fixed AL Explorer source views omitting object details such as codeunit procedures and table methods. Also fixed the “Source” preview crashing (and omitting the rest of the decompiled object) when a multi-language property such as CaptionML has a translation that contains a semicolon.

ALTool code coverage export

altool runtests can now export code coverage in BC JSON and Cobertura XML formats. Coverage can include per-line hit data and per-test procedure lookup, with optional AL source enrichment for uncovered lines and procedures.

Bug fixes

  • Fixed AL0327 missing-file errors when compiling control add-ins with Windows-style resource paths on Linux or macOS. Script, stylesheet, and image paths now accept either directory separator during lookup and packaging.
  • Fixed agentic AL LSP symbol searches returning an unexplained failure when requested while the workspace was still loading. The al/symbolSearch endpoint now waits briefly for initialization and otherwise returns guidance to retry after workspace loading completes.
  • Fixed the BCal CLI /reset command remaining unavailable in remote MCP sessions after the server advertised workspace reset support.
  • Word report layouts containing INCLUDETEXT or INCLUDEPICTURE field codes now produce a compiler warning.
  • al_symbolsearch now finds top-level application objects by exact numeric object ID, including objects from dependency symbols.
  • Fixed al_symbolsearch retaining fully materialized symbol descriptors for the active project and its dependencies after searches. Searches now traverse only the requested symbol scope and return additional results through continuation tokens.
  • Fixed culture identification in extension translations, preserving distinct language variants and preventing duplicate-translation errors during publishing.
  • Improved AL source formatting in Visual Studio Code and after BCal file writes and edits. Formatting now applies CodeCop-compatible operator, block, and control-keyword layout while keeping empty blocks and blocks with a single property compact. Set al.legacyFormatting to true to restore the previous formatting behavior in Visual Studio Code; BCal always uses the improved behavior.
  • Fixed inconsistent event subscriber ordering when metadata-based event binding is enabled.
  • Fixed AS0072, AS0073, AS0074, AS0075, and AS0076 being reported for unchanged obsolete members when a new extension object with a lower object ID targets the same object as an existing extension object.
  • Fixed downloads of dependency symbols failing without retrying when another process temporarily locks the destination package. altool listtests --force still reports a locked cache-replacement failure instead of retrying.
  • Fixed an issue where semantic token processing could crash when a preprocessor #if or #elif condition appeared inside a report data item, query data item, or XMLport table element.
  • Fixed breakpoints in default interface method implementations not being hit when continuing execution with F5, including when interfaces share a name across namespaces.
  • Improved diagnostics for private NuGet symbol feeds. A feed that returns HTTP 401 now reports “requires authentication”, while HTTP 403 reports “requires authentication or additional permissions” at the failed request, and any credentials embedded in a feed URL are stripped before the URL is written to logs.
  • Fixed RoleCenter bookmarks created by Designer disappearing when their action targeted an invalid position in the Sections area. The bookmark is now placed in the default navigation location.
  • Fixed generated reference previews omitting the Subtype and TestHandlers properties from test codeunits.

ALTool changes

  • Added altool downloadsymbols to download the symbol packages required by an AL project from a Business Central server or global NuGet sources. Use --project to select the project (the current directory is used by default), --packagecachepath to select the destination cache, and --force to refresh cached packages. --globalsourcesonly downloads without a server and supports country/region, custom-feed, custom-feeds-only, and minor-version options. Server downloads use the same connection options as other altool commands. The command emits structured JSON by default for pipeline use; pass --raw for human-readable output.
  • Added altool listtests <appId> to discover an app’s test codeunits and procedures without running tests, loading a workspace, or requiring source access. It reuses the highest-version matching package in .alpackages and downloads only on a cache miss, preserving the downloaded package for later calls. Use --project for launch settings and the default cache location, --packagecachepath for another cache, or --force to download fresh symbols. altool listtests --appfile <path> inspects an existing .app file entirely offline. Successful stdout contains compact JSON with appId, appName, appPublisher, appVersion, and codeunits containing id, name, namespace, and methods (name, isDataDriven). Ordinary and data-driven procedures are included; runtime-generated cases are not enumerated. The version identifies the inspected package, not necessarily the installed server version. Logs and contextual metadata errors go to stderr; failures return nonzero instead of a partial or empty success result.

Visual Studio Code Editor changes

Miscellaneous

  • Go to implementation on a codeunit override now includes the matching default interface method alongside explicit codeunit implementations.
  • Go to definition while debugging now opens source for referenced platform and system interfaces.

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