$npx -y skills add Desko77/cursor-1c-skills --skill 1c-query-optimizationAdvanced query patterns for 1C: temporary tables, joins, DCS optimization. Use for complex queries beyond basic rules in query-optimization-tips.md.
| 1 | # 1C Query Optimization Skill (Advanced Patterns) |
| 2 | |
| 3 | Продвинутые паттерны оптимизации запросов. Базовые оптимизации (ВЫРАЗИТЬ, ПРЕДСТАВЛЕНИЕ, ВТ вместо подзапросов, ОБЪЕДИНИТЬ ВСЕ, индексы, СКД) — см. правило `query-optimization-tips.md`. Анти-паттерны (запрос в цикле, обращение через точку) — см. `anti_patterns.md`. |
| 4 | |
| 5 | ## Validate Query via EDT-MCP |
| 6 | |
| 7 | Если EDT-MCP сервер подключен (инструменты `1c-edt` доступны), проверяй оптимизированный запрос через `validate_query` — убедись, что после рефакторинга нет синтаксических/семантических ошибок. Для запросов СКД: `dcsMode=true`. |
| 8 | |
| 9 | ## When to Use |
| 10 | |
| 11 | Invoke this skill when: |
| 12 | - Working with complex multi-step data processing |
| 13 | - Optimizing joins and subqueries |
| 14 | - Implementing DCS reports |
| 15 | - Processing large datasets in portions |
| 16 | |
| 17 | ## Temporary Tables — When to Use |
| 18 | |
| 19 | Use temporary tables for: |
| 20 | - Complex multi-step data processing |
| 21 | - Joining data from multiple sources |
| 22 | - Reusing intermediate results |
| 23 | |
| 24 | ### Join vs Subquery (basic choice) |
| 25 | |
| 26 | ```bsl |
| 27 | // PREFERRED: Join (usually faster) |
| 28 | "ВЫБРАТЬ |
| 29 | | Заказы.Ссылка КАК Заказ, |
| 30 | | Контрагенты.ИНН КАК ИНН |
| 31 | |ИЗ |
| 32 | | Документ.ЗаказКлиента КАК Заказы |
| 33 | | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты |
| 34 | | ПО Заказы.Контрагент = Контрагенты.Ссылка" |
| 35 | |
| 36 | // AVOID: Subquery in SELECT (N+1 problem) |
| 37 | "ВЫБРАТЬ |
| 38 | | Заказы.Ссылка КАК Заказ, |
| 39 | | (ВЫБРАТЬ К.ИНН ИЗ Справочник.Контрагенты КАК К |
| 40 | | ГДЕ К.Ссылка = Заказы.Контрагент) КАК ИНН |
| 41 | |ИЗ |
| 42 | | Документ.ЗаказКлиента КАК Заказы" |
| 43 | ``` |
| 44 | |
| 45 | ### Avoid Aggregation in Subqueries |
| 46 | |
| 47 | ```bsl |
| 48 | // SLOW: Subquery with aggregation |
| 49 | "ВЫБРАТЬ |
| 50 | | Номенклатура.Ссылка, |
| 51 | | (ВЫБРАТЬ СУММА(Остатки.Количество) ...) КАК Остаток |
| 52 | |ИЗ |
| 53 | | Справочник.Номенклатура КАК Номенклатура" |
| 54 | |
| 55 | // FAST: Join with pre-aggregated data |
| 56 | "ВЫБРАТЬ |
| 57 | | Номенклатура.Ссылка КАК Номенклатура, |
| 58 | | ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток |
| 59 | |ИЗ |
| 60 | | Справочник.Номенклатура КАК Номенклатура |
| 61 | | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки |
| 62 | | ПО Номенклатура.Ссылка = Остатки.Номенклатура" |
| 63 | ``` |
| 64 | |
| 65 | --- |
| 66 | |
| 67 | **Reference**: [ITS Query Optimization Standards](https://its.1c.ru/db/v8std/browse/13/-1/26/28) |