Объединение запросов в конструкторе запросов

Обновлено: 08.05.2024

Собственно есть задача объединить два запроса, ПОЛНЫМ СОЕДИНЕНИЕМ.
Запросы сделаны конструктором запросов, может есть какая утилитка/обработка чтобы запихнуть в ее два запроса, нажать кнопочку "объединить", выбрать поля и вот тебе готовый запрос?

Утилиты нет.
Выложите запросы.

Можете заодно указать, какое у них было левое соединение в СКД (если вы про два запроса из соседнего топика)


Соединяем через дом = дом2
СКД их естественно соединяет ЛЕВЫМ и в результирующую таблицу не попадают записи которые есть во втором но нет в первом запросе.

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

(7) dbaser, Ок, учту.
Сейчас будет смертельный номер, присоединение еще одного запроса к полученному.
PS. Там еще и четвертый запрос есть :)

ВЫБРАТЬ ПЕРВЫЕ 10000
Квартиры.Наименование КАК Квартира,
Квартиры.Владелец.Наименование КАК Дом,
Квартиры.Владелец.РайонГорода КАК Район,
Квартиры.Владелец.Владелец.Наименование КАК Улица,
Квартиры.Владелец.Ссылка КАК ЧислоДомов
ПОМЕСТИТЬ Т1
ИЗ
Справочник.Квартиры КАК Квартиры
ИНДЕКСИРОВАТЬ ПО Дом
;

ВЫБРАТЬ ПЕРВЫЕ 10000
ГруппыДомов.Источник КАК Источник2,
ГруппыДомов.ЦТП КАК ЦТП2,
ГруппыДомов.Узел КАК Узел2,
ГруппыДомовСоставГруппы.Дом.Наименование КАК Дом2,
ГруппыДомовСоставГруппы.Улица КАК Улица2,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппыДомовСоставГруппы.Дом) КАК ЧислоДомов2
ПОМЕСТИТЬ Т2
ИЗ
Справочник.ГруппыДомов.СоставГруппы КАК ГруппыДомовСоставГруппы
ПОЛНОЕ СОЕДИНЕНИЕ Справочник.ГруппыДомов КАК ГруппыДомов
ПО ГруппыДомовСоставГруппы.Ссылка = ГруппыДомов.Ссылка

СГРУППИРОВАТЬ ПО
ГруппыДомов.Источник,
ГруппыДомов.ЦТП,
ГруппыДомов.Узел,
ГруппыДомовСоставГруппы.Дом.Наименование,
ГруппыДомовСоставГруппы.Улица
ИНДЕКСИРОВАТЬ ПО Дом2
;

ВЫБРАТЬ
Т1.Квартира,
Т1.Дом,
Т1.Район,
Т1.Улица,
Т1.ЧислоДомов,
Т2.Источник2,
Т2.ЦТП2,
Т2.Узел2,
Т2.Дом2,
Т2.Улица2,
Т2.ЧислоДомов2
ИЗ Т1 КАК Т1 ПОЛНОЕ СОЕДИНЕНИЕ Т2 КАК Т2 ПО Т1.Дом = Т2.Дом

Когда нам надо расположить записи одной таблицы под записями другой, используется
объединение таблиц.
А сейчас рассмотрим как делается объединение таблиц средствами конструктора запросов 1С.

Допустим, что нам нужно создать вот такую простейшую таблицу:

Числа
100
200

Чтобы получить такую таблицу достаточно выполнить следующий запрос:

А теперь сформируем этот запрос используя конструктор запросов.
Открываем диалоговое окно конструктора и добавляем поле с числом 100.



Переходим на закладку Объединения/Псевдонимы и видим вот такую картину:



В командной панели нажимаем кнопку Добавить



после чего на закладке Таблицы и поля появляются дополнительные закладки сбоку: Запрос1 и Запрос2. Переходим на закладку Запрос2 и добавляем в поля число 200



