{"slug":"bsl-architecture-review","title":"bsl-architecture-review","summary":"Контур проверки архитектуры кода 1С: распределение ответственности, границы и контракты, связанность модулей, ветвление вместо единого метода-диспетчера, дублирование, переусложнение. Принципы SOLID, GRASP и паттерны проектирования в их штатной для 1С реализации. Уровень «требует","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-14T21:09:26.727477Z","repo":{"url":"https://github.com/Romandredan/1c-quality-gate","stars":25,"forks":6,"license":null,"updatedAt":"2026-09-15T17:04:12Z"},"bodyHtml":"<hr>\n<h2>name: bsl-architecture-review\ndescription: &gt;-\nКонтур проверки архитектуры кода 1С: распределение ответственности, границы и контракты,\nсвязанность модулей, ветвление вместо единого метода-диспетчера, дублирование, переусложнение.\nПринципы SOLID, GRASP и паттерны проектирования в их штатной для 1С реализации.\nУровень «требует нового шва» — то, что не чинится заменой строк внутри метода.\nВызывается оркестратором quality-gate; напрямую — по запросу «архитектурное ревью»,\n«разнести ответственность», «это нарушение SOLID», «оцени структуру модуля».\nlicense: MIT</h2>\n<h1>bsl-architecture-review — контур архитектуры</h1>\n<p>Проверяет то, что <strong>не чинится внутри тела метода</strong>. Граница с контуром кода механическая, а\nне тематическая:</p>\n<blockquote>\n<p>Фикс укладывается в замену строк внутри метода — это код. Фикс требует нового шва\n(выделение метода, перенос в другой модуль, новый экспорт, изменение «кто кого вызывает»,\nввод диспетчера) — это архитектура.</p>\n</blockquote>\n<p>Полные правила границы, отсева повторных находок и шкала важности — в <code>shared/routing-contract.md</code>\nна уровне плагина. Здесь они намеренно не дублируются: копия разъедется с оригиналом при первой\nже правке, а это ровно тот дефект, который контур и ищет.</p>\n<p>&lt;ЖЁСТКИЙ-ШЛЮЗ&gt;\nТолько анализ и отчёт. Архитектурная правка без согласования недопустима: она затрагивает\nвызывающих и переживает автора. Находка без предложенной целевой структуры не выпускается.\n&lt;/ЖЁСТКИЙ-ШЛЮЗ&gt;</p>\n<h2>Глубина</h2>\n<p>Приходит от оркестратора вместе с профилем изменения. Контур свои пороги не пересчитывает.</p>\n<table>\n<thead>\n<tr>\n<th>Класс</th>\n<th>Уровень</th>\n<th>Что смотрим</th>\n<th>Бюджет обращений к индексу кода</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>C0, C1</td>\n<td>не запускается</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td>C2</td>\n<td>1–2</td>\n<td>тела изменённых методов; при необходимости — экспорты модуля и его вызывающие</td>\n<td>≤4</td>\n</tr>\n<tr>\n<td>C3</td>\n<td>3</td>\n<td>плюс связи подсистем, проектирование метаданных, карта ответственностей</td>\n<td>≤8</td>\n</tr>\n</tbody>\n</table>\n<p>Бюджет объявляется явно, потому что индекс кода режет выдачу по числу вызовов: без бюджета\nконтур либо не доберёт фактов, либо упрётся в лимит на середине и отчитается по неполным данным.</p>\n<p>Архетипы поднимают уровень независимо от класса: новый общий модуль — минимум уровень 2,\nновый объект метаданных — уровень 3, интеграция и CFE-перехват — минимум уровень 1.</p>\n<hr>\n<h2>Как работает: измеримые сигналы, а не «прочитай и подумай»</h2>\n<p>Источник истины — <code>references/signs-map.json</code>: у каждого признака сигнал, порог,\n<strong>контр-сигнал</strong> и ссылки на принципы. Человекочитаемая версия — <code>signs-map.md</code>.</p>\n<p>Порядок работы с каждым кандидатом:</p>\n<ol>\n<li><strong>Измерь сигнал.</strong> Не «мне кажется, модуль перегружен», а «14 экспортных методов\nкластеризуются в 4 несвязанные группы».</li>\n<li><strong>Проверь контр-сигнал.</strong> У каждого признака есть законная форма, в которой он не является\nдефектом. Ложноположительная архитектурная находка дороже пропущенной: она провоцирует\nпеределку работающего кода.</li>\n<li><strong>Запроси принцип</strong> по URL через MCP <code>v8std</code> — формулировка берётся из источника, а не по\nпамяти.</li>\n<li><strong>Сформулируй целевую структуру.</strong> Какие методы, модули и поля появляются, что удаляется.</li>\n</ol>\n<h3>Симметрия: пере-абстракция ловится так же строго</h3>\n<p>Механизм расширяемости с единственной реализацией, «стратегия» на одну ветку, абстракция без\nвторой точки изменения — это находка уровня \uD83D\uDFE0 с формулировкой «предъявите вторую реализацию\nили упростите».</p>\n<p>Эта половина контура направлена в первую очередь на код, написанный языковой моделью: типовой\nотказ лежит именно здесь, а не в недостатке абстракций. Правило трёх обобщает после третьего\nповторения, не раньше.</p>\n<hr>\n<h2>Три ограничения точности</h2>\n<p>Без них контур теряет доверие после первой же ложной находки.</p>\n<p><strong>1. Одноимённые методы в разных объектах — норма для 1С.</strong> Индекс кода различает точные и\nэвристические совпадения. Любая эвристика, опирающаяся на счётчик вызывающих, требует точного\nразрешения; при эвристическом — понижай важность находки на ступень и формулируй её как вопрос,\nа не как утверждение.</p>\n<p><strong>2. Полнотекстовый поиск доказывает наличие, но не отсутствие.</strong> Он ограничен числом\nпросматриваемых файлов. Область поиска — явный список изменённых файлов; пустой результат даёт\nформулировку «в изменённых файлах не найдено», но никогда — вердикт «чисто».</p>\n<p><strong>3. Пороги статического анализатора принадлежат проекту.</strong> Конфигурация анализатора может\nотключать диагностики или ограничивать анализ отдельными подсистемами — тогда изменённые\nприкладные файлы вообще не попадут в анализ. Держи свои пороги независимыми и используй\nанализатор как дешёвый предфильтр кандидатов, никогда — как источник самой находки.</p>\n<p><strong>Отдельное жёсткое правило про мёртвый экспорт.</strong> В 1С экспортные методы вызываются не только\nиз кода: подписки на события, команды, регламентные задания, настройки библиотек живут в XML;\nплюс расширения и внешние обработки. Находка «экспорт без потребителей» <strong>не выводится вообще</strong>,\nпока не проверены триггеры — иначе контур предложит удалить работающий механизм.</p>\n<hr>\n<h2>Нет индекса кода — четыре признака уходят в <code>skipped</code>, а не в «чисто»</h2>\n<p>Признаки <code>ARCH-A1</code>, <code>ARCH-A7</code>, <code>ARCH-A9</code> и <code>ARCH-A11</code> опираются на граф вызовов: кластеризация\nэкспортов по вызывающим, дублирующая валидация у вызывающего и внутри вызываемого, экспорт без\nпотребителей, состав проверок по обе стороны диалога. Последний признак почти всегда пересекает\nграницы модулей: проверки живут в общих модулях, а вызывает их модуль формы. Без индекса кода\nни один из четырёх нельзя ни подтвердить, ни опровергнуть.</p>\n<p><strong>Факты по графу собирает субагент <code>bsl-scout</code>.</strong> Передавай ему вопрос, а не задачу: «экспорты\nмодуля и вызывающие по каждому», «есть ли у метода вызывающие и триггеры в XML». Независимые\nвопросы задавай параллельно, по одному субагенту на вопрос. Бюджет обращений к индексу\nрасходует он, а твой контекст остаётся под разбор. В его отчёте ищи пометку об эвристическом\nразрешении вызывающих: она понижает уверенность находки на ступень и меняет формулировку с\nутверждения на вопрос.</p>\n<p>Выводы делаешь ты. Субагент возвращает факты и архитектурных вердиктов не выносит. Если\nсубагента в среде нет, работай с индексом сам в пределах объявленного бюджета.</p>\n<p>Молча их не проверить — значит выдать отчёт, который выглядит полным. Это тот же класс ложной\nзелени, который контур ищет в чужом коде, только внутри него самого.</p>\n<p>Поэтому при недоступном индексе пиши в след:</p>\n<pre><code>[qg skipped: layer=arch, scope=call-graph-signs, planned=[qg:ARCH-A1,qg:ARCH-A7,qg:ARCH-A9,qg:ARCH-A11], reason=rlm_unavailable]\n</code></pre>\n<p>и строкой в отчёте: «признаки по графу вызовов не проверялись — индекс кода недоступен».\nВердикт «архитектурных замечаний нет» без этой оговорки не выпускается.</p>\n<p>Остальные признаки от индекса не зависят и гоняются по телам изменённых методов как\nобычно. Список зависимых живёт в машиночитаемой карте полем <code>requires: [\"call-graph\"]</code>, а не в\nэтом тексте: две копии одного знания разъезжаются при первой правке — ровно то, что ловит\nпризнак <code>ARCH-A3</code>.</p>\n<hr>\n<h2>Состязательный аудит на крупных изменениях</h2>\n<p>Для класса C3 с находками уровня \uD83D\uDD34 или \uD83D\uDFE0 предложи в отчёте состязательный аудит: веер\nревьюеров по измерениям (ответственность, границы, связанность, дублирование, переусложнение)\nи проверяющие, пытающиеся опровергнуть каждую находку.</p>\n<p>Архитектурные находки выигрывают от этого больше кодовых: они опираются на эвристики, и доля\nспорных среди них выше. Методология — <code>../quality-gate/references/adversarial-audit.md</code>.\nЗапуск только после явного согласия пользователя.</p>\n<hr>\n<h2>Формат находки</h2>\n<p>Сверх общего формата обязательны четыре поля. Находка без любого из них не выпускается.</p>\n<pre><code>[\uD83D\uDD34/\uD83D\uDFE0/\uD83D\uDFE1] &lt;суть&gt;\nГде: &lt;путь&gt;::&lt;Метод&gt;:&lt;строка&gt;\nПризнак: qg:ARCH-AN — &lt;название&gt;\nСигнал: &lt;измеренное значение&gt; против порога &lt;порог&gt;\nПринцип: &lt;название&gt; — &lt;URL&gt;  (+ #stdNNN, если есть)\nЦелевая структура: &lt;какие методы/модули/поля появляются, что удаляется&gt;\nПереусложнение: вводится сущностей N, реальных потребителей M, удаляется K\nУверенность: высокая | средняя (эвристическое разрешение вызывающих) | требует проверки\n</code></pre>\n<p><strong>Целевая структура</strong> отличает находку от жалобы. «Модуль перегружен» без предложения, как его\nразделить, не является результатом работы.</p>\n<p><strong>Проверка на переусложнение</strong> обязательна, потому что иначе контур сам становится источником\nпере-абстракции: предлагает ввести три сущности там, где хватает одной.</p>\n<h3>Записи следа</h3>\n<pre><code>[qg applied: layer=arch, scope=module-responsibility, ids=[qg:ARCH-A1,std440], verdict=violation:qg:ARCH-A1]\n[qg applied: layer=arch, scope=branching-dispatch, ids=[qg:ARCH-A2], verdict=clean]\n[qg skipped: layer=arch, reason=volume_below_threshold]\n</code></pre>\n<hr>\n<h2>Специфика 1С</h2>\n<p>Каноничные реализации паттернов из литературы в 1С не работают: платформа не даёт\nпользовательских иерархий классов. Штатные соответствия — в <code>references/patterns-in-1c.md</code>;\nпредлагать нужно именно их, а не абстрактный «интерфейс стратегии».</p>\n<p>Антипаттерны архитектурного уровня, характерные для кода языковой модели, —\nв <code>references/ai-antipatterns-arch.md</code>. Чеклист по семи областям —\nв <code>references/checklist-architecture.md</code>.</p>\n<hr>\n<h2>Принципы</h2>\n<ul>\n<li><strong>Сигнал вместо вкусовщины.</strong> Каждая находка — измеренное значение против объявленного порога.</li>\n<li><strong>Контр-сигнал обязателен.</strong> Прежде чем выпустить находку, проверь законную форму признака.</li>\n<li><strong>Целевая структура обязательна.</strong> Нет предложения — нет находки.</li>\n<li><strong>Пере-абстракция равна недо-абстракции.</strong> Обе стороны проверяются одинаково строго.</li>\n<li><strong>Уверенность заявляется.</strong> Эвристическое разрешение ссылок понижает важность находки и меняет\nформулировку с утверждения на вопрос.</li>\n</ul>\n","files":[{"path":"references/ai-antipatterns-arch.md","sizeBytes":32530,"isText":true},{"path":"references/checklist-architecture.md","sizeBytes":8217,"isText":true},{"path":"references/patterns-in-1c.md","sizeBytes":5996,"isText":true},{"path":"references/signs-map.json","sizeBytes":13069,"isText":true},{"path":"references/signs-map.md","sizeBytes":12180,"isText":true},{"path":"SKILL.md","sizeBytes":16265,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-14T21:09:41.611009Z","sha256":"DF62192ECACEF4DA645B7C653FCE9E0370DAC73B368FC90DE8DB1F68CA2236D4","sizeBytes":27786},"review":null,"source":{"repositoryUrl":"https://github.com/Romandredan/1c-quality-gate","path":"skills/bsl-architecture-review","license":null,"commit":"661b1112836a1a4f2142b724d22bbb05ab239e10","subtreeSha":"627D4F11FE1E864B8CFF06F3C400E59A181291C343A5ED5DBFE391D987342D87","lastSyncedAt":"2026-09-19T13:50:21.019055Z"},"reviewedAt":"2026-09-14T21:11:14.933473Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/Romandredan/1c-quality-gate/tree/main/skills/bsl-architecture-review"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install romandredan-1c-quality-gate@llmmart"},{"target":"git","command":"git clone https://github.com/Romandredan/1c-quality-gate.git"}]}