1с два запроса в одном отчете

Обновлено: 07.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

26

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

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

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

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

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

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

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

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

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

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

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

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

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

31

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

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

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

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

33

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

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

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

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

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

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

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

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

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

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

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

Ниже приведён алгоритм создания подобного отчёта.

1. Создать новый отчёт, открыть основную схему компоновки данных.

2. Добавить 2 набора данных типа "запрос". В первом наборе данных будем получать данные по взаиморасчётам, во втором - курсы валют.

Важно! Псевдонимы полей запросов не должны повторяться.

Добавление наборов данных

Набор данных Взаиморасчеты

Набор данных КурсыВалют

3. На вкладке "Настройки" создать новую группировку без заполнения значения "Поле".

Создание новой группировки

Создание новой группировки

4. Настроить список полей для вывода первой таблицы (Курсы валют).

Настройка полей таблицы Курсы валют

5. Повторить пп.3 и 4 для второй таблицы (Взаиморасчёты).

Настройка полей таблицы Взаиморасчёты

6. Сохранить отчёт.

В результате сформированный отчёт будет иметь подобный вид:

Пример сформированного отчёта

Пример отчёта для конфигураций Управление торговлей 10.3 и Управление производственным предприятием 1.3


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

Например, есть 3 таблицы:




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


Таблиц в объединении может быть сколько угодно.

Количество полей в объединяемых запросах должно совпадать. Если попытаться выполнить следующий запрос:

У каждого запроса объединения свои секции ВЫБРАТЬ, ИЗ, СГРУППИРОВАТЬ ПО, ГДЕ. А секции УПОРЯДОЧИТЬ ПО и ИТОГИ общие.

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

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

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


То есть были выбраны все коды элементов из всех таблиц.

Если заменить ОБЪЕДИНИТЬ ВСЕ на ОБЪЕДИНИТЬ, то результат изменится:


В результате запроса остались только неповторяющиеся записи. То есть результат запроса был свернут по всем полям запроса. При этом достаточно, чтобы только в одном объединении было указано просто ОБЪЕДИНИТЬ, чтобы весь результат объединения был свернут:

//несмотря на то что здесь указано ВСЕ результат был свернут


Разница между соединением и объединением

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

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

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

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

На прошлом уроке мы познакомились с соединением наборов данных. Сегодня же мы научимся объединять различные наборы данных в один набор.

Ставим цель

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

Создаем новый отчет

Открываем базу "Гастроном" в конфигураторе и через главное меню "Файл->Новый. " создаём отчёт:

Вид документа - "Внешний отчет":

В форме нового отчёта указываем имя "Урок7" и нажимаем кнопку "Открыть схему компоновки данных":


Соглашаемся с именем макета по умолчанию:

Создаем первый набор данных

Создаём новый набор данных - запрос (через зелёный плюсик), выделяем его и вызываем конструктор запроса:


Делаем выборку из таблицы документов "ПоступлениеЕды" следующих полей:

Вот он, текст нашего запроса к таблице по закупкам:


Создаем второй набор данных

Выделяем мышкой пункт "Наборы данных".


. и добавляем ещё один набор данных - запрос:


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


Делаем выборку из таблицы документов "ПродажаЕды" следующих полей:

Текст запроса будет таким:


Сделаем имена более читабельными. Для этого двойным щелчком переименуем "НаборДанных1" в "Покупки" и поле "Дата" в "ДатаПокупки":


Второй же набор "НаборДанных2" переименуем в "Продажи", а поле "Дата" переименуем в "ДатаПродажи":


Мы получили два набора данных. В первом - информация по покупкам (дата покупки и поставщик), во втором- информация по продажам (дата продажи и клиент). Давайте попробуем теперь вывести всё это в отчет.

Проверяем результат

Переходим на закладку "Настройки" и нажимаем волшебную палочку для вызова конструктора:


Тип отчета - "Список. ":

Выбираем поля для отчёта из обоих наборов:

Сохраняем отчёт и формируем в режиме пользователя:


Получилось не совсем то, что ожидали. Получилось перекрёстное соединение одного набора данных с другим. А нам нужно именно объединение. Исправим.

Создаем объединение наборов данных

Для этого переходим на закладку "Наборы данных".

Снова выделяем мышкой пункт "Наборы данных".


. и добавляем туда набор данных - объединение:

Видим, что этот набор добавился и у него совершенно другая картинка (не таблица, как у двух других, а два объединяющихся круга):


Затем перетаскиваем мышкой наборы "Покупки" и "Продажи" в "НаборДанных1":


Вот это и значит, что теперь "Покупки" и "Продажи" будут не соединяться, а именно объединяться в отчёте.

Сохраним отчёт и сформируем в режиме пользователя:


Отлично. То, что надо.

А давайте зададимся целью объединить столбцы "Поставщик" и "Клиент" в один? И пусть этот новый столбец будет называться "Контрагент".

Для этого заходим на закладку "Наборы данных" и меняем имя поля "Поставщик" в наборе "Покупки" на имя "Контрагент":


Затем в наборе "Продажи" меняем имя поля "Клиент" на имя "Контрагент":


Переходим на закладку "Настройки", выделяем пункт "Отчет", переходим внизу на закладку "Выбранные поля", удаляем уже не существующие поля "Поставщик" и "Клиент" и перетаскиваем из первой колонки во вторую новое поле "Контрагент":


Должно получится вот так:


Готово

Сохраняем отчёт и проверяем в режиме пользователя:


Замечательно всё получилось.

Эталонная обработка, после выполнения всех шагов этого урока

Войдите на сайт как ученик

Для учеников

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

На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .

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