1C-Code → Ошибки 1С → Запрос выполняется слишком долго
Сообщение платформы: Запрос выполняется слишком долго
Сообщения об ошибке нет: запрос просто идёт минутами вместо миллисекунд. Причина почти всегда одна из четырёх, и находится замером, а не догадками.
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ... ИЗ ...) КАК Вложенный
ПО ...
У вложенного запроса нет индексов. База вынуждена перебирать его целиком на каждую строку внешнего. Лечится временной таблицей через ПОМЕСТИТЬ: у неё индексы можно создать.
Остатки(&НаДату, ) КАК Ост
ГДЕ Ост.Склад = &Склад // поздно
// надо:
Остатки(&НаДату, Склад = &Склад)
Условие в скобках виртуальной таблицы отсекает данные ДО расчёта, в ГДЕ — после. На большом регистре разница в разы.
// соединение по реквизиту, который не проиндексирован
Индексы задаются у реквизита в конфигураторе. Соединение и отбор по неиндексированному полю — это перебор всей таблицы.
ВЫБРАТЬ Товары.* ИЗ ...
Лишние поля — это лишние чтения и лишний объём по сети, а ещё они мешают базе использовать покрывающие индексы.
Не гадайте — замеряйте. В конфигураторе есть замер производительности: он покажет, какая строка кода сколько заняла. Дальше смотрите план запроса в технологическом журнале или средствами СУБД. Оптимизация «на глаз» обычно ускоряет то, что и так работало быстро.
Проверить себя на практике. В тренажёре те же ошибки возникают на настоящем интерпретаторе языка 1С: сообщения дословно те же, что у платформы, но исправить их можно сразу в браузере, без установки и без риска для рабочей базы.