Как сделать вложенный запрос с левым и правым соединением через конструктор запросов

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

В процессе разработки сложных отчетов на платформе 1С часто возникает необходимость объединить данные из нескольких источников (например, обороты товаров и остатки на складах), а затем дополнить полученный результат информацией из других регистров, такой как цены номенклатуры или параметры складов. Для решения этой задачи идеально подходит механизм вложенных запросов или временных таблиц. Рассмотрим подробно, как реализовать такую структуру, используя стандартный Конструктор запросов, и разберем важные технические нюансы соединений.

Шаг 1. Создание вложенного запроса в Конструкторе

Начнем с того, что поместим исходную логику (объединение данных из разных регистров) во вложенный запрос. Для этого выполним следующие действия:

  1. Откроем Конструктор запроса.
  2. На первой вкладке Таблицы и поля найдем кнопку или контекстное меню для создания вложенного запроса (обычно это иконка в виде таблицы с плюсом над списком выбранных таблиц).
  3. В открывшемся окне конструктора вложенного запроса опишем логику выбора данных. В нашем примере это будет выборка из регистра РегистрНакопления.ТоварыОрганизаций.Обороты и РегистрНакопления.ТоварыНаСкладах.
  4. Для реализации объединения перейдем на закладку Объединения/Псевдонимы и добавим вторую выборку через кнопку Добавить объединение.

Важно помнить: во вложенном запросе нельзя использовать оператор ИТОГИ. Если в вашем исходном коде были итоги, их необходимо удалить из вложенного запроса и, если они нужны в финальном результате, настроить их уже в основном (самом верхнем) запросе. Проанализируем пример кода, который будет находиться внутри нашего вложенного запроса:


ВЫБРАТЬ
    ТоварыОрганизацийОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    ТоварыОрганизацийОбороты.КоличествоПриход КАК Поле1,
    ТоварыОрганизацийОбороты.КоличествоРасход КАК Поле2
ИЗ
    РегистрНакопления.ТоварыОрганизаций.Обороты(&НачалоПериода, &КонецПериода) КАК ТоварыОрганизацийОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТоварыНаСкладах.Номенклатура,
    0,
    0
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

Шаг 2. Настройка связей с дополнительными регистрами

После того как мы создали вложенный запрос и вернулись в основной конструктор, этот запрос будет отображаться как обычная таблица в списке выбранных таблиц. Теперь мы можем добавить к нему дополнительные данные, такие как ЦеныНоменклатуры и ГруппыДоступностиСкладов. Разберем по шагам настройку соединений:

  1. Перетащим нужные регистры (цены и доступность) в список выбранных таблиц основного запроса.
  2. Перейдем на вкладку Связи.
  3. Установим связь между нашим вложенным запросом (левая таблица) и регистром цен (правая таблица) по полю Номенклатура.
  4. Установим флаг Все для вложенного запроса, чтобы получить Левое соединение. Это гарантирует, что товары из вложенного запроса не пропадут, если для них не установлена цена.

Проанализируем ситуацию с Правым соединением. Платформа 1С поддерживает его синтаксически, однако Конструктор запросов всегда автоматически преобразует ПРАВОЕ СОЕДИНЕНИЕ в ЛЕВОЕ СОЕДИНЕНИЕ, просто меняя таблицы местами. Это стандарт поведения платформы ("1С любит налево"), который не влияет на результат выборки, но может поначалу смутить разработчика.

Шаг 3. Обработка NULL и группировка данных

При использовании левого соединения с регистром цен или характеристик важно учитывать, что для некоторых позиций данных может не оказаться. В этом случае в полях цен возникнет значение NULL. Чтобы избежать ошибок в расчетах, рекомендуется использовать функцию ЕСТЬNULL. Посмотрим на пример оформления полей в основном запросе:


ВЫБРАТЬ
    ВложенныйЗапрос.Номенклатура,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
    ВложенныйЗапрос.Поле1 КАК КоличествоПриход
ИЗ
    (ВЫБРАТЬ ... ОБЪЕДИНИТЬ ВСЕ ...) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура

Альтернативный и предпочтительный метод: Временные таблицы

Как отмечают опытные разработчики, использование глубоко вложенных запросов может негативно сказываться на читаемости кода и производительности (особенно если соединение идет по неиндексированным полям). Выясним, почему Временные таблицы (ВТ) зачастую лучше:

Для перехода на временные таблицы вместо создания вложенного запроса в конструкторе следует выбрать создание новой временной таблицы на вкладке Таблицы и поля (кнопка Создать временную таблицу). После этого в основном пакете запросов мы просто обращаемся к ней по имени, как к обычной таблице.

Подведем итог: использование вложенных запросов в Конструкторе — рабочий инструмент, если вам нужно быстро объединить данные и связать их с другими источниками. Однако при усложнении логики всегда рассматривайте возможность перехода на Временные таблицы для повышения стабильности и скорости работы вашей системы.

← На главную