1c-bsl-validate · git:20260819.286b4b8 · 2026-08-19 · sha256 3ff55f305170a85e

1c-bsl-validate git:20260819.286b4b8A

Immutable. This exact content is served forever at /api/v1/blob/3ff55f305170a85e.

---
name: 1c-bsl-validate
description: Проверка вызовов общих модулей в BSL по выгрузке конфигурации - существует ли модуль и экспортный ли у него метод. Работает без платформы, по индексу от 1c-config-index
argument-hint: <ModulePath> -IndexPath index.json [-UnknownCalls] [-Detailed]
allowed-tools:
  - Bash
  - Read
  - Glob
---

# /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` - перехват метода в расширении