$npx -y skills add Arman-Kudaibergenov/1c-ai-development-kit --skill 1c-query-optЭтот скилл MUST быть вызван для оптимизации запросов 1С: временные таблицы, JOIN vs подзапросы, параметры виртуальных таблиц, СКД, индексы. SHOULD также вызывать при медленных запросах и диагностике производительности. Do NOT использовать для базового синтаксиса запросов — исполь
| 1 | # /1c-query-opt — Оптимизация запросов 1С |
| 2 | |
| 3 | Продвинутые паттерны оптимизации запросов за пределами базовых правил. |
| 4 | |
| 5 | ## Когда использовать |
| 6 | |
| 7 | - Сложная многошаговая обработка данных |
| 8 | - Оптимизация JOIN и подзапросов |
| 9 | - Работа с отчётами СКД |
| 10 | - Обработка больших объёмов данных |
| 11 | |
| 12 | ## Временные таблицы |
| 13 | |
| 14 | ### JOIN vs Подзапрос |
| 15 | |
| 16 | ```bsl |
| 17 | // ПРАВИЛЬНО: JOIN (обычно быстрее) |
| 18 | "ВЫБРАТЬ |
| 19 | | Заказы.Ссылка, Контрагенты.ИНН |
| 20 | |ИЗ Документ.ЗаказКлиента КАК Заказы |
| 21 | | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты |
| 22 | | ПО Заказы.Контрагент = Контрагенты.Ссылка" |
| 23 | |
| 24 | // ПЛОХО: Подзапрос в SELECT (N+1) |
| 25 | "ВЫБРАТЬ |
| 26 | | Заказы.Ссылка, |
| 27 | | (ВЫБРАТЬ К.ИНН ИЗ Справочник.Контрагенты КАК К |
| 28 | | ГДЕ К.Ссылка = Заказы.Контрагент) КАК ИНН |
| 29 | |ИЗ Документ.ЗаказКлиента КАК Заказы" |
| 30 | ``` |
| 31 | |
| 32 | ### Никогда не JOIN с подзапросами — используй временные таблицы |
| 33 | |
| 34 | ```bsl |
| 35 | // ПЛОХО: JOIN с подзапросом |
| 36 | "... ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ... СГРУППИРОВАТЬ ПО ...) КАК Итоги ..." |
| 37 | |
| 38 | // ПРАВИЛЬНО: Временная таблица + JOIN |
| 39 | "ВЫБРАТЬ ... ПОМЕСТИТЬ ВТИтоги ... ИНДЕКСИРОВАТЬ ПО ...; |
| 40 | ВЫБРАТЬ ... ИЗ ... ЛЕВОЕ СОЕДИНЕНИЕ ВТИтоги ..." |
| 41 | ``` |
| 42 | |
| 43 | ## Параметры виртуальных таблиц |
| 44 | |
| 45 | ```bsl |
| 46 | // ПРАВИЛЬНО: Фильтр В ПАРАМЕТРАХ виртуальной таблицы |
| 47 | "ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки( |
| 48 | | &Дата, Номенклатура В (&Список)) КАК Остатки" |
| 49 | |
| 50 | // ПЛОХО: Виртуальная таблица + ГДЕ |
| 51 | "ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата) КАК Остатки |
| 52 | |ГДЕ Остатки.Номенклатура В (&Список)" |
| 53 | ``` |
| 54 | |
| 55 | ## Составные типы — ВЫРАЗИТЬ |
| 56 | |
| 57 | ```bsl |
| 58 | // ПЛОХО: Разыменование составного типа (запрос по ВСЕМ типам) |
| 59 | "ВЫБРАТЬ ТоварыНаСкладах.Регистратор.Дата" |
| 60 | |
| 61 | // ПРАВИЛЬНО: ВЫРАЗИТЬ к конкретному типу |
| 62 | "ВЫБРАТЬ ВЫРАЗИТЬ(ТоварыНаСкладах.Регистратор |
| 63 | | КАК Документ.ПоступлениеТоваровУслуг).Дата" |
| 64 | ``` |
| 65 | |
| 66 | ## ПРЕДСТАВЛЕНИЕ для отображения |
| 67 | |
| 68 | ```bsl |
| 69 | // ПЛОХО: Доп. JOIN через точку |
| 70 | "ВЫБРАТЬ ТоварыНаСкладах.Склад.Наименование" |
| 71 | |
| 72 | // ПРАВИЛЬНО: Без доп. JOIN |
| 73 | "ВЫБРАТЬ ПРЕДСТАВЛЕНИЕ(ТоварыНаСкладах.Склад) КАК Склад" |
| 74 | ``` |
| 75 | |
| 76 | ## ИЛИ в ГДЕ → ОБЪЕДИНИТЬ ВСЕ |
| 77 | |
| 78 | ```bsl |
| 79 | // ПЛОХО: ИЛИ блокирует индексы |
| 80 | "ГДЕ Товары.Артикул = &Артикул ИЛИ Товары.Код = &Код" |
| 81 | |
| 82 | // ПРАВИЛЬНО: Два запроса с ОБЪЕДИНИТЬ ВСЕ |
| 83 | "ВЫБРАТЬ ... ГДЕ Товары.Артикул = &Артикул |
| 84 | |ОБЪЕДИНИТЬ ВСЕ |
| 85 | |ВЫБРАТЬ ... ГДЕ Товары.Код = &Код" |
| 86 | ``` |
| 87 | |
| 88 | ## ОБЪЕДИНИТЬ vs ОБЪЕДИНИТЬ ВСЕ |
| 89 | |
| 90 | Всегда `ОБЪЕДИНИТЬ ВСЕ` если не нужно удалять дубликаты (быстрее — нет группировки). |
| 91 | |
| 92 | ## Виртуальные таблицы — сначала во временную |
| 93 | |
| 94 | ```bsl |
| 95 | // ПРАВИЛЬНО: Сначала извлечь, потом JOIN |
| 96 | "ВЫБРАТЬ ... ПОМЕСТИТЬ ВТОстатки |
| 97 | |ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата,) ИНДЕКСИРОВАТЬ ПО Номенклатура; |
| 98 | |ВЫБРАТЬ ... ИЗ Справочник.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки ..." |
| 99 | ``` |
| 100 | |
| 101 | ## Индексы |
| 102 | |
| 103 | 1. Индекс должен содержать **все поля** условия |
| 104 | 2. Поля должны быть **в начале** индекса |
| 105 | 3. Поля должны быть **последовательными** (без пропусков) |
| 106 | 4. `ИНДЕКСИРОВАТЬ ПО` для временных таблиц при JOIN |
| 107 | |
| 108 | --- |
| 109 | |
| 110 | **Справка**: [Стандарты ITS по оптимизации запросов](https://its.1c.ru/db/v8std/browse/13/-1/26/28) |