1c-bsl-validate · git:20260819.f9839d8 · 2026-08-19 · sha256 950eb2020af24a2d
1c-bsl-validate git:20260819.f9839d8A
Immutable. This exact content is served forever at /api/v1/blob/950eb2020af24a2d.
--- name: 1c-bsl-validate description: "Проверка вызовов общих модулей в BSL по выгрузке конфигурации - существует ли модуль и экспортный ли у него метод. Работает без платформы, по индексу от 1c-config-index" --- # /bsl-validate - вызовы общих модулей против выгрузки Отвечает на один вопрос: вызванный метод общего модуля вообще существует и экспортный ли он. Переименовали метод или сняли `Экспорт` - вызовы в других модулях об этом не узнают до запуска. Работает без EDT, без платформы и без базы. Синтаксис BSL этот навык НЕ проверяет - для синтаксиса есть отдельный сервер `1c-syntax-checker-mcp`. ## Параметры | Параметр | Обяз. | Умолч. | Описание | |---------------|:-----:|--------|-----------------------------------------------------------------| | ModulePath | да | - | Файл `.bsl` либо каталог - тогда обходится рекурсивно | | IndexPath | да | - | Индекс от `1c-config-index` | | UnknownCalls | нет | - | Дополнительно искать вызовы неизвестных имен (только общие модули) | | Detailed | нет | - | Показать счетчики даже когда есть замечания | | MaxErrors | нет | 30 | Не выводить больше N замечаний | ## Команда ```bash python skills/1c-config-index/scripts/config-index.py -ConfigPath src -OutFile .cache/index.json python skills/1c-bsl-validate/scripts/bsl-validate.py -ModulePath src -IndexPath .cache/index.json ``` ```powershell powershell.exe -NoProfile -File "skills/1c-bsl-validate/scripts/bsl-validate.ps1" -ModulePath "src" -IndexPath ".cache/index.json" ``` ## Основная проверка: метод общего модуля Вызов вида `ОбщиеФункции.Метод`, где `ОбщиеФункции` есть в индексе среди общих модулей, проверяется точно: метод обязан быть в списке экспортных. Ложных срабатываний тут нет - левая часть однозначно опознана как общий модуль по имени из конфигурации. Работает в ЛЮБЫХ модулях: формы, объекта, менеджера, общего. Список экспортных методов индекс собирает разбором `Ext/Module.bsl` с вырезанными строчными комментариями. Закомментированная процедура призраком в список не попадет. ## Дополнительная проверка: неизвестные имена (флаг `-UnknownCalls`) Ищет `Имя.Метод`, где `Имя` не объявлено в модуле, не общий модуль и не глобальная коллекция платформы. Так ловится вызов УДАЛЕННОГО общего модуля. Проверка идет **только в общих модулях** и **только по флагу**. Причина простая: у общего модуля список доступных имен замкнут - все, что не локальная переменная, параметр или глобальная коллекция, обязано быть общим модулем. У модуля формы или объекта это не так: `Дерево.ПолучитьЭлементы` обращается к реквизиту формы, который нигде не объявлен, и такая проверка выдала бы ложное срабатывание на каждый реквизит. Локальными считаются: `Перем`, параметры процедур и функций (включая значения по умолчанию), цели присваиваний, переменные циклов `Для` и `Для Каждого`. Список глобальных коллекций платформы в навыке заведомо НЕПОЛНЫЙ - их сотни. Именно поэтому проверка и включается флагом: с ним она полезна, без него ничего не портит. ## Чего НЕ проверяется Это не компилятор BSL. Без платформы недоступны типы выражений, число и типы параметров вызова, директивы компиляции, доступность метода с клиента или сервера. Намеренно пропускается: - **цепочки** - в `Справочники.Номенклатура.СоздатьЭлемент` корнем считается `Справочники`, а не `Номенклатура`; - **вызов через переменную** - если имя объявлено в модуле, оно не трогается; - **строковые литералы и комментарии** вырезаются до разбора: тексты запросов внутри строк полны точек, иначе каждая вторая строка запроса стала бы вызовом. Все замечания - предупреждения, код возврата всегда 0. Это самый шумный класс проверок из всех, что можно сделать по выгрузке, и ошибка тут дороже пропуска. ## Связанные навыки - `1c-config-index` - строит индекс, без него проверка не работает - `1c-query-validate` - проверка текста запроса по той же выгрузке - `1c-cfe-patch-method` - перехват метода в расширении