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.
- BC30Business Central
- 2026-10-01preview
- 10entries
- 23issues
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 = Markdownfor page fields bound to aTextvariable,Texttable field, orText-returning procedure, including boundedText. RequiresMultiLine = trueand an only-child field in a root-level group in the Content area. The value remains raw Markdown; direct table-field declarations andBigText,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_publishandal_debugagent 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_publishhanging after successfully publishing a full dependency tree. - #8273 Fixed
al_downloadsymbolsignoringprojectPathin multi-project workspaces. - #8297 Fixed authentication becoming unrecoverable when Windows Hello or a Windows profile change invalidates the credentials cache.
- #8291 Fixed
altool IsSymbolOnlyandaltool IsRuntimePackageso successfulFalseresults return exit code 0 instead of a failure code. - #8325 Fixed
al_compile,al_build, andal_getdiagnosticsreturning stale results after a loaded dependency project changed. - #8326 Fixed
al workspace compilefailing withCould not locate alc compiler.on macOS and Linux. The architecture-neutral tools package only contains thealcexecutable of the platform that built it, so no compiler executable exists on macOS and Linux. Each project is now compiled through the tool’s owncompilecommand, which hosts the same compiler, when noalcexecutable is present. - #8330 Fixed AL0192 being reported when
Cookie.Name(Text)orCookie.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
OnInitandOnOpenPagenot being hit. - #8337 Added the
doccommand to theal.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
casestatement evaluates aFieldRef.Valueexpression. - #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 componentpackaging 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
CaptionMLhas 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/symbolSearchendpoint now waits briefly for initialization and otherwise returns guidance to retry after workspace loading completes. - Fixed the BCal CLI
/resetcommand remaining unavailable in remote MCP sessions after the server advertised workspace reset support. - Word report layouts containing
INCLUDETEXTorINCLUDEPICTUREfield codes now produce a compiler warning. al_symbolsearchnow finds top-level application objects by exact numeric object ID, including objects from dependency symbols.- Fixed
al_symbolsearchretaining 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.legacyFormattingtotrueto 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 --forcestill reports a locked cache-replacement failure instead of retrying. - Fixed an issue where semantic token processing could crash when a preprocessor
#ifor#elifcondition 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
SubtypeandTestHandlersproperties from test codeunits.
ALTool changes
- Added
altool downloadsymbolsto download the symbol packages required by an AL project from a Business Central server or global NuGet sources. Use--projectto select the project (the current directory is used by default),--packagecachepathto select the destination cache, and--forceto refresh cached packages.--globalsourcesonlydownloads without a server and supports country/region, custom-feed, custom-feeds-only, and minor-version options. Server downloads use the same connection options as otheraltoolcommands. The command emits structured JSON by default for pipeline use; pass--rawfor 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.alpackagesand downloads only on a cache miss, preserving the downloaded package for later calls. Use--projectfor launch settings and the default cache location,--packagecachepathfor another cache, or--forceto download fresh symbols.altool listtests --appfile <path>inspects an existing.appfile entirely offline. Successful stdout contains compact JSON withappId,appName,appPublisher,appVersion, andcodeunitscontainingid,name,namespace, andmethods(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.