Объединение в запросе 1с. Объединить результаты запросов

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

Для объединения используется предложение ОБЪЕДИНИТЬ . На самом деле происходит объединение результатов запросов, то есть каждый запрос собирает данные независимо друг от друга, а затем эти результаты объединяются в один. И только над последним запросом выполняются остальные операции, например, упорядочивание и расчет итогов.

При объединении запросов происходит "вертикальное склеивание" результатов, то есть сначала идут строки результата первого запроса, затем второго.

Перейдём к практике:
Код 1C v 8.х ВЫБРАТЬ
Номенклатура,
Количество,
Сумма
ИЗ
Документ.Приходная.Товары

ОБЪЕДИНИТЬ

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

Результат этого запроса следующий:
Номенклатура Количество Сумма
Бумага А4 25 14 500
Стикеры 500л 8 4 880
Файл прозрачный 5 4 100
Набор офисный 8 8 840

В итоге мы получим две таблицы, которые будут соединены друг с другом. Трудно увидеть, где кончается документ Приходная и начинается документ Расходная. Но мы сделаем кое-что, чтобы понять это:
Код 1C v 8.х
ВЫБРАТЬ
Номенклатура,
Количество КАК КолПриход,
Сумма КАК СумПриход,
0 КАК КолРасход,
0 КАК СумРасход
ИЗ
Документ.Приходная.Товары

ОБЪЕДИНИТЬ

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

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

Бумага А4 25 14 500
Стикеры 500л 8 4 880
Файл прозрачный 5 4 100
Набор офисный 8 8 840
Набор офисный 1 1 105
Файл прозрачный 1 820
Стикеры 500л 1 610

Теперь нам нужно из результат запроса убрать дублирующиеся элементы. У нас два запроса и если мы будем сворачивать, каждый отдельно, чтобы исключить дублирующиеся элементы, то у нас ничего не получится. Поэтому мы приведём запрос к следующему виду:
Код 1C v 8.х
ВЫБРАТЬ
Номенклатура,
СУММА(КолПриход) КАК КолПриход,
СУММА(СумПриход) КАК СумПриход,
СУММА(КолРасход) КАК КолРасход,
СУММА(СумРасход) КАК СумРасход
ИЗ

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

ОБЪЕДИНИТЬ

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

СГРУППИРОВАТЬ ПО Номенклатура

Итак, мы видим, что весь наш запрос заключён в скобки и назван как ВложенныйЗапрос. Это сделано для того, чтобы мы смогли сгруппировать записи из обоих подзапросов и исключить дублирующиеся элементы. Такая конструкция называется вложенным запросом. Результат этого запроса следующий:
Номенклатура КолПриход СумПриход КолРасход СумРасход
Бумага А4 25 14 500
Стикеры 500л 8 4 880 1 610
Набор офисный 5 4 100 1 1 105
Файл прозрачный 8 8 840 1 820

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

Если мы хотим оставлять в запросе только уникальные значения записей при этом, не используя группировку. Нужно писать предложение ОБЪЕДЕНИТЬ без ключевого слова ВСЕ.

Информация взята с сайта

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

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

Для объединения используется предложение ОБЪЕДИНИТЬ / UNION . На самом деле происходит объединение результатов запросов , то есть каждый запрос собирает данные независимо друг от друга, а затем эти результаты объединяются в один. И только над последним запросом выполняются остальные операции, например, упорядочивание и расчет итогов.

В отличие от при объединении запросов происходит «вертикальное склеивание» результатов, то есть сначала идут строки результата первого запроса, затем второго.

Перейдём к практике:

ВЫБРАТЬ Номенклатура, Количество, СуммаОБЪЕДИНИТЬ ВЫБРАТЬ Номенклатура, Количество, Сумма ИЗ Документ.Расходная.Товары

Результат этого запроса следующий:

В итоге мы получим две таблицы, которые будут соединены друг с другом. Трудно увидеть, где кончается документ Приходная и начинается документ Расходная. Но мы кое-что сделаем, чтобы разобраться:

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

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

