1C-CodeОшибки 1С → Запрос выполняется слишком долго

Запрос в 1С выполняется слишком долго — где искать причину

Сообщение платформы: Запрос выполняется слишком долго

Сообщения об ошибке нет: запрос просто идёт минутами вместо миллисекунд. Причина почти всегда одна из четырёх, и находится замером, а не догадками.

Отчего это бывает

1. Соединение с вложенным запросом

ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ... ИЗ ...) КАК Вложенный
	ПО ...

У вложенного запроса нет индексов. База вынуждена перебирать его целиком на каждую строку внешнего. Лечится временной таблицей через ПОМЕСТИТЬ: у неё индексы можно создать.

2. Отбор не в параметрах виртуальной таблицы

Остатки(&НаДату, ) КАК Ост
ГДЕ Ост.Склад = &Склад        // поздно

// надо:
Остатки(&НаДату, Склад = &Склад)

Условие в скобках виртуальной таблицы отсекает данные ДО расчёта, в ГДЕ — после. На большом регистре разница в разы.

3. Соединение с таблицей без индекса по этому полю

// соединение по реквизиту, который не проиндексирован

Индексы задаются у реквизита в конфигураторе. Соединение и отбор по неиндексированному полю — это перебор всей таблицы.

4. ВЫБРАТЬ * вместо нужных полей

ВЫБРАТЬ Товары.* ИЗ ...

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

Что сделать

Не гадайте — замеряйте. В конфигураторе есть замер производительности: он покажет, какая строка кода сколько заняла. Дальше смотрите план запроса в технологическом журнале или средствами СУБД. Оптимизация «на глаз» обычно ускоряет то, что и так работало быстро.

Проверить себя на практике. В тренажёре те же ошибки возникают на настоящем интерпретаторе языка 1С: сообщения дословно те же, что у платформы, но исправить их можно сразу в браузере, без установки и без риска для рабочей базы.

Открыть тренажёр

Разобраться глубже

Другие частые ошибки

Поле объекта не обнаружено Значение не является значением объектного типа Переменная не определена Метод объекта не обнаружен Индекс находится за границами массива Деление на ноль