На закладке Объединения/Псевдонимы при этом у нас в левой табличной части появилась еще одна строка Запрос2, а в правой — новая колонка Запрос2. Для полного счастья переименуем Поле1 в Числа



Если нам нужно при объединении отбросить дубли, т.е. вместо ОБЪЕДИНИТЬ ВСЕ использовать просто ОБЪЕДИНИТЬ, то для Запроса2 нужно поставить флажок Без дубликатов



Рассмотрим еще один момент. Добавим к таблице еще одно поле — ЧислоПрописью. Соответственно наша таблица примет вот такой вид:

Числа ЧислоПрописью
100 Сто
200 Двести

Соответственно для первого запроса мы в конструкторе вместо одного поля вводим два:



А теперь представим, что при вводе полей второго запроса мы перепутали их порядок:



Первое, что приходит в голову для исправления ситуации — это удалить поля и ввести их по новой в правильном порядке. И для нашего простейшего запроса это не составит никакого труда. Но на практике запросы бывают гораздо сложнее и такой способ исправления может оказаться очень трудоемким и сопровождаться большим количеством ошибок.
Поэтому воспользуемся более простым и правильным способом. Переходим на закладку Объединения/Псевдонимы, дважды щелкаем по полю с текстовым значением «Двести» и в раскрывающемся списке выбираем числовое значение 200.

Для быстрого написания запросов для конфигураций на платформе 1С 8 существует
такая вещь как Конструктор запросов.
Для его вызова достаточно щелкнуть правой кнопкой мыши в окне редактирования кода и выбрать пункт
Конструктор запроса.

konstruktorzaprosamenyu_vz

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

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

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

konstruktorspravochnik_vz

Нажимаем кнопку ОК и в окне редактирования кода видим следующий запрос:

Достаточно часто приходится слышать от опытных разработчиков, что конструктор запросов
это зло, что запросы надо писать вручную.
Конечно же никто не отрицает, что каждый программист 1С должен хорошо знать структуру
языка запросов. Но использование конструктора запросов дает ряд несомненных преимуществ:

  • Скорость написания запросов. Даже на небольшом примере выше видно, что с использованием
    конструктора скорость написания запроса возрастает в несколько раз.
  • Качество кода. Практически исключена возможность опечаток, т.к. текст генерируется
    автоматически.
  • В конструкторе удобно анализировать тексты больших запросов, количество строк которых
    может достигать две-три тысячи со множеством временных таблиц и вложенных запросов.
    И понять что-то в таком запросе только смотря на текст просто нереально. В конструкторе
    же информация представлена более укрупненно и наглядно.
  • Есть встроенная справочная информация по различным функциям языка запросов.

Поэтому даже те кто говорит, что запросы надо писать ручками все равно используют
конструктор запросов в своей работе.

Конструктор запросов в 1С 8.3 и 8.2 — мощнейший инструмент разработки. Он позволяет составить текст запроса при помощи специальной визуальной среды. Таким образом, чтобы создать запрос 1с не обязательно знать встроенный язык запросов, достаточно ориентироваться в не сложном и интуитивно понятном интерфейсе конструктора.

Конструктор запросов представляет из себя набор вкладок, каждая из которых отвечает за свою часть запроса. Так заполняя вкладку Таблицы и поля мы выбираем таблицы из которых запрос 1с будет получать данные и поля этих таблиц необходимые для решения конкретной задачи. Заполняя в кладку Условия мы накладываем условия на выбранные таблицы, для того чтобы выбрать из них только нужные нам данные и так далее.

Для того чтобы вызвать конструктор запросов 1с 8 в программном коде необходимо:

  • Создать новый запрос
  • Задать пустую строку текста запроса
  • Поставить курсор мышки между кавычками, нажать правую кнопку мыши. В открывшемся контекстном меню выбрать пункт Конструктор запроса и ответить Да на вопрос о создании нового запроса. Если текст запроса уже записан, то необходимо щелкнуть на любом месте внутри него и вызвать конструктор;

