Запросы — сердце любой 1С-конфигурации. От их эффективности зависит скорость формирования отчётов, расчёт регистров, обработка документов и производительность системы в целом.
Неправильно написанный запрос может замедлить работу базы в десятки раз.
Поэтому для разработчика 1С умение оптимизировать запросы — не просто полезный навык, а необходимость.
Почему запросы тормозят
Основные причины низкой производительности:
- Избыточные соединения таблиц.
- Использование временных таблиц без индексации.
- Подзапросы в цикле.
- Отсутствие ограничений по выборке (нет
ГДЕ,ТОПилиПЕРВЫЕ). - Неоптимальные условия отбора (например, функции в условии).
Пример неудачного запроса
ВЫБРАТЬ
Продажи.Ссылка,
Продажи.Дата,
Продажи.Покупатель.Наименование,
Продажи.Товары.Номенклатура.Наименование КАК Товар
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
ГДЕ
Продажи.Товары.Номенклатура.Наименование ПОДОБНО "%кабель%"
Проблема:
- Используется фильтр
ПОДОБНО "%строка%"— это лишает СУБД возможности использовать индексы. - Подключается вложенный объект «Товары.Номенклатура» напрямую, что создаёт множественные соединения.
Как исправить
Используем предвыборку и параметризацию:
ВЫБРАТЬ
Продажи.Ссылка,
Продажи.Дата,
Номенклатура.Наименование КАК Товар
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО Товары.Номенклатура = Номенклатура.Ссылка
ГДЕ
Номенклатура.Наименование КАК ПОДОБНО &Поиск
А в коде модуля задаём:
Запрос.УстановитьПараметр("Поиск", "%кабель%");
Так СУБД может оптимизировать план выполнения, а объём выборки сократится.
Приём 1. Минимизируйте подзапросы
Если можно объединить данные через СОЕДИНЕНИЕ, не используйте вложенные ВЫБРАТЬ.
Подзапросы создают временные таблицы, а значит — замедляют обработку.
Приём 2. Используйте поля-индексы
При фильтрации по дате, ссылке или регистратору убедитесь, что поля индексируются.
Например, Дата, Период, Регистратор по умолчанию индексируются, а вот вычисляемые поля — нет.
Приём 3. Добавляйте ограничения выборки
Если вы формируете отчёт, не нужно выбирать все записи за 5 лет.
Используйте ГДЕ Период >= &ДатаНачала И Период <= &ДатаКонца.
Или добавьте ПЕРВЫЕ 1000 для отладки, чтобы быстро оценить результат.
Приём 4. Избегайте функций в условиях
Пример ошибки:
ГДЕ МЕСЯЦ(Продажи.Дата) = 5
Функция МЕСЯЦ() не использует индекс, и запрос сканирует всю таблицу.
Лучше задавать диапазон:
ГДЕ Продажи.Дата МЕЖДУ &НачалоМая И &КонецМая
Приём 5. Используйте временные таблицы осознанно
Временные таблицы полезны, если они сокращают общий объём выборки.
Но если вы просто копируете данные без агрегирования — вы лишь увеличиваете нагрузку.
Приём 6. Анализируйте план выполнения
Запускайте запрос в Конструкторе запросов и включайте анализ плана.
1С покажет, какие таблицы читаются, сколько строк обработано, где узкие места.
Приём 7. Используйте агрегаты правильно
Если вам нужен только итог по сумме — не выбирайте детальные записи:
ВЫБРАТЬ
Продажи.Покупатель,
СУММА(Продажи.СуммаДокумента) КАК ОбщаяСумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
ГДЕ
Продажи.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
Продажи.Покупатель
Это избавит от ненужных обработок на уровне клиентского кода.
Пример из практики
В одной торговой компании отчёт по продажам за квартал формировался 3,5 минуты.
После оптимизации:
- убрали подзапросы;
- добавили фильтрацию по периоду;
- вынесли расчёт агрегатов на уровень SQL.
Результат — время выполнения сократилось до 18 секунд, а нагрузка на сервер уменьшилась на 40%.
Инструменты, которые помогут
- Запрос.Текст — для отладки текста запроса.
- Консоль запросов (Add-in) — визуальный анализ производительности.
- Журнал регистрации — отслеживание долгих операций.
- xUnitFor1C — для автотестирования оптимизированных модулей.
Вывод
Оптимизация запросов в 1С — это постоянная работа с балансом между скоростью, читаемостью и безопасностью кода.
Главное правило: чем проще логика запроса — тем быстрее он работает.
Используйте индексы, фильтры и агрегаты с умом, и ваша 1С будет отвечать мгновенно даже на миллионы строк данных.