Перейти к содержимому

Объединить все и объединить 1с в чем разница

  • автор:

v8: В чем отличия «Объединить» и «Объединить Все» (было: «Языку запросов в 1С 8.2 верить нельзя»)

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

ВЫБРАТЬ Сотрудник.ФизЛицо, ВидРасчета, Результат
ИЗ ВТ1
СГРУППИРОВАТЬ ПО Сотрудник.ФизЛицо
УПОРЯДОЧИТЬ ПО Сотрудник.ФизЛицо.Наименование

в наборе данных, полученном из таблицы основных начислений есть 2 абсолютно одинаковых строки. И представьте себе во временной таблице эти две строки заменяются одной!

Объединение таблиц в запросах 1С

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

Продемонстрирую это на примере.
Откроем консоль запросов и создадим небольшой запрос, который создаст нам элементарную таблицу из пары колонок и одной строки:

В результате выполнения запроса получаем вот такую таблицу

Код ИмяСайта
001 professia1c.ru

А теперь добавим в нашу таблицу еще пару строк

Код ИмяСайта
001 professia1c.ru
002 1c.ru
001 professia1c.ru

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

В итоге видим, что дубли строк у нас исчезли

Код ИмяСайта
001 professia1c.ru
002 1c.ru

ЗапросыОбъединение_ВЗ

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

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

Объединить все и объединить 1с в чем разница

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

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

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

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

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

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

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

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

23

24

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

25

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

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

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

26

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

27

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

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

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

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

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

28

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

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

29

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

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

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

30

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

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

31

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

32

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

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

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

33

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

34

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

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

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

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

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

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

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

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

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

В чем разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С

Цитата из справки 1С:
"По умолчанию при объединении запросов полностью одинаковые строки в результате запроса, сформированные РАЗНЫМИ запросами, заменяются одной. Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое слово ВСЕ."

Конструкция ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ объединяет два результата запроса в один.
Пример запроса для вывода всех документов Приход и Расход:
Код 1C v 8.х

Конструкция ОБЪЕДИНИТЬ — соединяет два результата и группирует повторяющие строки,
А конструкция ОБЪЕДИНИТЬ ВСЕ — НЕ группирует автоматически строки результата.

Подробнее:
Порядок следования определяется порядком в списке полей в предложении ВЫБРАТЬ.
Количество полей можно изменить добавлением пустого фиктивного поля:
Код 1C v 8.х

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

Смысл механизма
При объединении, фактически, выполняются два запроса, а потом их результаты объединяются в один общий. Конструкция ОБЪЕДИНИТЬ ВСЕ оставит в итоговом запросе только неповторяющиеся записи (то есть, результат её действия аналогичен использованию фразы РАЗЛИЧНЫЕ после выполнения объединения).

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *