Вложенный запрос 1С: синтаксис, примеры и оптимизация
Вложенный запрос 1С — это запрос внутри другого запроса. В секции ИЗ он создаёт
вложенную таблицу, а в ГДЕ обычно проверяет принадлежность значения результату подзапроса.
Для небольшой выборки это удобно, но повторное использование и большие объёмы часто требуют временной таблицы.
Вложенный запрос 1С в секции ИЗ
Подзапрос в ИЗ оформляется в круглых скобках и обязательно получает псевдоним.
Внешний запрос видит только поля, перечисленные во внутреннем ВЫБРАТЬ. Такой приём полезен,
когда данные нужно сначала сгруппировать, а затем соединить с документами или справочниками.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура КАК Номенклатура,
| Продажи.СуммаПродаж КАК СуммаПродаж
|ИЗ
| (ВЫБРАТЬ
| Обороты.Номенклатура КАК Номенклатура,
| СУММА(Обороты.СуммаОборот) КАК СуммаПродаж
| ИЗ
| РегистрНакопления.Продажи.Обороты(&Начало, &Конец) КАК Обороты
| СГРУППИРОВАТЬ ПО
| Обороты.Номенклатура) КАК Продажи
|ГДЕ
| Продажи.СуммаПродаж > &МинимальнаяСумма";
Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("МинимальнаяСумма", 100000);
Результат = Запрос.Выполнить();
Панель метода приведена по локальному синтакс-помощнику: сигнатура
УстановитьПараметр(<Имя>, <Значение>). Параметры периода лучше передавать,
а не вычислять внутри текста: запрос остаётся понятным и пригодным для повторного выполнения.
1С запрос: вложенная таблица и её поля
Формулировка «1С запрос вложенная таблица» обычно означает результат подзапроса в ИЗ.
Это не объект базы и не временная таблица: результат существует только внутри единого текста запроса.
Псевдонимы полей задают интерфейс между внутренней и внешней частями.
ВЫБРАТЬ
Итоги.Контрагент,
Итоги.СуммаДокументов
ИЗ
(ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент,
СУММА(Реализация.СуммаДокумента) КАК СуммаДокументов
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
СГРУППИРОВАТЬ ПО
Реализация.Контрагент) КАК Итоги
Если поле не выведено из внутренней выборки, обратиться к нему снаружи нельзя. Отбор по исходным данным размещайте внутри, чтобы сократить набор до группировки; отбор по рассчитанному итогу — во внешней части.
Подзапрос в ГДЕ и условие В
В условии В подзапрос должен возвращать одну колонку совместимого типа. Например, можно выбрать
проведённые реализации только по контрагентам, у которых есть просроченная задолженность.
ВЫБРАТЬ
Реализация.Ссылка,
Реализация.Контрагент,
Реализация.СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.Контрагент В
(ВЫБРАТЬ
Остатки.Контрагент
ИЗ
РегистрНакопления.ВзаиморасчетыСКлиентами.Остатки(&Дата) КАК Остатки
ГДЕ
Остатки.СуммаОстаток > 0)
Если подзапрос возвращает много строк, сравните вариант с соединением. Соединение чаще даёт оптимизатору
больше свободы, но может размножить строки внешней таблицы; тогда заранее обеспечьте уникальность ключей
через группировку или РАЗЛИЧНЫЕ.
В (ВЫБРАТЬ ...) в соединение,
выполнить оба варианта на тестовом периоде и сопоставить время и число прочитанных строк.
Коррелированный подзапрос в 1С
Коррелированный подзапрос зависит от текущей строки внешней выборки: во внутреннем условии используется поле внешнего источника. Концептуально он вычисляется для каждой строки, поэтому на больших таблицах особенно дорог.
// Концептуальная схема корреляции:
// внутренний отбор зависит от Контрагенты.Ссылка внешней выборки
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Ссылка В
(ВЫБРАТЬ
Реализация.Контрагент
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Контрагент = Контрагенты.Ссылка
И Реализация.Проведен)
Для задачи существования записей обычно проще и быстрее получить уникальный список ключей отдельным подзапросом и соединить его с внешним источником. Если корреляция всё же нужна, ограничьте внешнюю выборку до её выполнения и проверьте запрос на реальном объёме данных.
Отличие вложенного запроса от временной таблицы
Вложенный запрос является частью одного оператора и не имеет собственного имени вне него. Временная таблица
создаётся через ПОМЕСТИТЬ, хранится в менеджере временных таблиц до конца пакета или времени жизни
менеджера и может использоваться следующими запросами пакета.
- Подзапрос — для компактной одноразовой выборки без повторного обращения.
- Временная таблица — для повторного использования промежуточного результата и разбиения сложного плана.
- Индекс временной таблицы — когда большой промежуточный набор соединяется или фильтруется по ключу.
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.КоличествоОстаток КАК Количество
ПОМЕСТИТЬ ВТОстатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата) КАК Остатки
ГДЕ
Остатки.КоличествоОстаток <> 0
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
ВЫБРАТЬ
Номенклатура.Ссылка,
ВТОстатки.Количество
ИЗ
Справочник.Номенклатура КАК Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТОстатки КАК ВТОстатки
ПО Номенклатура.Ссылка = ВТОстатки.Номенклатура
Производительность вложенных запросов
Сам факт вложенности не делает запрос медленным: итог зависит от плана СУБД, селективности условий, индексов, виртуальных таблиц и объёма промежуточного результата. Опасны глубокая вложенность, корреляция по большому набору, повтор одного подзапроса и фильтрация виртуальной таблицы после получения лишних данных.
- Передавайте отборы в параметры виртуальных таблиц, где это поддерживается.
- Сокращайте строки и колонки на самом раннем этапе.
- Не добавляйте
РАЗЛИЧНЫЕдля маскировки дублей — найдите источник размножения строк. - Сравнивайте подзапрос, соединение и временную таблицу на одинаковых параметрах и прогретой базе.
NULL и ЕстьNull во вложенном запросе
NULL появляется, например, для полей правой стороны левого соединения, когда соответствия нет.
Он не равен ни нулю, ни пустой строке, ни Неопределено. Для подстановки значения используйте
ЕСТЬNULL(Выражение, ЗначениеЗамены).
ВЫБРАТЬ
Номенклатура.Ссылка,
ЕСТЬNULL(Продажи.СуммаПродаж, 0) КАК СуммаПродаж
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ
Обороты.Номенклатура КАК Номенклатура,
СУММА(Обороты.СуммаОборот) КАК СуммаПродаж
ИЗ
РегистрНакопления.Продажи.Обороты(&Начало, &Конец) КАК Обороты
СГРУППИРОВАТЬ ПО
Обороты.Номенклатура) КАК Продажи
ПО Номенклатура.Ссылка = Продажи.Номенклатура
Значение замены должно быть совместимо по типу. Не оборачивайте в ЕСТЬNULL все поля подряд:
это меняет семантику результата и может скрыть отсутствие связанной записи.
Частые ошибки во вложенных запросах 1С
- Нет псевдонима подзапроса в ИЗ. После закрывающей скобки укажите
КАК ИмяИсточника. - Внешняя часть обращается к невыбранному полю. Выведите поле во внутреннем
ВЫБРАТЬи задайте устойчивый псевдоним. - Подзапрос для В возвращает несколько колонок. Оставьте одну колонку того же типа, что у сравниваемого выражения.
- Дубли после соединения. Обеспечьте одну строку на ключ во вложенной таблице группировкой, а не скрывайте проблему конструкцией
РАЗЛИЧНЫЕ. - NULL сравнивают обычным равенством. Учитывайте происхождение NULL и применяйте
ЕСТЬNULLтолько там, где действительно нужна замена. - Один тяжёлый подзапрос повторён несколько раз. Рассчитайте набор один раз во временную таблицу и при необходимости проиндексируйте ключ.
Частые вопросы про вложенный запрос 1С
Когда вложенный запрос 1С лучше временной таблицы?
Когда промежуточный набор нужен один раз, запрос остаётся читаемым, а измерение на рабочем объёме не показывает проблем с планом и временем выполнения.
Можно ли использовать подзапрос в условии В?
Да. Подзапрос после В должен возвращать одну колонку, тип которой совместим с выражением слева. Для большого набора стоит сравнить производительность с соединением.
Почему после левого соединения с вложенной таблицей появляется NULL?
NULL означает, что во вложенной таблице не нашлось соответствующей строки. Если по смыслу нужен ноль или другое значение, используйте ЕСТЬNULL с совместимым типом замены.
ИИ Консоль кода 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка