Skill v1.0.2
currentAutomated scan100/100~1 modified
version: "1.0.2" name: code-navigation description: "LSP-навигация BSL: definitions, refs, call graph" uses_capabilities:
- navigate_symbol
- get_call_graph
- get_code_actions
- rename_symbol
- search_ssl_functions
- get_completion
- get_symbol_impact
Навигация по коду (Code Navigation)
Не угадывать расположение кода. Для широкого 1C/BSL-поиска сначала используй RLM (rlm-bsl-search), а LSP — когда уже есть конкретный файл, символ или позиция курсора. LSP даёт точную IDE-семантику по индексу проекта: definition/references, hover, signature, completion, diagnostics, rename и code actions.
Граница с RLM
| Потребность | Первый инструмент | |
|---|---|---|
| Найти механизм, похожую реализацию, бизнес-цепочку, query/XML/MDO/forms/rights связи | RLM (rlm_start → rlm_execute) | |
| Оценить широкий blast radius объекта метаданных, формы, роли, запроса, подписки | RLM, затем LSP по найденным символам | |
| Перейти к определению уже найденного метода/переменной | BSL LS/LSP | |
| Получить references/call graph по конкретной позиции | BSL LS/LSP | |
| Проверить тип, hover, signature, completion в конкретном месте кода | BSL LS/LSP | |
| Rename, formatting, quick fix, diagnostics | BSL LS/LSP |
Когда применять
| Триггер | Действие | |
|---|---|---|
| Поиск определений процедуры/функции | navigate_symbol operation definition | |
| Все вызовы функции X, когда известна конкретная функция/позиция | navigate_symbol search или get_call_graph incoming | |
| Кого вызывает функция | get_call_graph outgoing | |
| Переименование по проекту | rename_symbol (сначала preview: true) | |
| Quick Fixes | get_code_actions | |
| Диагностика файла | get_diagnostics | |
| Исследование неизвестного кода после RLM-discovery | navigate_symbol → get_call_graph → hover | |
| Ошибка «метод не найден» на типе платформы | getMembers / getMember / getConstructors | |
| Состав объекта/ТЧ/реквизиты, значения перечисления, предопределённые | get_completion после точки (см. «Discovery метаданных») | |
| Где используется объект метаданных в коде, если уже известен менеджер/символ | search_ssl_functions references на Документы.X; широкий usage — через RLM | |
| Оценить, кого заденет правка процедуры/функции | get_symbol_impact (входящие + ссылки + классификация) | |
| Подсказки параметров при написании вызова | signature_help — курсор ВНУТРИ скобок вызова (см. «Подсказки параметров») |
Алгоритмы
Найти все вызовы функции
Если известна только бизнес-тема или примерное имя — сначала RLM. Этот алгоритм применяй, когда уже есть конкретный метод или позиция.
navigate_symbol(query: "ИмяФункции", operation: "search")→ получитьuri,line,characterget_call_graph(uri, line, character, direction: "incoming")
Переименование по проекту
navigate_symbol→uri,line,characterrename_symbol(..., preview: true)→ проверитьchangesrename_symbol(..., preview: false)get_diagnosticsпо затронутым файлам
Quick Fixes
get_diagnostics(uri)→ список диагностикget_code_actions(uri, range, diagnostic)→ применить
Верификация API платформы после ошибки
Триггер: ошибка «Метод объекта не обнаружен» / «Неверное количество параметров» на типе платформы. Не угадывать повторно — верифицировать.
search_syntax_reference(query: "ТипОбъекта")→ подтвердить имя, получитьidgetMembers(typeId)→ точный список методов/свойствgetMember(typeId, member)→ сигнатура конкретного методаgetConstructors(typeId)→ если ошибка про параметрыНовый
Важно: Только реакция на ошибку, не превентивный поиск.
Discovery метаданных через get_completion
BSL LS Type System v2 отдаёт метаданные конфигурации через автодополнение. Один tool отвечает на разные вопросы — меняется только позиция курсора (после точки). В detail каждого пункта — сигнатура и возвращаемый тип.
| Вопрос | Где поставить курсор | Что вернётся | |
|---|---|---|---|
| Реквизиты / ТЧ / колонки объекта | после Объект. (типизированная переменная) | реквизиты, табличные части, их колонки, методы — с типами | |
| Значения перечисления | после Перечисления.ИмяПеречисления. | значения перечисления | |
| Предопределённые элементы | после Справочники.Имя. / ПланыСчетов.Имя. | предопределённые + методы менеджера | |
| Состав ОпределяемогоТипа | курсор на реквизите типа ОпределяемыйТип | get_completion + get_hover_info раскрывают составляющие типы |
Инверсный сигнал: если после перем. get_completion возвращает пусто или нет ожидаемого члена — тип переменной выведен неверно/неизвестен. Отсутствие автодополнения здесь = индикатор ошибки типа (частый баг 1С), а не «нет данных».
Найти использования объекта метаданных в коде
Для широкой карты использований объекта метаданных сначала RLM: он лучше покрывает BSL, XML/MDO/forms/rights/query, подписки и регламентные задания. Этот LSP-алгоритм применяй после RLM или когда нужен точный references по известному менеджеру.
Картина гибридная (как сам объект используется в BSL):
search_ssl_functions(режим references) на символе менеджераДокументы.ИмяОбъекта→ семантически точные места обращения через менеджер. references исключают совпадения в комментариях/строках/текстах запросов.- Добрать через RLM то, что не является символом и потому references не видит: строковые литералы типа (
"ДокументСсылка.ИмяОбъекта",Тип("ДокументСсылка.…")), пути метаданных внутри текста запроса (ИЗ Документ.ИмяОбъекта), формы, права, подписки и XML/MDO. - Raw grep использовать только как fallback, если RLM недоступен или надо проверить один известный файл.
Для «где используется» не начинать с голого grep по имени: он даёт ложные срабатывания в комментариях и строках. Широкий поиск — RLM; точная позиционная семантика — LSP references.
Импакт-анализ правки: get_symbol_impact
Перед переименованием/изменением конкретной процедуры — оценить локальный LSP-радиус поражения одним вызовом:
navigate_symbol→uri,line,characterсимвола.get_symbol_impact(uri, line, character)→ входящие вызывающие (call hierarchy) + все ссылки + классификация вызывающих по типу модуля (CommonModule / FormModule / ManagerModule / ObjectModule / …) — видно, откуда тянется правка: UI, сервер или фон.
Два слепых пятна (заложены в вывод, держать в голове):
- Триггеры. call hierarchy показывает только прямые вызовы. Метод достигается ещё и через подписки на события, обработчики форм, регл.задания, расширения
&Вместо/&Перед/&После— этого здесь НЕ видно; добирать через RLM по BSL + XML/MDO. - Однофамильцы. Для общих объектных методов (
ОбработкаПроведения,ПередЗаписью, есть в сотнях модулей) привязывать call hierarchy к конкретному модулю — иначе в результат попадут ложные звенья от одноимённых методов других объектов.
Подсказки параметров на месте вызова: signature_help
Возвращает список параметров вызываемого метода и то, на каком аргументе стоит курсор. Контракт строгий — ошибка в позиции даёт пустой результат, который выглядит как «не поддерживается», а на деле это неверная позиция.
ОБЯЗАТЕЛЬНО передавать `line`/`character` 0-based, курсор ВНУТРИ скобок вызова — между ( и ), НЕ на имени метода и НЕ перед (. Провайдер находит охватывающий вызов (doCall), резолвит вызываемый метод и только тогда возвращает сигнатуры.
// Строка (1-based 8): Аккаунт = ПолучитьАккаунт(ДокументОперации, ПараметрыОперации);signature_help(uri, line=7, character=29) // сразу после "(" → param 0// → ПолучитьАккаунт(ДокументОперации?, ПараметрыОперации?), Active parameter: 0signature_help(uri, line=7, character=47) // после запятой → Active parameter: 1
Пустой результат ≠ tool сломан. signature_help возвращает сигнатуры только когда вызываемый метод резолвится в метод с известным списком параметров. Надёжно работает для методов того же модуля (резолв из разобранного исходника). Возвращает пусто для:
- курсор НЕ внутри скобок (на имени / перед
() — самая частая ошибка; - межмодульный вызов (
Модуль.Метод() — нужен индекс типов конфигурации, исправен только когда BSL LS нацелен на единый корень конфигурации (см. «Типичные ошибки»: межмодульный резолв); - глобальные методы платформы (
СтрШаблон(,ЗначениеЗаполнено() и методы объектов платформы (Запрос.УстановитьПараметр() — нужен загруженный контекст платформы 1С (синтакс-помощник.hbk). Контейнер mcp-lsp лёгкий — платформа НЕ зашита в образ, провижинится в рантайме. Run-скриптbsl-lsгенерирует глобальный конфиг и передаёт его через-Dapp.globalConfiguration.path: когда заданBSL_PLATFORM_BIN(composedocker-compose.platform.ymlмонтирует каталог.hbkread-only) — используется явныйv8platform.binPathс приоритетом; когда не задан — BSL LS автоопределяет установленную платформу (включая Windows). Без того и другого в стартовом логеFailed to load platform contexts: No 1C platform installations found, и hover/completion/сигнатуры по платформе пустые. С загруженным (Loaded N platform contexts from 1C syntax helper) — резолвятся с полными доками параметров (на русском приlanguage:ru).
Для подтверждённого списка параметров независимо от места вызова — getMember(typeId, member) (типы платформы) или navigate_symbol→hover (собственное объявление метода).
Capabilities
| Capability | Назначение | |
|---|---|---|
navigate_symbol | Поиск символов, определение, hover | |
get_call_graph | Граф вызовов (incoming/outgoing) | |
rename_symbol | Переименование по проекту | |
get_diagnostics | LSP-диагностика файла | |
get_code_actions | Quick Fixes | |
search_syntax_reference | Поиск типа платформы | |
getMembers / getMember | Методы/свойства типа платформы | |
getConstructors | Конструкторы типа (Новый) | |
get_completion | Discovery метаданных: члены объекта/ТЧ, значения перечисления, предопределённые, типы | |
get_symbol_impact | Импакт-анализ: входящие вызовы + ссылки + классификация вызывающих по типу модуля | |
signature_help | Подсказки параметров на месте вызова (курсор внутри скобок) |
Типичные ошибки
| Ошибка | Обходной путь | |
|---|---|---|
| LSP не подключён | Проверить lsp_status; запустить BSL Language Server | |
| Символ не найден | Проверить имя (регистр, язык); ask_ai_assistant (шаблон SEARCH_DOCS из buddy-prompting) по имени метода/типа | |
get_call_graph таймаут | Уменьшить depth | |
rename_symbol не применим | Проверить позицию курсора; защищённая область → ручное редактирование | |
| Файл не индексирован | Дождаться индексации LSP | |
signature_help возвращает пусто | Курсор должен быть ВНУТРИ скобок вызова (0-based), не на имени метода; надёжно для методов того же модуля. Для межмодульных/глобальных вызовов см. строку ниже | |
Межмодульный Модуль.Метод() не резолвится (пустой signature_help, межмодульный call hierarchy теряет звенья, ложный QueryToMissingMetadata) | BSL LS должен индексировать ЕДИНЫЙ главный корень конфигурации src/xml, а не корень проекта с 9 Configuration.xml (основная + расширения). Session-manager автоопределяет главный корень конфигурации под переданным workspace (detectConfigurationRoot), так что это должно быть исправлено. Если регрессирует — проверить стартовый лог bsl-ls на Detected 1C configuration root: …/src/xml; отсутствие = детект не сработал (например, в workspace нет главного Configuration.xml или бинарь старее фикса) → реиндексация смотрит не на то дерево |
depends_on: []