Как оптимизировать запросы в 1С: практические советы и реальные кейсы

Оптимизация запросов — одна из самых важных задач программиста 1С.
Даже правильно написанный функционал может тормозить, если запросы составлены неэффективно.
В крупных системах — УТ, ERP, БП — медленные запросы приводят к:

  • зависаниям рабочих мест;
  • увеличению времени проведения документов;
  • медленной загрузке отчетов;
  • блокировкам таблиц;
  • перерасходу ресурсов сервера;
  • проблемам при интеграциях и обменах.

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


Почему некоторые запросы в 1С работают медленно

Основные причины:

  • неправильные соединения таблиц;
  • неиспользование индексов;
  • обращение к большим объемам данных без условий;
  • некорректное использование временных таблиц;
  • лишние вычисления в запросе;
  • объединение большого количества таблиц;
  • подзапросы, которые выполняются для каждой строки;
  • тяжелые запросы внутри циклов;
  • отсутствие агрегирования на уровне запроса.

Даже одна ошибка может замедлить работу документа в 10–40 раз.


Правило №1: всегда указывать условия отбора

На производственных базах бывают таблицы:

  • регистров,
  • документов,
  • движений,
  • виртуальных таблиц.

Каждая может содержать миллионы строк.

Нельзя писать запросы вида:

ВЫБРАТЬ
    *
ИЗ
    РегистрНакопления.Движения ТАК КАК Движения

Это приведет к полной выборке регистра.
Нужно всегда указывать:

  • период,
  • вид движения,
  • измерения,
  • аналитики.

Правило №2: минимизировать количество соединений

Многие начинающие программисты добавляют соединения «на всякий случай».
Каждое новое соединение увеличивает:

  • объем данных,
  • нагрузку на СУБД,
  • время выполнения.

Если значение не используется — соединения быть не должно.


Правило №3: использовать правильный тип соединения

❌ Неправильно:

ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Т2

Даже если известно, что запись всегда есть.

✔ Правильно:

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2 КАК Т2

Внутреннее соединение работает быстрее.


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

Временные таблицы позволяют:

  • сортировать,
  • агрегировать,
  • фильтровать данные.

Но многие программисты создают их без необходимости.
Если можно решить сложную выборку одним запросом — решайте одним.


Правило №5: агрегирование должно выполняться на уровне запроса

Не нужно выбирать строки в код и агрегировать там.
Пример ошибки:

Запрос.Выполнить();
Для Каждого Строка Из Результат Цикл
    Итог = Итог + Строка.Сумма;
КонецЦикла;

Правильно:

ВЫБРАТЬ
    СУММА(Сумма) КАК Итог
ИЗ Таблица

Это быстрее на порядки.


Правило №6: избегать запросов внутри циклов

Худшая конструкция:

Для Каждого Элемент Из Таблица Цикл
    Запрос.Текст = "...";
    Запрос.Выполнить();
КонецЦикла;

Запросы в цикле — источник катастрофы.


Правило №7: проверять использование индексов

СУБД создаёт индексы на:

  • ключах таблиц;
  • измерениях регистров;
  • периодах;
  • ссылочных полях.

Если отбор не используется по индексам — таблица просматривается целиком.
Запрос читается медленно.


Практические примеры оптимизации


Пример 1. Медленный отчет по продажам

Исходная проблема:
Отчет формируется 30–45 секунд.

Причина:
Использовалось ненужное левое соединение на справочник «Контрагенты».
После замены на внутреннее соединение и добавления периода — 0,8 секунды.


Пример 2. Медленная выгрузка остатков

Выгрузка занимала 5 минут.
В запросе отсутствовало условие по складу.
Добавили:

ГДЕ Движения.Склад = &Склад

Время выполнения: 7 секунд.


Пример 3. Документ «Реализация» проводился 12 секунд

Проверка показала подзапрос внутри подзапроса.

После выноса части логики во временную таблицу — 1,6 секунды.


Пример 4. Большие временные таблицы

Временная таблица содержала более 2 млн строк.
В реальности требовалось только 4% данных.

После добавления отбора — ускорение до 20 раз.


Пример 5. Использование «НЕ» в условиях

Условие:

ГДЕ Таблица.Тип НЕ В (&СписокТипов)

приводило к полной выборке.
Заменили на явный список — ускорение с 9 секунд до 1,2.


Инструменты анализа запросов

1С предоставляет инструменты:

✔ «План запроса»

Показывает, как СУБД выполняет запрос.

✔ «Трассировка запросов»

Позволяет отслеживать, какие запросы вызывают нагрузку.

✔ Mode = «ПолучитьSQL»

Можно анализировать SQL-код на стороне СУБД.

✔ Монитор производительности

Отображает самые тяжелые запросы.


ТОP-ошибки программистов

❌ выбирать * вместо конкретных полей
❌ сортировать данные без необходимости
❌ использовать подзапросы вместо соединений
❌ не указывать период
❌ формировать временные таблицы без индексов
❌ игнорировать виртуальные таблицы
❌ делать расчет данных в коде, а не в запросе


Краткий чек-лист оптимизации запроса

  • есть условие по периоду?
  • есть отбор по ключевым аналитикам?
  • нет лишних таблиц?
  • нет тяжелых подзапросов?
  • используется правильное соединение?
  • агрегирование происходит на уровне запроса?
  • индексы используются?
  • нет запросов в цикле?

Вывод

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

Грамотно оптимизированный запрос — это не только быстрый код, но и стабильная работа системы, удовлетворённые пользователи и отсутствие жалоб от бизнеса.

Вам также могут понравиться эти