Версия 1.0.0 — рубежный релиз. Основой стала полностью новая система типов, наделяющая сервер знаниями о доступных типах платформы и движка OneScript, и умеющая выводить типы переменных на основании возвращаемых значений методов. Существенно расширена поддержка протокола LSP — добавлены автодополнение, подсказка по параметрам, иерархия типов и другие запросы (вплоть до возможностей LSP 3.18). Добавлен экспериментальный режим работы в качестве MCP-сервера и собран полноценный каталог возможностей в документации.
Новая система типов
Сердце релиза — заново спроектированная система типов (model, registry, inferencer, TypeService).
Это единый слой, который знает обо всех типах проекта и умеет выводить тип выражения в произвольной точке кода. На нём построены подсказка при наведении, автодополнение, подсказки по параметрам, семантическая подсветка и новые диагностики.
- Единая модель и реестр типов. Типы собираются из нескольких источников в общий реестр:
- платформенные типы 1С:Предприятие (через
bsl-context) из синтакс-помощника на вашей машине; - типы конфигурации (через
MDClasses) — менеджеры объектов, реквизиты и т.п.; - типы OneScript из синтакс-помощника OneScript 2.1, а также пользовательские OScript-классы.
- платформенные типы 1С:Предприятие (через
- Вывод типов выражений (inference). Сервер определяет тип переменной/выражения под курсором в том числе по присваиванию, по возвращаемому значению функций (включая межмодульный вывод) и по полям структур, формируемых функцией-конструктором.
- Специализация обобщенных членов. Поддерживаются сложные конструкции вида
Справочники.ИмяСправочника.ИмяМетодаВозващающегоСтруктуру().ПолеСтруктуры. На каждом этапе этой цепочки доступны и всплывающие подсказки и автодополнение. - Типизация через комментарии. Поддерживаются документирующие комментарии параметров методов, возвращаемых значений, переменных уровня модуля и локальных переменных. Ссылки
см.и функции-конструкторы корректно разрешаются в типы. - Поля структуры и колонки таблицы значений. Для структур и колонок таблиц значений ведется анализ как объявленных в документирующем комментарии колонок, так и добавленных явно в коде.
- Специализация элементов коллекций. При использовании цикла
Для Каждоговыводится тип итератора на основании описания коллекции. Итерация поМассив из ЧислоположитЧислов тип переменной-итератора. - Билингвальность. Полноценная поддержка русских и английских имён типов и членов: двуязычное отображение в подсказках при наведении, автодополнении и подсказках по параметрам; классификация смешанных имён; показ информации на «своём» языке символа (BSL/OneScript).
- Конструкторы, async и вариадик-параметры. Отдельное понятие для конструктора OScript-класса; учёт модификатора
Асинху объявлений и вызовов методов; поддержка variadic-параметров в методах (повторяемые параметры, как, например, вСтрШаблон). - Поддержка OneScript как языка первого класса. В систему типов заведены понятия Класса и Модуля OneScript, а так же понятие подключаемой "библиотеки" с анализом lib.config и "соглашения о каталогах".
- Пользовательские коллекции. Классы OneScript с аннотацией
&Обходимоерегистрируются как коллекции — выводится тип элементов при обходеДля Каждого. - Семантическая подсветка на базе системы типов. Подсветка теперь богаче и корректно различает платформенные и пользовательские переменные и методы, асинхронные и статические функции.
Поддержка фреймворка «ОСень» (Autumn)
Поверх новой системы типов добавлена поддержка DI-фреймворка «ОСень» (Autumn) для OneScript: сервер распознаёт аннотации фреймворка, индексирует желуди и точки внедрения, и выводит типы внедряемых зависимостей - благодаря чему на компонентах «ОСени» работают автодополнение, всплывающие подсказки и переходы.
- Вывод типов внедряемых зависимостей (DI). Вывод типов для аннотаций
&Пластилин, как в режиме внедрения одиночного желудя, так и при внедрении коллекций. - Аннотации компонентов и внедрения Мета-аннотации (
&Лог,&Контроллер, killjoy и др.) распознаются и выводятся в соответствующие типы. &ПсевдонимДля(AliasFor) учитывается при разрешении типов внедряемых зависимостей.- Навигация по желудям. Двунаправленный переход между объявлением желудя или завязи, и точками его внедрения: новые код-линзы и быстрые действия.
Поддержка библиотеки наследования extends (OneScript)
Поверх новой системы типов реализована поддержка библиотеки наследования extends для OneScript: сервер распознаёт её аннотации и строит модель отношений типов, на которой работают переход к реализациям и иерархия типов.
- Аннотации наследования. Распознаются
&Расширяет(extends),&Реализует(implements) и&Интерфейс(interface); по ним выстраиваются связи «супертип ↔ подтип» и «интерфейс ↔ реализация». - Переход к реализациям (
textDocument/implementation) — от метода интерфейса (&Интерфейс) ко всем одноимённым методам реализующих его классов (&Реализует). - Иерархия типов (
textDocument/prepareTypeHierarchy,typeHierarchy/supertypes,typeHierarchy/subtypes) — дерево супертипов и подтипов по&Расширяет/&Реализует, сSymbolKind.Interfaceдля интерфейсов.
Поддержка протокола LSP
Добавлен каталог возможностей в документации docs/capabilities.
Сама поддержка протокола существенно расширена — реализованы новые запросы и улучшены существующие, вплоть до возможностей LSP 3.17/3.18.
Новые обрабатываемые запросы
- Добавлена обработка запроса
textDocument/completionиcompletionItem/resolve— автодополнение кода: глобальные функции, методы и свойства объектов (с выводом типа), типы послеНовый, ключевые слова и локальные переменные; нечёткий поиск (подстрока и подпоследовательность), ранжирование черезsortText, сигнатура и тип вlabelDetails(LSP 3.17),commitCharacters, отложенная документация через resolve, размещение курсора после скобок. - Добавлена обработка запроса
textDocument/signatureHelp— подсказка по параметрам вызываемого метода с подсветкой текущего параметра и учётом клиентских возможностей (labelOffset,documentationFormat, контекст retrigger). - Добавлена обработка запроса
inlayHint/resolve— отложенное наполнение подсказки-вставки (в v0.29.0 не поддерживался). - Добавлена обработка запроса
textDocument/implementation— переход к реализациям (поддержкаLocationLink); подробности — в разделе «Поддержка библиотеки наследованияextends». - Добавлена обработка запросов
textDocument/prepareTypeHierarchy,typeHierarchy/supertypesиtypeHierarchy/subtypes— иерархия типов; подробности — в разделе «Поддержка библиотеки наследованияextends». - Добавлена обработка запроса
textDocument/linkedEditingRange— одновременное редактирование объявления локального символа и всех его вхождений без вызова переименования. - Добавлена обработка запроса
textDocument/onTypeFormatting— форматирование по мере набора (флагuseOnTypeFormatting). - Добавлена обработка запроса
textDocument/rangesFormatting— форматирование нескольких диапазонов (LSP 3.18). - Добавлена обработка запроса
textDocument/prepareRename— подготовка переименования сPrepareRenameResultи placeholder. - Объявлена поддержка нескольких рабочих пространств —
workspace/didChangeWorkspaceFolders(workspaceFolders.supportedиchangeNotifications): динамическое добавление и удаление workspace folders (см. раздел «Поддержка нескольких рабочих пространств»). - Добавлена поддержка операций над файлами
workspace/didCreateFiles,workspace/didRenameFiles,workspace/didDeleteFiles(фильтры**/*.bsl,**/*.os, каталоги) и динамическая регистрация наблюдателей за файлами (didChangeWatchedFiles) черезRelativePattern. - Явно декларируется
positionEncoding=utf-16.
Улучшения существующих запросов
textDocument/inlayHint— новые виды подсказок-вставок: имена параметров платформенных методов и конструкторов (Новый Класс()), выводимые типы переменных, значения по умолчанию пропущенных аргументов; кликабельные части подписи (LabelPart); ускорен расчёт подсказок имён параметров (устранён квадратичный обход AST).textDocument/foldingRange— сворачивание ветвейИначеЕсли/Иначеи блокаИсключение, блоков#Вставка/#Удалениерасширений, осмысленныйcollapsedText, соблюдение клиентскогоrangeLimit.textDocument/documentLink— кликабельные ссылки в комментариях -См./Seeк упомянутому методу/объекту, к известному типу, открытие http(s)-ссылок.textDocument/documentHighlight— подсветка вхождений идентификаторов с видом Read/Write,kind=Textдля парных лексем.textDocument/documentSymbol—detailс сигнатурой параметров метода.workspace/symbol— поиск символов по проекту полностью переработан:- инкрементальный индекс символов с ранжированием по релевантности; выдача больше не усекается «вслепую»;
- префиксный поиск как по началу полного имени, так и по началу любого слова: запрос
ДокнаходитПровестиДокумент(имена 1С пишутся в CamelCase, кириллица поддержана); - многословный camel-hump-поиск («тайтл-кейс-хоп») — запрос
ПрДокнаходитПровестиДокумент(Провести+Документ); совпадения «по порядку слов» ранжируются выше совпадений «вразброс»; - порядок релевантности: точное имя → префикс полного имени → многословное совпадение по порядку → префикс слова из середины имени → многословное совпадение не по порядку;
- потоковая выдача результатов (partial results,
$/progress): сначала быстрый набор из индекса, затем нижнеранжированный fuzzy-хвост (подстрока внутри слова и разбросанная подпоследовательность) досылается чанками; для клиентов без потоковой выдачи — флагworkspaceSymbol.syncFuzzySearch(по умолчанию выключен); - поиск выполняется сразу по всем зарегистрированным workspace folders (см. раздел «Поддержка нескольких рабочих пространств»);
- заполнение
containerName, отмена запроса черезCancelChecker, безопасный откат на буквальный поиск при невалидном regex.
textDocument/codeAction— поддержкаsource.fixAll(автопочинка при сохранении) и учётcontext.triggerKind.textDocument/rename—WorkspaceEditнаdocumentChangesиChangeAnnotation, валидация нового имени, защита от переименования символов-модулей.textDocument/formatting— поддержкаinsertFinalNewlineиtrimFinalNewlines.textDocument/references— учётcontext.includeDeclaration.textDocument/definition— учёт клиентской возможностиlinkSupport(LocationLink).textDocument/prepareCallHierarchy— раскрытие узла кода модуля в иерархии вызовов.textDocument/hover— показ выводимого типа переменной/выражения, признака необязательности параметра («?»), состава возвращаемых структур и признака устаревания методов из исходников.
Поддержка нескольких рабочих пространств (multi-workspace)
Сервер работает сразу с несколькими каталогами-рабочими пространствами (workspace folders) — например, когда в одном окне редактора открыто несколько конфигураций, расширений или пакетов OneScript.
- Изолированный контекст на каждое рабочее пространство. Каждая папка анализируется в собственном контексте: метаданные, символы и индексы одной папки не «протекают» в другую. К каждой папке применяется своя конфигурация — настройки и состав диагностик задаются для каждого рабочего пространства отдельно.
- Управление составом рабочих пространств. Папки передаются серверу при инициализации, а их добавление и удаление во время сеанса обрабатывается запросом
workspace/didChangeWorkspaceFolders- переоткрывать редактор не нужно. - Поиск по всем папкам. Запрос
workspace/symbolвыполняет поиск символов сразу по всем зарегистрированным workspace folders, а не только в активной.
Режим MCP (экспериментально)
Сервер умеет работать как сервер Model Context Protocol (MCP), открывая возможности анализа кода 1С (BSL) и OneScript AI-агентам. Инструменты MCP работают поверх того же движка, что и LSP-режим. Рабочие пространства задаются через MCP roots — прямой аналог workspace folders.
- Режимы запуска: отдельный MCP-сервер (команда
mcpс транспортомstdio/sse/streamable) либо совместно с LSP по флагу--mcp(рядом сstdio- илиwebsocket-LSP, по Streamable HTTP). - Инструменты:
analyze_file,document_symbols,find_references,call_hierarchy,hover,definition,type_info(свойства и методы типа по имени),type_at_position(выведенный тип выражения под курсором),global_member_info. Поддержан параметрfileType(BSL/OS). - Основан на Spring AI 2.0; API и поведение могут меняться.
Новые диагностики
На основе системы типов:
UnknownMember— обращение к неизвестному методу или свойству.UnavailableMemberCall— использование метода/свойства, недоступного в целевой версии платформы.AssignToReadOnlyProperty— присвоение значения свойству, доступному только для чтения.
Прочие:
CommonModuleVariables— объявление переменных (Перем) в общем модуле.CompareWithBoolean— сравнение с булевой константой.BadExceptionCategory— недопустимая категория исключений вВызватьИсключение.EventHandlerInvalidSignature- несоответствие сигнатуры обработчика платформенного события (с быстрыми исправлениями).EventHandlerOutsideEventRegion— обработчик события вне стандартной области (с быстрыми исправлениями).
Механизм устаревания и недоступности платформенных членов переведён на data-driven модель: вместо жёстко зашитых диагностик DeprecatedMethods8310/DeprecatedMethods8317 устаревание и доступность членов теперь определяются по версии платформы из данных типов.
Прочие новые возможности
- Исключение путей из анализа — параметр
excludePathsв конфигурационном файле: список glob-паттернов (например,**/.git/**,build/,*.tmp), файлы и каталоги по которым не анализируются. Действует и в режиме LSP, и при пакетном анализе/форматировании из командной строки. - Фильтрация диагностик по авторству Git — параметр
ignoredAuthorsв секцииdiagnosticsконфигурационного файла: список email-адресов авторов, строки кода которых (по даннымgit blame) исключаются из анализа. По умолчанию список пуст — фильтрация по авторству не выполняется. Удобно, чтобы не разбирать унаследованный или чужой код и сосредоточиться на замечаниях по своим изменениям. - Семантическая подсветка лямбд библиотеки
lambdasвнутри строковых литералов. - Виртуальные потоки для исполнителей LSP-запросов.
- Поддержка нового объекта метаданных «Цвет палитры» (
ЦветПалитры). - Проект переведён на JDK 21 как базовую версию Java;
Исправлены общие ошибки
- Устранено ложное срабатывание
ServerCallsInFormEventsна директиву&НаСервереБезКонтекста. - Устранено ложное срабатывание
MissingCommonModuleMethodна цепочках вызовов через общий модуль. - Устранено ложное срабатывание
MissingTemporaryFileDeletionпри асинхронном удалении файлов. - Исправлена работа
VirtualTableCallWithoutParametersнаКритерийОтбора. - Устранены ложные срабатывания диагностик метаданных на объектах, заблокированных поддержкой.
- Исправлены падения при построении графа потока управления (CFG):
IllegalArgumentExceptionна "висячей" директиве препроцессора перед циклом и сбой при директивах препроцессора, пересекающих границыИначеЕсли. - Устранено ложное срабатывание
QueryParseErrorна запросе с функциейСТРОКА. - Исправлен
StringIndexOutOfBoundsExceptionвQueryComputerдля соседних строковых токенов после разрыва строки. - Исправлен
NullPointerExceptionвWebColorInformationSupplierпри неизвестном имени цвета. ColorProviderбольше не показывает ложный чёрный образец цвета для нелитеральных аргументов конструктораЦвет.- Пропускаются объявления переменных без имени при построении структуры документа.
Обновления значимых зависимостей
Библиотеки 1c-syntax:
io.github.1c-syntax:bsl-parser: 0.32.0 → 0.37.1;io.github.1c-syntax:mdclasses: 0.18.0 → 0.19.1;io.github.1c-syntax:bsl-context: новая зависимость, 0.7.0;io.github.1c-syntax:bsl-common-library: 0.10.0 → 0.11.0;io.github.1c-syntax:utils: 0.7.0 → 0.7.2.
Внешние библиотеки:
org.eclipse.lsp4j(lsp4j core + websocket.jakarta): 0.24.0 → 1.0.0;org.springframework.boot: 4.0.1 → 4.1.0;org.springframework.ai:spring-ai-bom: новая зависимость, 2.0.0 (режим MCP);- LanguageTool: 6.7 → 6.8.
Сборка и инструменты:
Спасибо!
- @theshadowco
- @sfaqer
- @erprivalov
- @johnnyshut
- @nixel2007
- и всем-всем-всем контрибьюторам и пользователям BSL Language Server за эти 8 лет!
Full Changelog: v0.29.0...v1.0.0