Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

1C_CORRELATED_SUBQUERY 1С:Предприятие и СУБД

Использование временных таблиц вместо подзапросов в конструкторе 1С

Обновлено: 26.08.2026 · Официальная документация ↗
  • Экспоненциальный рост времени выполнения запроса при увеличении объема обрабатываемых документов.
  • В плане запроса СУБД появляются операторы Nested Loops с миллионами итераций.
  • Оптимизатор СУБД выбирает ошибочные оценки кардинальности (Cardinality Estimation).

1. Проблема коррелированных подзапросов и условий «В (ВЫБРАТЬ...)»

Использование вложенных подзапросов в условиях соединения или секции ГДЕ Поле В (ВЫБРАТЬ ...) приводит к тому, что СУБД может выполнять подзапрос построчно для каждой строки внешнего источника.

2. Оптимизация: Перенос выборки во временную таблицу

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

// ПРАВИЛЬНО (Пакетный запрос с временной таблицей и индексом):
ВЫБРАТЬ
    Остатки.Номенклатура КАК Номенклатура,
    Остатки.КоличествоОстаток КАК КоличествоОстаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки;

ИНДЕКСИРОВАТЬ ПО
    Номенклатура;
;

ВЫБРАТЬ
    Заказ.Ссылка,
    ВТ_Остатки.КоличествоОстаток
ИЗ Документ.ЗаказКлиента КАК Заказ
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
    ПО Заказ.Номенклатура = ВТ_Остатки.Номенклатура;

3. Обязательная индексация полей соединения

Всегда добавляйте инструкцию ИНДЕКСИРОВАТЬ ПО для полей, по которым в последующих запросах пакета происходит ПО (JOIN) или фильтрация ГДЕ.

💡 Практика специалистов: Создание временной таблицы несет фиксированные накладные расходы на DDL в tempdb. Не создавайте десятки временных таблиц для выборок из 2-3 строк.

Частые вопросы (FAQ)

Всегда ли временная таблица быстрее подзапроса?

Для выборок размером более 50-100 строк временная таблица почти всегда быстрее, так как СУБД строит по ней точную статистику и использует быстрые индексные поиски (Index Seek).

Когда подзапрос допустим?

Подзапросы допустимы в простых конструкциях, возвращающих строго одну скалярную величину или выборку до 10-20 записей без соединений.

Где физически создаются временные таблицы 1С?

В СУБД MS SQL Server временные таблицы 1С создаются как реальные таблицы в базе tempdb (#tt*), в PostgreSQL — как локальные временные таблицы сессии pg_temp.

Нужно ли явно уничтожать временные таблицы в конце запроса?

Уничтожать таблицы через 'УНИЧТОЖИТЬ ВТ_Таблица' желательно в длинных пакетных запросах, чтобы освободить оперативную память и пространство tempdb до завершения всего пакета.

Полезные материалы
Рекомендуем