Claude Skill

1c-query-optimization

Advanced query patterns for 1C: temporary tables, joins, DCS optimization. Use for complex queries beyond basic rules in query-optimization-tips.md.

LLM Mart · 0 points · 12 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download Desko77-claude-code-skills-1c-skills_1c-query-optimization-ac33656.zip · 3 KB
Part of desko77/claude-code-skills-1c — 48 skills

Install

skills CLI npx skills add https://github.com/Desko77/claude-code-skills-1c/tree/main/skills/1c-query-optimization
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install desko77-claude-code-skills-1c@llmmart
Git git clone https://github.com/Desko77/claude-code-skills-1c.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole desko77/claude-code-skills-1c collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

1C Query Optimization Skill (Advanced Patterns)

Продвинутые паттерны оптимизации запросов. Базовые оптимизации (ВЫРАЗИТЬ, ПРЕДСТАВЛЕНИЕ, ВТ вместо подзапросов, ОБЪЕДИНИТЬ ВСЕ, индексы, СКД) - см. правило query-optimization-tips.md. Анти-паттерны (запрос в цикле, обращение через точку) - см. anti_patterns.md.

Validate Query via AI-EDT

Если сервер AI-EDT подключен (инструменты ai-edt доступны), проверяй оптимизированный запрос через validate_query - убедись, что после рефакторинга нет синтаксических/семантических ошибок. Для запросов СКД: dcsMode=true.

When to Use

Invoke this skill when:

  • Working with complex multi-step data processing
  • Optimizing joins and subqueries
  • Implementing DCS reports
  • Processing large datasets in portions

Temporary Tables - When to Use

Use temporary tables for:

  • Complex multi-step data processing
  • Joining data from multiple sources
  • Reusing intermediate results

Join vs Subquery (basic choice)

// PREFERRED: Join (usually faster)
"ВЫБРАТЬ
|	Заказы.Ссылка КАК Заказ,
|	Контрагенты.ИНН КАК ИНН
|ИЗ
|	Документ.ЗаказКлиента КАК Заказы
|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
|		ПО Заказы.Контрагент = Контрагенты.Ссылка"

// AVOID: Subquery in SELECT (N+1 problem)
"ВЫБРАТЬ
|	Заказы.Ссылка КАК Заказ,
|	(ВЫБРАТЬ К.ИНН ИЗ Справочник.Контрагенты КАК К
|	 ГДЕ К.Ссылка = Заказы.Контрагент) КАК ИНН
|ИЗ
|	Документ.ЗаказКлиента КАК Заказы"

Avoid Aggregation in Subqueries

// SLOW: Subquery with aggregation
"ВЫБРАТЬ
|	Номенклатура.Ссылка,
|	(ВЫБРАТЬ СУММА(Остатки.Количество) ...) КАК Остаток
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура"

// FAST: Join with pre-aggregated data
"ВЫБРАТЬ
|	Номенклатура.Ссылка КАК Номенклатура,
|	ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
|		ПО Номенклатура.Ссылка = Остатки.Номенклатура"

Reference: ITS Query Optimization Standards