Номенклатура КолПриход СумПриход КолРасход СумРасход
Бумага А4 25 14 500
Стикеры 500л 8 4 880
Файл прозрачный 5 4 100
Набор офисный 8 8 840
Набор офисный 1 1 105
Файл прозрачный 1 820
Стикеры 500л 1 610

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

ВЫБРАТЬ
Номенклатура,
СУММА(КолПриход) КАК КолПриход,
СУММА(СумПриход) КАК СумПриход,
СУММА(КолРасход) КАК КолРасход,
СУММА(СумРасход) КАК СумРасход
ИЗ
(
ВЫБРАТЬ Номенклатура, Количество КАК КолПриход , Сумма КАК СумПриход , 0 КАК КолРасход , 0 КАК СумРасход ИЗ Документ.Приходная.Товары ОБЪЕДИНИТЬ ВЫБРАТЬ Номенклатура, 0 КАК КолПриход , 0 КАК СумПриход , Количество КАК КолРасход , Сумма КАК СумРасход ИЗ Документ.Расходная.Товары) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО Номенклатура

Итак, мы видим, что весь наш запрос заключён в скобки и назван как ВложенныйЗапрос. Это сделано для того, чтобы мы смогли сгруппировать записи из обоих подзапросов и исключить дублирующиеся элементы. Такая конструкция называется вложенным запросом. Результат этого запроса следующий:

Номенклатура КолПриход СумПриход КолРасход СумРасход
Бумага А4 25 14 500
Стикеры 500л 8 4 880 1 610
Набор офисный 5 4 100 1 1 105
Файл прозрачный 8 8 840 1 820

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

Если мы хотим оставлять в запросе только уникальные значения записей, не используя группировку, тогда, нужно писать предложение ОБЪЕДЕНИТЬ без ключевого слова ВСЕ .

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

Допустим в нашей системе факты покупки и продажи товара регистрируются документами Приход и Расход соответственно. Контрагент может являться как покупателем, так и поставщиком. Зачет задолженности может производится поставкой товара:

Чтобы подсчитать общую задолженность контрагента необходимо сложить сумму всех расходов по этому контрагенту и вычесть сумму всех приходов от этого же контрагента, проще всего это сделать с помощью оператора ОБЪЕДИНИТЬ ВСЕ:

Запрос.Текст =
"
//посчитаем на какую сумму мы отгрузили контрагентам
|ВЫБРАТЬ
| Расход.Контрагент,
|ИЗ
| Документ.Расход КАК Расход
|СГРУППИРОВАТЬ ПО
| Расход.Контрагент
|ОБЪЕДИНИТЬ ВСЕ
//посчитаем на какую сумму контрагенты
//поставили нам товара
|ВЫБРАТЬ
| Приход.Контрагент,
//сумму берем с отрицательным знаком,
//что при объединении она вычлась из суммы расхода
| СУММА(-Приход.Сумма)
|ИЗ
| Документ.Приход КАК Приход
|СГРУППИРОВАТЬ ПО
| Приход.Контрагент";

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

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Расход.Контрагент,
| СУММА(Расход.Сумма) КАК Долг
|ПОМЕСТИТЬ ВТ_ПриходРасход
|ИЗ
| Документ.Расход КАК Расход
|СГРУППИРОВАТЬ ПО
| Расход.Контрагент
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| Приход.Контрагент,
| СУММА(-Приход.Сумма)
|ИЗ
| Документ.Приход КАК Приход
|СГРУППИРОВАТЬ ПО
| Приход.Контрагент
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ПриходРасход.Контрагент,
| СУММА(ВТ_ПриходРасход.Долг) КАК Долг
|ИЗ
| ВТ_ПриходРасход КАК ВТ_ПриходРасход
|СГРУППИРОВАТЬ ПО
| ВТ_ПриходРасход.Контрагент";

Требования к объединению запросов

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Расход.Контрагент,

