Как оптимизировать запросы в 1С: практическое руководство

Как оптимизировать запросы в 1С: практическое руководство

Введение

Оптимизация запросов в 1С:Предприятие — это критически важный навык для любого разработчика. Неоптимизированные запросы могут значительно замедлить работу системы, особенно при работе с большими объемами данных. В этой статье мы рассмотрим основные методы оптимизации запросов и практические примеры их применения.

1. Использование индексов

Индексы — это один из самых эффективных способов ускорения запросов. Правильно созданные индексы могут сократить время выполнения запроса в десятки раз.

Когда использовать индексы:

  • Для полей, которые часто используются в условиях WHERE
  • Для полей, участвующих в соединениях (JOIN)
  • Для полей, по которым выполняется сортировка (ORDER BY)
Схема работы индексов

Пример создания индекса:

ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Номенклатура,
    СправочникНоменклатура.Наименование КАК Наименование
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
ГДЕ
    СправочникНоменклатура.Артикул = &Артикул
    И СправочникНоменклатура.ПометкаУдаления = ЛОЖЬ

Для такого запроса рекомендуется создать индекс по полям Артикул и ПометкаУдаления.

2. Оптимизация условий WHERE

Порядок условий в WHERE может существенно влиять на производительность. Следуйте этим правилам:

  • Используйте наиболее селективные условия первыми — условия, которые отсеивают больше записей, должны быть в начале
  • Избегайте функций в условиях — использование функций в WHERE может препятствовать использованию индексов
  • Используйте параметры вместо констант — это позволяет СУБД лучше оптимизировать запрос
Оптимизация условий WHERE

Плохой пример:

ВЫБРАТЬ
    ДокументРеализацияТоваровУслуг.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК ДокументРеализацияТоваровУслуг
ГДЕ
    ГОД(ДокументРеализацияТоваровУслуг.Дата) = 2024
    И МЕСЯЦ(ДокументРеализацияТоваровУслуг.Дата) = 12

Хороший пример:

ВЫБРАТЬ
    ДокументРеализацияТоваровУслуг.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК ДокументРеализацияТоваровУслуг
ГДЕ
    ДокументРеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

3. Оптимизация соединений (JOIN)

Правильная организация соединений таблиц — ключ к производительности сложных запросов.

Рекомендации:

  • Соединяйте таблицы в порядке увеличения размера — начинайте с самых маленьких таблиц
  • Используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ВНЕШНЕЕ — когда это возможно
  • Применяйте условия соединения в самом запросе — не переносите их в WHERE
Оптимизация соединений

Пример оптимизированного соединения:

ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка,
    РеализацияТоваровУслуг.Дата,
    Номенклатура.Наименование,
    Товары.Количество,
    Товары.Сумма
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
    ПО РеализацияТоваровУслуг.Ссылка = Товары.Ссылка
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
    ПО Товары.Номенклатура = Номенклатура.Ссылка
ГДЕ
    РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И РеализацияТоваровУслуг.Проведен = ИСТИНА

4. Использование временных таблиц

Для сложных запросов с множественными подзапросами эффективнее использовать временные таблицы. Это позволяет:

  • Разбить сложный запрос на несколько простых
  • Использовать промежуточные результаты несколько раз
  • Улучшить читаемость кода
Использование временных таблиц

Пример использования временных таблиц:

// Создаем временную таблицу с отфильтрованными документами
ВРЕМЕННЫЕ ТАБЛИЦЫ
    ДокументыДляОтчета

ВЫБРАТЬ
    ДокументРеализацияТоваровУслуг.Ссылка
ПОМЕСТИТЬ ДокументыДляОтчета
ИЗ
    Документ.РеализацияТоваровУслуг КАК ДокументРеализацияТоваровУслуг
ГДЕ
    ДокументРеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ДокументРеализацияТоваровУслуг.Проведен = ИСТИНА;

// Используем временную таблицу в основном запросе
ВЫБРАТЬ
    ДокументыДляОтчета.Ссылка,
    Товары.Номенклатура,
    Товары.Количество
ИЗ
    ДокументыДляОтчета КАК ДокументыДляОтчета
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
    ПО ДокументыДляОтчета.Ссылка = Товары.Ссылка

5. Избегание подзапросов в SELECT

Подзапросы в списке выборки выполняются для каждой строки результата, что может значительно замедлить запрос.

Плохой пример:

ВЫБРАТЬ
    Реализация.Ссылка,
    (ВЫБРАТЬ СУММА(Товары.Сумма) ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары ГДЕ Товары.Ссылка = Реализация.Ссылка) КАК СуммаДокумента
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация

Хороший пример:

ВЫБРАТЬ
    Реализация.Ссылка,
    СУММА(Товары.Сумма) КАК СуммаДокумента
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
    ПО Реализация.Ссылка = Товары.Ссылка
СГРУППИРОВАТЬ ПО
    Реализация.Ссылка

6. Использование пакетных запросов

Для обработки больших объемов данных используйте пакетные запросы вместо обработки всех записей сразу.

Пакетная обработка

Пример пакетной обработки:

// В коде 1С
Запрос = Новый Запрос;
Запрос.Текст = "
ВЫБРАТЬ ПЕРВЫЕ 1000
    ДокументРеализация.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК ДокументРеализация
ГДЕ
    ДокументРеализация.Ссылка > &ПоследняяОбработаннаяСсылка
УПОРЯДОЧИТЬ ПО
    ДокументРеализация.Ссылка";

Пока Истина Цикл
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Прервать;
    КонецЕсли;
    
    // Обработка пакета записей
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        // Обработка документа
    КонецЦикла;
    
    ПоследняяОбработаннаяСсылка = Выборка.Ссылка;
КонецЦикла;

7. Анализ плана выполнения запроса

Используйте инструменты анализа плана выполнения запроса для выявления узких мест.

Как проанализировать план выполнения:

  1. Откройте запрос в конфигураторе
  2. Нажмите кнопку "План запроса"
  3. Обратите внимание на операции с высокими затратами
  4. Ищите операции "Полное сканирование таблицы" — это признак отсутствия индекса
План выполнения запроса

8. Практические рекомендации

Чек-лист оптимизации запроса:

  • ✓ Проверьте наличие индексов для полей в WHERE и JOIN
  • ✓ Убедитесь, что условия WHERE используют индексированные поля
  • ✓ Избегайте функций в условиях WHERE (ГОД, МЕСЯЦ, ДЕНЬ и т.д.)
  • ✓ Используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ВНЕШНЕГО, когда возможно
  • ✓ Замените подзапросы в SELECT на JOIN с группировкой
  • ✓ Используйте временные таблицы для сложных запросов
  • ✓ Применяйте пакетную обработку для больших объемов данных
  • ✓ Анализируйте план выполнения запроса

Заключение

Оптимизация запросов в 1С — это итеративный процесс. Начните с анализа самых медленных запросов, примените описанные методы и измерьте результат. Помните, что преждевременная оптимизация может быть вредна — оптимизируйте только те запросы, которые действительно вызывают проблемы с производительностью. При этом не забывайте, что новые версии платформы нередко улучшают оптимизатор запросов — подробнее о том, как самостоятельно обновить конфигурацию 1С, написано в отдельной статье.

Если у вас возникли вопросы по оптимизации запросов или нужна помощь в повышении производительности вашей конфигурации 1С, свяжитесь со мной — я помогу найти и устранить узкие места в вашей системе. Кстати, для рутинной работы с запросами стоит присмотреться к AI-инструментам — в обзоре 1С:Напарник для разработки разобрал, что он умеет на практике.