Введение
Оптимизация запросов в 1С:Предприятие — это критически важный навык для любого разработчика. Неоптимизированные запросы могут значительно замедлить работу системы, особенно при работе с большими объемами данных. В этой статье мы рассмотрим основные методы оптимизации запросов и практические примеры их применения.
1. Использование индексов
Индексы — это один из самых эффективных способов ускорения запросов. Правильно созданные индексы могут сократить время выполнения запроса в десятки раз.
Когда использовать индексы:
- Для полей, которые часто используются в условиях WHERE
- Для полей, участвующих в соединениях (JOIN)
- Для полей, по которым выполняется сортировка (ORDER BY)
Пример создания индекса:
ВЫБРАТЬ
СправочникНоменклатура.Ссылка КАК Номенклатура,
СправочникНоменклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатура
ГДЕ
СправочникНоменклатура.Артикул = &Артикул
И СправочникНоменклатура.ПометкаУдаления = ЛОЖЬ
Для такого запроса рекомендуется создать индекс по полям Артикул и ПометкаУдаления.
2. Оптимизация условий WHERE
Порядок условий в WHERE может существенно влиять на производительность. Следуйте этим правилам:
- Используйте наиболее селективные условия первыми — условия, которые отсеивают больше записей, должны быть в начале
- Избегайте функций в условиях — использование функций в WHERE может препятствовать использованию индексов
- Используйте параметры вместо констант — это позволяет СУБД лучше оптимизировать запрос
Плохой пример:
ВЫБРАТЬ
ДокументРеализацияТоваровУслуг.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализацияТоваровУслуг
ГДЕ
ГОД(ДокументРеализацияТоваровУслуг.Дата) = 2024
И МЕСЯЦ(ДокументРеализацияТоваровУслуг.Дата) = 12
Хороший пример:
ВЫБРАТЬ
ДокументРеализацияТоваровУслуг.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализацияТоваровУслуг
ГДЕ
ДокументРеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
3. Оптимизация соединений (JOIN)
Правильная организация соединений таблиц — ключ к производительности сложных запросов.
Рекомендации:
- Соединяйте таблицы в порядке увеличения размера — начинайте с самых маленьких таблиц
- Используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ВНЕШНЕЕ — когда это возможно
- Применяйте условия соединения в самом запросе — не переносите их в WHERE
Пример оптимизированного соединения:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.Дата,
Номенклатура.Наименование,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
ПО РеализацияТоваровУслуг.Ссылка = Товары.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО Товары.Номенклатура = Номенклатура.Ссылка
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И РеализацияТоваровУслуг.Проведен = ИСТИНА
4. Использование временных таблиц
Для сложных запросов с множественными подзапросами эффективнее использовать временные таблицы. Это позволяет:
- Разбить сложный запрос на несколько простых
- Использовать промежуточные результаты несколько раз
- Улучшить читаемость кода
Пример использования временных таблиц:
// Создаем временную таблицу с отфильтрованными документами
ВРЕМЕННЫЕ ТАБЛИЦЫ
ДокументыДляОтчета
ВЫБРАТЬ
ДокументРеализацияТоваровУслуг.Ссылка
ПОМЕСТИТЬ ДокументыДляОтчета
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализацияТоваровУслуг
ГДЕ
ДокументРеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И ДокументРеализацияТоваровУслуг.Проведен = ИСТИНА;
// Используем временную таблицу в основном запросе
ВЫБРАТЬ
ДокументыДляОтчета.Ссылка,
Товары.Номенклатура,
Товары.Количество
ИЗ
ДокументыДляОтчета КАК ДокументыДляОтчета
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
ПО ДокументыДляОтчета.Ссылка = Товары.Ссылка
5. Избегание подзапросов в SELECT
Подзапросы в списке выборки выполняются для каждой строки результата, что может значительно замедлить запрос.
Плохой пример:
ВЫБРАТЬ
Реализация.Ссылка,
(ВЫБРАТЬ СУММА(Товары.Сумма) ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары ГДЕ Товары.Ссылка = Реализация.Ссылка) КАК СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Хороший пример:
ВЫБРАТЬ
Реализация.Ссылка,
СУММА(Товары.Сумма) КАК СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
ПО Реализация.Ссылка = Товары.Ссылка
СГРУППИРОВАТЬ ПО
Реализация.Ссылка
6. Использование пакетных запросов
Для обработки больших объемов данных используйте пакетные запросы вместо обработки всех записей сразу.
Пример пакетной обработки:
// В коде 1С
Запрос = Новый Запрос;
Запрос.Текст = "
ВЫБРАТЬ ПЕРВЫЕ 1000
ДокументРеализация.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализация
ГДЕ
ДокументРеализация.Ссылка > &ПоследняяОбработаннаяСсылка
УПОРЯДОЧИТЬ ПО
ДокументРеализация.Ссылка";
Пока Истина Цикл
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
// Обработка пакета записей
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка документа
КонецЦикла;
ПоследняяОбработаннаяСсылка = Выборка.Ссылка;
КонецЦикла;
7. Анализ плана выполнения запроса
Используйте инструменты анализа плана выполнения запроса для выявления узких мест.
Как проанализировать план выполнения:
- Откройте запрос в конфигураторе
- Нажмите кнопку "План запроса"
- Обратите внимание на операции с высокими затратами
- Ищите операции "Полное сканирование таблицы" — это признак отсутствия индекса
8. Практические рекомендации
Чек-лист оптимизации запроса:
- ✓ Проверьте наличие индексов для полей в WHERE и JOIN
- ✓ Убедитесь, что условия WHERE используют индексированные поля
- ✓ Избегайте функций в условиях WHERE (ГОД, МЕСЯЦ, ДЕНЬ и т.д.)
- ✓ Используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ВНЕШНЕГО, когда возможно
- ✓ Замените подзапросы в SELECT на JOIN с группировкой
- ✓ Используйте временные таблицы для сложных запросов
- ✓ Применяйте пакетную обработку для больших объемов данных
- ✓ Анализируйте план выполнения запроса
Заключение
Оптимизация запросов в 1С — это итеративный процесс. Начните с анализа самых медленных запросов, примените описанные методы и измерьте результат. Помните, что преждевременная оптимизация может быть вредна — оптимизируйте только те запросы, которые действительно вызывают проблемы с производительностью. При этом не забывайте, что новые версии платформы нередко улучшают оптимизатор запросов — подробнее о том, как самостоятельно обновить конфигурацию 1С, написано в отдельной статье.
Если у вас возникли вопросы по оптимизации запросов или нужна помощь в повышении производительности вашей конфигурации 1С, свяжитесь со мной — я помогу найти и устранить узкие места в вашей системе. Кстати, для рутинной работы с запросами стоит присмотреться к AI-инструментам — в обзоре 1С:Напарник для разработки разобрал, что он умеет на практике.


