/bsl-validate - вызовы общих модулей против выгрузки
Отвечает на один вопрос: вызванный метод общего модуля вообще существует и экспортный ли он.
Переименовали метод или сняли Экспорт - вызовы в других модулях об этом не узнают до запуска.
Работает без EDT, без платформы и без базы. Синтаксис BSL этот навык НЕ проверяет - для синтаксиса
есть отдельный сервер 1c-syntax-checker-mcp.
Параметры
| Параметр | Обяз. | Умолч. | Описание |
|---|---|---|---|
| ModulePath | да | - | Файл .bsl либо каталог - тогда обходится рекурсивно |
| IndexPath | да | - | Индекс от 1c-config-index |
| UnknownCalls | нет | - | Дополнительно искать вызовы неизвестных имен (только общие модули) |
| Detailed | нет | - | Показать счетчики даже когда есть замечания |
| MaxErrors | нет | 30 | Не выводить больше N замечаний |
Команда
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.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- перехват метода в расширении