Рассмотрим на небольших примерах с возрастающей сложностью все основные вкладки конструктора запросов. Такой подход позволит начинающему программисту 1с более эффективно изучить конструктор и все его возможности. Для примеров будем использовать конфигурацию Бухгалтерия 3.0.

Урок №1. Конструктор запросов — простейший пример использования.

Задача: написать запрос к справочнику номенклатура, выбрать всю номенклатуру справочника.

Новые вкладки: Таблицы и поля.

Новые механизмы: просмотр и редактирование текста запроса при помощи кнопки «Запрос».

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

Теоретическая часть урока №1

Вкладка Таблицы и поля состоит из трех разделов:

База данных. В данном разделе представлены все таблицы базы данных, которые можно использовать для построения запроса;

Таблицы. В данный раздел выбираются таблицы необходимые для данного запроса. Для тогда чтобы переместить их из раздела база данных нужно:

  • Либо дважды щелкнуть по таблице;
  • Либо воспользоваться кнопками «>» или «>>».

Над разделом Таблицы присутствует ряд кнопок. Про большинство из них будет подробнее рассказано в следующих уроках. А пока дам только краткие пояснения.

  • Создать вложенный запрос (красная линия). Предназначена для создания нового вложенного запроса;
  • Создать описание временной таблицы (желтая линия). Позволяет задать имя временной таблицы, которая расположена вне данного запроса, также можно использовать для передачи в запрос таблицы значений;
  • Изменить текущий элемент (зеленая линия). Позволяет перейти в выделенный вложенный запрос, временную таблицу или описание временной таблицы;
  • Удалить текущий элемент (голубая линия). Удаляет выделенную таблицу из выбранных таблиц;
  • Заменить таблицу (синяя линия). Открывает диалог замены выделенной таблицы. Полезно, если вы неверно выбрали виртуальную таблицу регистра, так как происходит позиционирование на текущей выбранной таблице в списке.
  • Параметры виртуальной таблицы (фиолетовая линия). Открывает параметры виртуальной таблицы регистра.

Поля. В данный раздел выбираются поля таблиц из предыдущего раздела. Эти поля будут колонками таблицы или выборки полученной в результате выполнения запроса. Нужны они прежде всего, для того чтобы получить из выбранных таблиц только нужную в конкретном случае информацию. Для того чтобы переместить их из раздела Таблицы необходимо:

  • Либо дважды щелкнуть по полю;
  • Либо воспользоваться кнопками «>» или «>>»;
  • Также можно добавить новое поле самостоятельно, используя произвольное выражение из полей выбранных таблиц и функций языка запросов.

Над разделом Поля присутствует ряд кнопок. Про создание полей при помощи произвольных выражений будет подробнее рассказано в следующих уроках. А пока дам только краткие пояснения.

  • Добавить (зеленая линия). Предназначена для добавления нового поля при помощи редактора произвольных выражений;
  • Изменить текущий элемент (красная линия). Позволяет изменить выделенное поле при помощи редактора;
  • Удалить текущий (синяя линия). Удаляет выделенное поле из списка.

Практическая часть урока №1

Мы разобрались с теорией необходимой для выполнения задания, предусмотренного в данном уроке. Напомню как оно звучит: написать запрос к справочнику номенклатура, выбрать всю номенклатуру справочника.

Приступим к созданию запроса по номенклатуре:

  • Создадим новый запрос и откроем конструктор методом указанным в начале урока;
  • В разделе База данных, откроем ветку Справочники и найдем там справочник Номенклатура;
  • Выделим его и при помощи кнопки «>» перенесем в раздел Таблицы;
  • В разделе Таблицы раскроем справочник номенклатура при помощи значка «+»;
  • В раскрывшемся списке полей найдем поле Ссылка и перенесем его в раздел Поля при помощи кнопки «>»
  • Запрос по номенклатуре готов, нажимаем кнопку «ОК» в нижней части окна конструктора.

