Для чего используется объединение результатов запросов в системе 1С:Предприятие 8?
Доброго времени суток, уважаемые читатели блога SoftMaker.kz. Сегодня мы детально обсудим объединение запросов в 1С. Вы можете также скачать реальный пример объединения запроса в отчете по резервам для типовой конфигурации Управление торговым предприятием для Казахстана, редакция 1.0. Давайте перейдем к обсуждению!
Если Вы работаете с одной таблицей, то Вам нет необходимости использовать объединение. Совсем другое дело, когда Вы работаете с несколькими таблицами и Вам, например, нужно получить данные по покупкам и по продажам товаров.
Для объединения используется предложение ОБЪЕДИНИТЬ / UNION. На самом деле происходит объединение результатов запросов, то есть каждый запрос собирает данные независимо друг от друга, а затем эти результаты объединяются в один. И только над последним запросом выполняются остальные операции, например, упорядочивание и расчет итогов.
В отличие от соединения запросов при объединении запросов происходит «вертикальное склеивание» результатов, то есть сначала идут строки результата первого запроса, затем второго. Перейдём к практике:
ВЫБРАТЬ Номенклатура, Количество, Сумма ИЗ Документ.Приходная.Товары ОБЪЕДИНИТЬ ВЫБРАТЬ Номенклатура, Количество, Сумма ИЗ Документ.Расходная.Товары
Результат этого запроса следующий:
Номенклатура | Количество | Сумма |
Бумага А4 | 25 | 14 500 |
Стикеры 500л | 8 | 4 880 |
Файл прозрачный | 5 | 4 100 |
Набор офисный | 8 | 8 840 |
В итоге мы получим две таблицы, которые будут соединены друг с другом. Трудно увидеть, где кончается документ Приходная и начинается документ Расходная. Но мы кое-что сделаем, чтобы разобраться:
ВЫБРАТЬ Номенклатура, Количество КАК КолПриход, Сумма КАК СумПриход, 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 |
Теперь нам нужно из результат запроса убрать дублирующиеся элементы. У нас два запроса и если мы будем сворачивать, каждый отдельно, чтобы исключить дублирующиеся элементы, то у нас ничего не получится. Поэтому мы приведём запрос к следующему виду:
ВЫБРАТЬ Номенклатура, СУММА(КолПриход) КАК КолПриход, СУММА(СумПриход) КАК СумПриход, СУММА(КолРасход) КАК КолРасход, СУММА(СумРасход) КАК СумРасход ИЗ (ВЫБРАТЬ Номенклатура, Количество КАК КолПриход, Сумма КАК СумПриход, 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. Мы использовали здесь четыре подзапрос. Если мы хотим оставлять в запросе только уникальные значения записей, не используя группировку, тогда, нужно писать предложение ОБЪЕДЕНИТЬ без ключевого слова ВСЕ.
[dwqa-list-questions]
ВЫБРАТЬ
Номенклатура,
Количество,
Сумма
ИЗ
Документ.Приходная.Товары
ОБЪЕДИНИТЬ
ВЫБРАТЬ
Номенклатура,
Количество,
Сумма
ИЗ
Документ.Приходная.Товары
наверное во втором должна быть таблица из Расходные, правда?)
Спасибо за внимательность, myr4ik07! Исправим!