Files (claude-code-skills-1c)
  • evals
    • evals.json 5.2 KB
      {
        "skill_name": "1c-query-optimization",
        "evals": [
          {
            "id": "cast-composite-type",
            "prompt": "Оптимизируй этот запрос — он обращается к полю Регистратор.Дата напрямую и работает медленно:\nВЫБРАТЬ ТоварыНаСкладах.Регистратор.Дата КАК ДатаДокумента ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах",
            "expected_output": "Запрос переписан с использованием ВЫРАЗИТЬ() для указания конкретного типа регистратора вместо разыменования составного типа.",
            "expectations": [
              "Предложена оптимизация: использование ВЫРАЗИТЬ(Регистратор КАК Документ.ИмяДокумента).Дата вместо прямого обращения через точку",
              "В оптимизированном запросе использована конструкция ВЫРАЗИТЬ(...) для конкретного типа документа",
              "Объяснено почему прямое обращение Регистратор.Дата создаёт JOIN со всеми типами регистраторов",
              "При наличии нескольких типов регистраторов предложен вариант с ВЫБОР/КОГДА/ССЫЛКА"
            ],
            "expect": [
              "ВЫРАЗИТЬ"
            ],
            "should_activate": true
          },
          {
            "id": "subquery-to-temp-table",
            "prompt": "Есть запрос с соединением с подзапросом — нужно оптимизировать:\nВЫБРАТЬ Заказы.Ссылка ИЗ Документ.ЗаказКлиента КАК Заказы ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Товары.Ссылка КАК Заказ, СУММА(Товары.Сумма) КАК Сумма ИЗ Документ.ЗаказКлиента.Товары КАК Товары СГРУППИРОВАТЬ ПО Товары.Ссылка) КАК Итоги ПО Заказы.Ссылка = Итоги.Заказ",
            "expected_output": "Подзапрос вынесен во временную таблицу с ИНДЕКСИРОВАТЬ ПО, соединение переписано с использованием временной таблицы.",
            "expectations": [
              "Предложена оптимизация: замена подзапроса в JOIN на временную таблицу",
              "Оптимизированный запрос содержит конструкцию ПОМЕСТИТЬ с именем временной таблицы",
              "Временная таблица содержит директиву ИНДЕКСИРОВАТЬ ПО по полю соединения",
              "Основной запрос использует временную таблицу вместо подзапроса"
            ],
            "expect": [
              "ПОМЕСТИТЬ",
              "ИНДЕКСИРОВАТЬ ПО"
            ],
            "forbid": [
              "ЛЕВОЕ СОЕДИНЕНИЕ\\s*\\(\\s*ВЫБРАТЬ[\\s\\S]{0,400}\\)\\s*КАК[\\s\\S]{0,200}$"
            ],
            "should_activate": true
          },
          {
            "id": "filter-in-virtual-table",
            "prompt": "Запрос получает остатки через виртуальную таблицу, но фильтрует их потом в ГДЕ — как правильно?\nВЫБРАТЬ Остатки.Номенклатура, Остатки.КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата) КАК Остатки ГДЕ Остатки.Номенклатура В (&СписокНоменклатуры)",
            "expected_output": "Фильтрация перенесена в параметры виртуальной таблицы. Объяснено почему фильтр в ГДЕ работает медленнее.",
            "expectations": [
              "Предложена оптимизация: перенос условия фильтрации в параметры виртуальной таблицы .Остатки(&Дата, Номенклатура В (&СписокНоменклатуры))",
              "В оптимизированном запросе условие присутствует внутри скобок виртуальной таблицы, а не в ГДЕ",
              "Объяснено что фильтр в ГДЕ применяется после получения всех остатков, а параметр виртуальной таблицы — до",
              "При необходимости соединения с другими таблицами предложено предварительно поместить остатки во временную таблицу"
            ],
            "expect": [
              "Остатки\\s*\\(",
              "&|Номенклатура"
            ],
            "forbid": [
              "^\\s*ГДЕ\\s+Остатки\\."
            ],
            "should_activate": true
          }
        ]
      }
      
  • SKILL.md 3.1 KB
    ---
    name: 1c-query-optimization
    description: "Advanced query patterns for 1C: temporary tables, joins, DCS optimization. Use for complex queries beyond basic rules in query-optimization-tips.md."
    ---
    
    # 1C Query Optimization Skill (Advanced Patterns)
    
    Продвинутые паттерны оптимизации запросов. Базовые оптимизации (ВЫРАЗИТЬ, ПРЕДСТАВЛЕНИЕ, ВТ вместо подзапросов, ОБЪЕДИНИТЬ ВСЕ, индексы, СКД) - см. правило `query-optimization-tips.md`. Анти-паттерны (запрос в цикле, обращение через точку) - см. `anti_patterns.md`.
    
    ## Validate Query via AI-EDT
    
    Если сервер AI-EDT подключен (инструменты `ai-edt` доступны), проверяй оптимизированный запрос через `validate_query` - убедись, что после рефакторинга нет синтаксических/семантических ошибок. Для запросов СКД: `dcsMode=true`.
    
    ## When to Use
    
    Invoke this skill when:
    - Working with complex multi-step data processing
    - Optimizing joins and subqueries
    - Implementing DCS reports
    - Processing large datasets in portions
    
    ## Temporary Tables - When to Use
    
    Use temporary tables for:
    - Complex multi-step data processing
    - Joining data from multiple sources
    - Reusing intermediate results
    
    ### Join vs Subquery (basic choice)
    
    ```bsl
    // PREFERRED: Join (usually faster)
    "ВЫБРАТЬ
    |	Заказы.Ссылка КАК Заказ,
    |	Контрагенты.ИНН КАК ИНН
    |ИЗ
    |	Документ.ЗаказКлиента КАК Заказы
    |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    |		ПО Заказы.Контрагент = Контрагенты.Ссылка"
    
    // AVOID: Subquery in SELECT (N+1 problem)
    "ВЫБРАТЬ
    |	Заказы.Ссылка КАК Заказ,
    |	(ВЫБРАТЬ К.ИНН ИЗ Справочник.Контрагенты КАК К
    |	 ГДЕ К.Ссылка = Заказы.Контрагент) КАК ИНН
    |ИЗ
    |	Документ.ЗаказКлиента КАК Заказы"
    ```
    
    ### Avoid Aggregation in Subqueries
    
    ```bsl
    // SLOW: Subquery with aggregation
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка,
    |	(ВЫБРАТЬ СУММА(Остатки.Количество) ...) КАК Остаток
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура"
    
    // FAST: Join with pre-aggregated data
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Номенклатура,
    |	ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
    |		ПО Номенклатура.Ссылка = Остатки.Номенклатура"
    ```
    
    ---
    
    **Reference**: [ITS Query Optimization Standards](https://its.1c.ru/db/v8std/browse/13/-1/26/28)
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related