В итоге у нас получится запрос со следующим текстом:

В конструкторе также можно посмотреть текст запроса, который готов у вас на данном этапе написания. Для этого в нижней части окна есть специальная кнопка Запрос. После ее нажатия откроется окно просмотра / редактирования текста запроса. Для того чтобы вручную изменить запрос необходимо:

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: объединение

Автор уроков и преподаватель школы: Владимир Милькин

Объединение в запросах

В языке запросов имеется возможность объединять несколько запросов. При этом записи, полученные с помощью каждого из объединяемых запросов, будут собраны в один результат запроса.

Как всегда начнём с примера.

Пусть требуется написать запрос, который возвращает все названия цветов и вкусов в одной таблице.

Цвета мы умеем выбирать так:

А вот, чтобы объединить эти два результата в один как раз и потребуется операция объединения:

Обратите внимание на то, что операция объединения вовсе не гарантирует, что элементы будут идти в каком-то определённом порядке. В общем случае они могут следовать друг за другом как угодно, поэтому если важен порядок необходимо как и всегда указывать его явно (через секцию УПОРЯДОЧИТЬ).

Требования к запросам, участвующим в объединении

У объединяемых запросов должно быть одинаковое количество полей . Иначе мы получим такую ошибку:

26

В объединяемых запросах соответствующие друг другу (по порядку) поля должны иметь одинаковый тип . Но это требование, в отличие от предыдущего, не является обязательным. Если соответствующие друг другу поля имеют разный тип, то поле результата будет иметь СОСТАВНОЙ тип, который разбирался нами на одном из прошлых уроков:

Несмотря на то, что поле первого запроса имеет тип СТРОКА, а второго ЧИСЛО, нам удалось объединить их в одну таблицу. Но тип результатирующего поля стал составным и нам придётся учитывать это в дальнейшем. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Кстати, вы заметили, что поле итоговой таблицы (после объединения) называется Наименование, а не Калорийность? Эта такое правило : поля итоговой таблицы всегда имеют названия совпадающие с именами описанными в первом из объединяемых запросов.

Объединение более двух запросов

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

Напишем объединение трёх запросов:

Повторяющиеся строки

Давайте объединим один и тот же запрос сам с собой:

Обратите внимание на то, что мы объединили две одинаковые таблицы цветов, а в результате каждый цвет встречается ровно один раз.

Всё потому, что по умолчанию при объединении запросов полностью одинаковые строки в результате запроса, заменяются одной. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Если требуется, чтобы были оставлены в том числе одинаковые строки (дубли), необходимо указать ключевое слово ВСЕ:

Упорядочивание при объединении

Пытаться отдельно упорядочивать результаты запросов, участвующих в объединении не имеет смысла. Поэтому при попытке написать:

31

Упорядочивать можно только результат объединения :

Обратите внимание на то, что секция УПОРЯДОЧИТЬ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.

Подведение итогов при объединении

Пытаться отдельно подводить итоги по запросам, участвующим в объединении, также не имеет смысла. Поэтому при попытке написать:

33

Подводить итоги можно только по результату объединения :

Обратите внимание на то, что секция ИТОГИ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.

Рабочий пример

Давайте решим такую задачу. Требуется вывести для каждого элемента справочника Еда закупленное и проданное количество за весь период.

Поступление еды у нас в базе происходит документом ПоступлениеЕды. У документа есть табличная часть Еда, с реквизитами Номенклатура и Количество.

Сначала выберем все строки табличной части Еда из всех поступлений:

Теперь сгруппируем этот результат по еде с суммированием количества:

Аналогичным образом получим продажу еды из документов ПродажаЕды:

Осталось объединить эти два запроса:

Обратите внимание на то, как мы дополнили оба запроса ещё одним полем СУММА(0). Мы вынуждены были сделать это, так как оба запроса содержат по два поля, а объединение запросов должно содержать три поля. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Если бы мы не сделали этого, а написали просто:

Читайте также: