framework/skills/bsl-practices/query-optimize/SKILL.md
Для оптимизации медленных запросов 1С и наборов СКД
npx skillsauth add steelmorgan/1c-agent-based-dev-framework query-optimizeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Навык для оптимизации существующих запросов и схем компоновки данных. Для написания запросов с нуля — query-patterns. Для СУБД-диагностики (план, блокировки, evidence) — db-performance.
db-performance ← нижний доказательный слой (СУБД-evidence, план, блокировки)
↓ передаёт запрос + причину
query-optimize ← переписывание (этот навык)
↓ использует правила написания
query-patterns ← базовые паттерны (параметризация, NULL, циклы)
Без db-performance-evidence оптимизация — предположение. Если причина неизвестна — сначала db-performance.
rg "Запрос.Текст\s*=" --type-add "bsl:*.bsl" -t bsl.xml схемы через code-navigation, определить набор данныхПрежде чем переписывать — проверить структуру объекта метаданных:
Инструмент: code-navigation → структура объекта.
Выбрать из категорий (одну на итерацию):
| Причина | Признак |
|---------|---------|
| Широкое чтение виртуальной таблицы | Остатки() / Обороты() без параметров периода или измерений |
| Query-in-loop | Запрос внутри Для Каждого / Пока / рекурсии |
| Dot-dereference без ВЫРАЗИТЬ | Движения.Регистратор.Контрагент при составном типе |
| Избыточные временные таблицы | Промежуточные таблицы с полным набором полей вместо минимального |
| Лишние итоги | ИТОГИ в запросе, когда нужна плоская выборка |
| Фильтрация после соединения | Условия ГДЕ на полях большой таблицы вместо параметров виртуальной таблицы |
| Неявное умножение строк через JOIN | LEFT JOIN без агрегации дублирует строки |
| РАЗЛИЧНЫЕ маскирует проблему | ВЫБРАТЬ РАЗЛИЧНЫЕ скрывает лишний JOIN вместо его исправления |
Для каждой причины — конкретное правило (см. раздел «Правила» ниже).
v8-runner после любого измененияРАЗРЕШЕННЫЕ не убирать молча, правила безопасности сохраняютсяЕсли изменение влияет на план СУБД (индекс, параметры виртуальной таблицы, тип соединения) — запросить у пользователя EXPLAIN / ТЖ до и после. Без измерения — зафиксировать как «ожидаемый эффект, требует проверки».
Конкретные правила «как писать правильно» — канон в query-patterns. Здесь — соответствие причины (шаг 3) правилу из query-patterns; применяй правило оттуда, не дублируй запрос-паттерны в этом навыке.
| Причина (шаг 3) | Правило query-patterns |
|---|---|
| Широкое чтение виртуальной таблицы | Правило 5 — параметры периода/измерений внутрь виртуальной таблицы, не в ГДЕ |
| Query-in-loop | Правило 1 — один запрос + Соответствие для доступа |
| Dot-dereference без ВЫРАЗИТЬ | Правило 12 — ВЫРАЗИТЬ(… КАК …) + ССЫЛКА для составного типа |
| Избыточные ВТ / нет индекса соединения | Правила 2, 8 — минимальные поля, ИНДЕКСИРОВАТЬ ПО только по полю соединения |
| Лишние итоги | Правило 16 — ИТОГИ только для Выбрать(ПоГруппировкам), иначе СГРУППИРОВАТЬ ПО |
| Фильтрация после соединения | Правила 5, 13 — параметры ВТ / ПО vs ГДЕ |
| РАЗЛИЧНЫЕ маскирует лишний JOIN | Правило 11 — подзапрос В (…) вместо JOIN + РАЗЛИЧНЫЕ |
Специфика оптимизации (сверх общих правил query-patterns):
ГДЕ)ИНДЕКСИРОВАТЬ ПО)ВЫРАЗИТЬ перед dot-dereferenceЛЕВОЕ СОЕДИНЕНИЕ не превращается в ВНУТРЕННЕЕ из-за условия в ГДЕРАЗЛИЧНЫЕ не маскирует лишний JOINРАЗРЕШЕННЫЕ и прочие фильтры прав сохраненыРАЗРЕШЕННЫЕ без явного согласования безопасности.db-performance.depends_on:
development
1C server maintenance webhooks: container restart and external component cache cleanup
development
Interactive DAP debugging of a single BSL procedure
tools
Rules for using RLM tools for project search and navigation in 1C/BSL
development
Creates web applications and routes on Winow (a web server on OneScript and Autumn). Use when working with a web server on OneScript, routing, or Winow controllers.