Провести модуль через зачистку под строгую типизацию - поставить `// @strict-types`, довести диагностики EDT до нуля, переписать докблоки, исправить найденные дефекты и закоммитить отдельным коммитом. Использовать когда владелец называет модуль для зачистки, просит включить строгую типизацию, убрать ошибки EDT в модуле. К модулям, заимствованным из БСП, не применять.
Scanned 9/22/2026
Install to Claude Code
npx -y skills add vandalsvq/edt1c-ai-template --skill strict-module --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Strict Module?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vandalsvq-strict-module)More formats (shields.io, HTML) on the badges page.
---
name: strict-module
description: Провести модуль через зачистку под строгую типизацию - поставить `// @strict-types`, довести диагностики EDT до нуля, переписать докблоки, исправить найденные дефекты и закоммитить отдельным коммитом. Использовать когда владелец называет модуль для зачистки, просит включить строгую типизацию, убрать ошибки EDT в модуле. К модулям, заимствованным из БСП, не применять.
---
Проведи названный модуль через зачистку: строгая типизация, докблоки, диагностики в ноль,
найденные дефекты - на обсуждение и в исправление, результат - отдельный коммит.
Приёмы типизации живут в [`docs/bsl-strict-types.md`](../../../docs/bsl-strict-types.md) - здесь
только процедура и грабли, на которые уже наступали. Границы самой работы (что входит, чего не
делают заодно, чем меряется цена) - [`docs/bsl-refactoring.md`](../../../docs/bsl-refactoring.md),
раздел «Зачистка модуля под строгую типизацию». Техники рефакторинга - там же.
# Настройка под проект
> **Заполняется при инициализации шаблона** (см. [`docs/project-init.md`](../../../docs/project-init.md)).
| Параметр | Значение |
| --- | --- |
| Каталог EDT-проекта | `<Каталог.Имя>` |
| Модули, заимствованные из БСП | `<перечислить или «нет»>` |
| Справочник экспортного API проекта | `<путь к docs/... или «нет»>` |
## Когда не применять
- **Модули, заимствованные из БСП** - решение владельца: строгую типизацию не ставим,
сигнатуры не наши.
- Модули, которые владелец ведёт сам в этот момент (смотри `git status` перед началом).
- Модули, участвующие в сквозном сценарии (печать, сборка, обмен), - **только если заранее
определено, чем проверять результат** (см. шаг 8). Без этого не начинать.
## Шаг 1. Замер цены и договорённости
1. `git branch --show-current` - работа идёт в feature-ветке задачи.
2. `git status` - запомни, какие файлы правит владелец: их не трогать и в свой коммит не брать.
3. Поставь `// @strict-types` первой строкой (за ней пустая строка), синхронизируй (шаг 3) и
замерь: `get_diagnostics` со `scope: module`, `path` до модуля и **обязательно `max_items: 0`** -
иначе «Итого» покажет число выведенных, а не общее.
4. Назови владельцу цену (сколько диагностик) и сколько строк в модуле. Если счёт в сотнях -
предупреди, что проход длинный.
`@skip-check` не расставляй - ни по памяти, ни по образцу соседнего кода. Нужен - спроси
разрешение отдельно, с обоснованием, почему проверку нельзя удовлетворить кодом.
## Шаг 2. Прочитать модуль целиком
До первой правки. Не выборочно - весь, включая области, которые кажутся неинтересными.
Причина: массовая замена обращений по образцу ломает семантику там, где обращение выглядит
чтением, а на деле им не является (см. «Грабли»). Прочитанный модуль - единственная защита.
Попутно выписывай:
- дефекты и странности (для обсуждения с владельцем),
- места, где типизация потребует смены контракта (это вопрос владельцу, не самодеятельность).
## Шаг 3. Синхронизация EDT после правок через Bash
EDT не видит правок, сделанных в обход его редактора. Рецепт (проверен):
1. `workspace_copy_transform_batch` без замен: модуль → временный файл **внутри проекта**
(`<Каталог.Имя>/_sync_tmp.bsl`), `refresh_workspace: true`.
2. Тем же инструментом обратно: временный файл → модуль, `overwrite: true`, `refresh_workspace: true`.
3. Удалить временный файл.
4. Пауза 70-90 секунд. **Ноль диагностик до окончания паузы врёт.**
Ограничения:
- `.mdo`, `.form`, `.mxl`, СКД через этот инструмент **не пишутся** (`STRUCTURED_EDT_ARTIFACT_BLOCKED`).
Метаданные правь семантическими инструментами MCP через `edt_validate_request` → токен. Если
правка руками неизбежна (например, удалить неразрешимую ссылку, которой семантический инструмент
не видит) - скажи об этом владельцу и проверь результат через `edt_metadata_details`.
- Маркеры EDT отстают на один запрос: после правки часть ошибок ещё висит. Сверяйся с **файлом**,
а не только с диагностикой, и перезамеряй.
## Шаг 4. Правки порциями
Порядок, который экономит итерации:
1. **Массовые однотипные замены** скриптом (python через Bash, с `assert` на количество вхождений -
молчаливая замена нуля мест хуже падения).
2. Синхронизация и замер - какие классы ошибок ушли, какие остались.
3. **Докблоки** всем методам без описания: типы параметров и возвращаемого значения. Ссылки
`см. Метод.Параметр` вместо копирования союзов типов. Отступ и колонка типов - табами.
4. Остаток - поштучно, по классам ошибок.
Частые классы и чем лечатся:
| Код | Смысл | Лечение |
| --- | --- | --- |
| SU83 | свойство не имеет типа | докблок владельцу свойства; для реквизита без типа - аксессор (bsl-strict-types, «Реквизит объекта, объявленный без типа») |
| SU70 | типы не пересекаются | сужение инлайном, приведение платформенной функцией, явная передача значения по умолчанию вместо пропуска параметра |
| SU76 | добавление в нетипизированную коллекцию | `Новый Массив; // Массив из <Тип>` либо конструктор |
| SU82 | переменная без типа | инициализация с типом или инлайн-аннотация |
| SU91 | смена типа переменной | отдельная переменная или служебная функция-преобразователь |
| SU15 | метод не найден | инлайн-аннотация источника (`ПолучитьИзВременногоХранилища`, `Новый Файл` и т.п.) |
| SU24/SU25 | состав структуры и параметры | конструктор с явными типами значений |
| SU40/SU48 | область не на месте | `УстаревшиеПроцедурыИФункции` - **вложенная** подобласть, не верхнеуровневая |
## Шаг 5. Дефекты
Типизация вскрывает настоящие дефекты - это основная её польза, но не мандат на переделку.
- Правка, которая **не меняет поведение** (неинициализированная переменная, мёртвое присваивание,
выброшенный результат, лишний параметр, CQS у команды): делай и перечисли в коммите.
- Правка, которая **меняет поведение** (порядок вызовов, состав возвращаемого, условие ветвления):
сформулируй владельцу - что сейчас, чем это плохо, что предлагаешь, чем рискуем - и дождись
решения. Его «не трогать» - ответ, а не приглашение переубеждать.
- Дефекты в **чужих файлах** (формы, объекты вне задачи) - доложи, не правь.
## Шаг 6. Гигиена перед коммитом
Проверить скриптом, не глазами:
- нет BOM (норма - UTF-8 без BOM; `utf-8-sig` на запись его добавляет);
- нет двойных пустых строк;
- тире - только дефис-минус (U+002D), см. `docs/bsl-coding-standards.md`;
- баланс `#Область` / `#КонецОбласти` и `#Если` / `#КонецЕсли`;
- нет смешанных кирилло-латинских слов, кроме легитимных (префикс проекта, `СтрокаXML`);
- хвостовые пробелы - не добавлять новых сверх стиля исходника (`git diff | grep -c "^+.*[ \t]$"`).
## Шаг 7. Замер до нуля
- `scope: module` с `max_items: 0` - основной замер.
- `scope: project` с `object: <имя модуля>` - ловит то, что module-scope пропускает (приватность
методов при межмодульных вызовах).
- Если модуль вызывается извне - замерь и потребителей: сигнатуры могли поехать.
## Шаг 8. Прогон функциональности
**Диагностики не проверяют работоспособность.** Зелёный модуль с нулём ошибок может быть сломан:
так уже было - механическая замена обращений к реквизиту на локальную переменную обрушила сборку,
потому что одно из обращений было каналом обратной передачи через границу клиент-сервер.
Правило: если модуль участвует в сквозном сценарии - до коммита договорись с владельцем, каким
прогоном проверяется результат, и попроси прогнать. Свой вывод «логика эквивалентна»
доказательством не является. Обвязка автономного прогона - [`docs/testability.md`](../../../docs/testability.md).
## Шаг 9. Документация
- Изменился экспортный API - обнови справочник модулей проекта (таблица настройки выше).
- Нашёл новый приём или ограничение типизации, которого нет в `docs/bsl-strict-types.md` - допиши
туда (только проверенное на этом модуле, без пересказа уже описанного). Правка стандарта
поднимается в шаблон скиллом `/push-to-template`.
- Изменилось поведение, видимое пользователю - действовать по таблице «Синхронизация документации»
в `CLAUDE.md`.
## Шаг 10. Коммит
1. Версия конфигурации: четвёртый сегмент +1 в `<Каталог.Имя>/src/Configuration/Configuration.mdo`.
Перед правкой перечитай файл - владелец мог поднять версию параллельно.
2. Состав коммита - решение владельца. По своей инициативе его правки не включай; при выборочном
`git add` покажи, что войдёт и что останется.
3. Сообщение: ссылка на задачу + что сделано, отдельным абзацем - список исправленных дефектов.
4. `git push` - только по явной просьбе.
## Грабли
- **Граница клиент-сервер отдаёт копию.** Параметр серверного метода без `знач` возвращает структуру
вызывающему копией. Аргумент `Объект.Реквизит` платформа переписывала результатом сама; локальная
переменная этого не делает - контекст нужно вернуть в реквизит явно.
- **Локальная переменная - не реквизит.** Если между её получением и использованием кто-то
перезаписывает реквизит, переменная указывает на прежний объект. Проверь, нет ли перезаписи, или
читай реквизит заново.
- **Пропущенный параметр** в вызове BSL-метода (`Метод(А,, Б)`) даёт SU70: типизация подставляет
`Неопределено`, а не значение по умолчанию. Передавай значение явно, докблок под пропуск не подгоняй.
- **`см.` раскрывает только первый уровень.** Элементы `Массив из Структура` типизируются
инлайн-аннотацией элемента цикла или конструктором.
- **Вариант `Неопределено`** в докблоке возвращаемого значения ставится **до** перечисления вложенных
свойств `*`, иначе парсер его не видит.
- **Одноимённая переменная цикла и параметр** - смена типа, SU91. Переименуй переменную цикла.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!