Статья #8
Анализ и оптимизация запросов в 1С с помощью AI
Проблема производительности
Медленные запросы — частая причина проблем с производительностью 1С:
- Отсутствие индексов
- Избыточные соединения
- Неоптимальные условия
- Использование виртуальных таблиц без необходимости
AI-анализ запросов
1. Автоматическое выявление проблем
"Проанализируй этот запрос и найди проблемы производительности:
ВЫБРАТЬ
Документы.Номер,
(ВЫБРАТЬ СУММА(ДвиженияТоваров.Количество)
ИЗ РегистрНакопления.ДвиженияТоваров
ГДЕ ДвиженияТоваров.Регистратор = Документы.Ссылка) КАК Количество
ИЗ
Документ.РеализацияТоваров КАК Документы
Предложи оптимизированную версию."
Ответ Claude Code:
Проблемы:
1. Коррелированный подзапрос выполняется для каждой строки
2. Отсутствует индекс по полю Регистратор
3. Можно использовать JOIN вместо подзапроса
Оптимизированная версия:
ВЫБРАТЬ
Документы.Номер,
ЕСТЬNULL(ДвиженияТоваров.КоличествоОборот, 0) КАК Количество
ИЗ
Документ.РеализацияТоваров КАК Документы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияТоваров.Обороты(,,Регистратор,) КАК ДвиженияТоваров
ПО Документы.Ссылка = ДвиженияТоваров.Регистратор
2. MCP-сервер для мониторинга запросов
// query-performance-mcp.js
class QueryPerformanceServer {
async analyzeSlowQueries() {
// Получение медленных запросов из ТЖ
const slowQueries = await this.getSlowQueries();
// AI анализ каждого запроса
for (const query of slowQueries) {
const analysis = await claude.analyzeQuery({
query: query.text,
executionTime: query.duration,
context: query.context
});
await this.suggestOptimizations(analysis);
}
}
}
3. Генерация индексов
"Проанализируй эти запросы и предложи индексы для оптимизации:
[список запросов из ТЖ]
Учти, что избыточное индексирование тоже вредно."
4. Рефакторинг сложных запросов
"Разбей этот сложный запрос на несколько простых временных таблиц
для улучшения читаемости и возможной оптимизации планировщиком."
5. Автоматические отчеты
"Создай еженедельный отчет по производительности запросов:
- Топ-10 самых медленных
- Тренды изменения производительности
- Рекомендации по оптимизации"
Практический пример
// До оптимизации: 45 секунд
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Номенклатура КАК Товары
|ГДЕ
| Товары.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| Продажи.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК Продажи
| ГДЕ
| Продажи.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон)";
// После оптимизации AI: 2 секунды
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Товары.Наименование
|ИЗ
| Документ.РеализацияТоваров КАК Реализация
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.Товары КАК РеализацияТовары
| ПО Реализация.Ссылка = РеализацияТовары.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
| ПО РеализацияТовары.Номенклатура = Товары.Ссылка
|ГДЕ
| Реализация.Дата МЕЖДУ &ДатаНач И &ДатаКон";
Результаты
- Ускорение запросов: в среднем 5-10x
- Снижение нагрузки на СУБД: 30-50%
- Улучшение user experience