|ИЗ
| Документ.Расход КАК Расход
|СГРУППИРОВАТЬ ПО
| Расход.Контрагент
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| Приход.Контрагент,
| СУММА(-Приход.Сумма),
//добавляем нулевое поле скидка
| 0
|ИЗ
| Документ.Приход КАК Приход
|СГРУППИРОВАТЬ ПО
| Приход.Контрагент";

Осталось вычесть скидку и сгруппировать.

Также важен порядок. Поля будут объединятся именно в том порядке в котором они указаны в секциях ВЫБРАТЬ обоих запросов. Применительно к предыдущему примеру - поменяем местами поля скидка и сумма в выборке приходов:

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

; Вложенные запросы (в разработке).

Поступление товаров и услуг и Возврат товаров поставщику за указанный период.

Новые вкладки: Объединения/Псевдонимы.

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

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

В конструкторе перейдем на вкладку Объединения/Псевдонимы . Она предназначена для создания объединений запросов и для задания псевдонимов для полей запроса. Псевдонимы полей нужны, если вас не устраивают стандартные имена полей базы данных. Если поле запроса состоит только из поля таблицы базы данных, то псевдоним для него не обязателен. Если же при создании поля вы использовали функции языка запросов, то псевдоним для такого поля обязателен. Для таких полей конструктор запросов создает стандартные псевдонимы Поле1…ПолеN , эти псевдонимы можно заменить на те, которые удобны для вас.

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

  • Запросы (красная рамка). В данном разделе расположена таблица, в которой показаны все объединенные запросы, при помощи меню расположенного над данным разделом можно добавлять новые, копировать существующие и удалять выделенные, а также менять их местами. При добавлении или копировании запроса, конструктор переходит на вкладку Таблицы и поля , где можно задать таблицы базы данных и нужные поля для нового запроса. Переключаться между запросами можно при помощи вкладок, которые будут появляться с правой стороны конструктора, по мере добавления новых запросов 1с;

  • В таблице Запросы две колонки:
    • Имя . Задается автоматически в формате Запрос 1 … Запрос N ;
    • Без дубликатов . Устанавливается в случае, если необходимо исключить повторяющиеся строки при объединении с предыдущим запросом. Стоит отметить, что данный флаг будет действовать только на объединение запроса в котором он установлен с предыдущим запросом.

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

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

Разберем решение задачи, приведенной в начале урока. Напомню условия:

Задача: выбрать запросом все проведенные документы Поступление товаров и услуг и Возврат товаров поставщику за указанный период.

  1. Создадим новый запрос;
  2. Запустим конструктор запросов;
  3. Выберем таблицу ПоступлениеТоваровУслуг из ветки Документы ;
  4. Из таблицы ПоступлениеТоваровУслуг выберем поле Ссылка;
  5. Перейдем на вкладку Условия ;
  6. В разделе Поля , раскроем ветку ПоступлениеТоваровУслуг при помощи кнопки «+»;
  7. Найдем реквизит Дата и перетащим его в раздел условия, выберем оператор сравнения Между и укажем параметры начала и окончания периода, например НачалоПериода и ОкончаниеПериода ;
  8. Перейдем на вкладку Объединения / Псевдонимы .
  9. Добавим новый запрос, флаг Без дубликатов поднимать не нужно, так как мы используем разные типы документов;

  10. Конструктор запросов 1с автоматически перейдет на вкладку Таблицы и поля . В правой части окна будет видно, что активен второй запрос объединения;


  11. Повторим пункты 1 — 7, для таблицы ВозвратТоваровПоставщику ;
  12. Снова перейдем на вкладку Объединения / Псевдонимы . В таблице псевдонимов видно, что поля Ссылка обоих таблиц стоят в одной строке, а значит ссылки на оба документа будут находится в результате запроса в одной колонке;
  13. Сменим имя колонки с Ссылка на Документ (зададим псевдоним поля). Для этого дважды щелкнем левой кнопкой мыши по имени поля. После чего можно задать свое имя, впишем туда Документ ;

  14. Запрос готов, нажимаем кнопку «ОК» в нижней части окна конструктора.

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

Поделиться: