Оптимизация запросов в 1С: практические приёмы и примеры

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

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


Почему запросы тормозят

Основные причины низкой производительности:

  1. Избыточные соединения таблиц.
  2. Использование временных таблиц без индексации.
  3. Подзапросы в цикле.
  4. Отсутствие ограничений по выборке (нет ГДЕ, ТОП или ПЕРВЫЕ).
  5. Неоптимальные условия отбора (например, функции в условии).

Пример неудачного запроса

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

Проблема:

  1. Используется фильтр ПОДОБНО "%строка%" — это лишает СУБД возможности использовать индексы.
  2. Подключается вложенный объект «Товары.Номенклатура» напрямую, что создаёт множественные соединения.

Как исправить

Используем предвыборку и параметризацию:

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

А в коде модуля задаём:

Запрос.УстановитьПараметр("Поиск", "%кабель%");

Так СУБД может оптимизировать план выполнения, а объём выборки сократится.

Приём 1. Минимизируйте подзапросы

Если можно объединить данные через СОЕДИНЕНИЕ, не используйте вложенные ВЫБРАТЬ.
Подзапросы создают временные таблицы, а значит — замедляют обработку.

Приём 2. Используйте поля-индексы

При фильтрации по дате, ссылке или регистратору убедитесь, что поля индексируются.
Например, Дата, Период, Регистратор по умолчанию индексируются, а вот вычисляемые поля — нет.

Приём 3. Добавляйте ограничения выборки

Если вы формируете отчёт, не нужно выбирать все записи за 5 лет.
Используйте ГДЕ Период >= &ДатаНачала И Период <= &ДатаКонца.
Или добавьте ПЕРВЫЕ 1000 для отладки, чтобы быстро оценить результат.

Приём 4. Избегайте функций в условиях

Пример ошибки:

ГДЕ МЕСЯЦ(Продажи.Дата) = 5

Функция МЕСЯЦ() не использует индекс, и запрос сканирует всю таблицу.


Лучше задавать диапазон:

ГДЕ Продажи.Дата МЕЖДУ &НачалоМая И &КонецМая

Приём 5. Используйте временные таблицы осознанно

Временные таблицы полезны, если они сокращают общий объём выборки.
Но если вы просто копируете данные без агрегирования — вы лишь увеличиваете нагрузку.

Приём 6. Анализируйте план выполнения

Запускайте запрос в Конструкторе запросов и включайте анализ плана.
1С покажет, какие таблицы читаются, сколько строк обработано, где узкие места.

Приём 7. Используйте агрегаты правильно

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

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

Это избавит от ненужных обработок на уровне клиентского кода.

Пример из практики

В одной торговой компании отчёт по продажам за квартал формировался 3,5 минуты.
После оптимизации:

  • убрали подзапросы;
  • добавили фильтрацию по периоду;
  • вынесли расчёт агрегатов на уровень SQL.
    Результат — время выполнения сократилось до 18 секунд, а нагрузка на сервер уменьшилась на 40%.

Инструменты, которые помогут

  • Запрос.Текст — для отладки текста запроса.
  • Консоль запросов (Add-in) — визуальный анализ производительности.
  • Журнал регистрации — отслеживание долгих операций.
  • xUnitFor1C — для автотестирования оптимизированных модулей.

Вывод

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

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