1. Главная страница » Компьютеры » 1С внутреннее соединение в запросе

1С внутреннее соединение в запросе

Автор: | 16.12.2019

В данной статье рассмотрено предложение ИЗ, его место и роль в языке запросов 1С:Предприятия 8.

Предложение ИЗ присутствует почти в каждом запросе 1С:Предприятия 8, так как в большинстве случаев именно в нем указываются таблицы-источники данных для запроса. Кроме того, предложение ИЗ позволяет выполнить соединение нескольких таблиц, а также указать параметры при получении виртуальной таблицы.

Ниже рассмотрены следующие темы:

Место предложения ИЗ в структуре запроса

Структуру запроса 1С:Предприятия 8 можно представить в виде следующей схемы:

Из приведенной схемы можно сделать следующие выводы:

  • В запросе может не быть предложения ИЗ (если поля в списке выборки полностью квалифицированы, т.е. включают имя таблицы).
  • Источников в запросе может быть несколько (в этом случае, они обычно соединяются по определенному условию)
  • В качестве источника может быть обычная таблица-источник, виртуальная таблица с параметрами, а также вложенный запрос
  • Для источника можно назначить псевдоним с помощью ключевого слова КАК ( Внимание: если источником является вложенный запрос, то псевдоним обязателен).

Таблицы-источники

Все таблицы-источники можно поделить на три класса:

  • Таблицы, связанные со ссылочными объектами конфигурации (справочники, планы, документы и журналы документов)
  • Таблицы, связанные с регистрами (сведений, накопления, бухгалтерии, расчета)
  • Таблицы, связанные с остальными объектами конфигурации (константы, последовательности, критерии отбора)

На следующих схемах применяются следующие условные обозначения:

1. Таблицы-источники, связанные со ссылочными объектами конфигурации:

2. Таблицы-источники, связанные с регистрами:

3. Таблицы-источники, связанные с другими объектами конфигурации:

Примеры запросов с предложением ИЗ

Выборка данных из различных таблиц-источников

Выборка элементов справочника:

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

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

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

Выборка проведенных документов, входящих в журнал СкладскиеДокументы:

ВЫБРАТЬ Ссылка, Номер, Дата
ИЗ ЖурналДокументов.СкладскиеДокументы
ГДЕ Проведен = Истина

Выборка активных записей регистра накопления:

ВЫБРАТЬ Номенклатура, ПодразделениеКомпании, СуммаПродажи
ИЗ РегистрНакопления.ПродажиКомпании
ГДЕ Активность = Истина

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

//обращение к табличной части документа
ВЫБРАТЬ Номенклатура, Количество
ИЗ Документ.АвансовыйОтчет.Товары

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

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

Виртуальные таблицы

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

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

//обращение к виртуальной таблице регистра накопления (вызов без параметров)
ВЫБРАТЬ * ИЗ РегистрНакопления.ПродажиКомпании.Обороты

//выборка оборотов за период
ВЫБРАТЬ * ИЗ РегистрНакопления.ПродажиКомпании.Обороты(&Нач, &Кон,,)

//выборка оборотов по конкретному товару
ВЫБРАТЬ * ИЗ РегистрНакопления.ПродажиКомпании.Обороты(. Номенклатура = &ВыбТовар)

//остатки товаров на определенную дату
ВЫБРАТЬ * ИЗ РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&ВыбДата,)

Замечание. Виртуальная таблица "Остатки", а также "ОстаткиИОбороты" существуют только у регистра накопления типа "Остатки". Виртуальная таблица "Обороты" существует у регистра оборотов и регистра остатков.Виртуальная таблица "ОборотыДтКт" существует только у регистра бухгалтерии с поддержкой корреспонденции.

Псевдонимы источников

Для источников можно задавать псевдонимы с помощью ключевого слова КАК (AS). Тогда при обращении к полям в списке полей выборки, условии и т.д. можно использовать псевдоним (а иногда без этого не обойтись).

Читайте также:  Installation failed with error 0x80070002

ВЫБРАТЬ Продажи.Номенклатура,
Продажи.ПодразделениеКомпании,
Продажи.СуммаПродажи
ИЗ РегистрНакопления.ПродажиКомпании КАК Продажи
ГДЕ Активность = Истина

Вложенный запрос как источник

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

ВЫБРАТЬ
Товары.Номенклатура КАК Товар,
Товары.Номенклатура.Артикул
ИЗ
(
ВЫБРАТЬ Номенклатура ИЗ Документ.ВнутреннийЗаказ.Товары
ОБЪЕДИНИТЬ
ВЫБРАТЬ Номенклатура ИЗ Документ.ЗаказПокупателя.Товары
) КАК Товары

Соединение таблиц

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

Рассмотрим сначала, что произойдет, если в предложении ИЗ будет несколько источников. В этом случае будет сформировано "декартово произведение" двух множеств. Каждой записи одной таблицы будут сопоставлены все записи из другой. Например,

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

Результат запроса содержит все комбинации записей из двух таблиц друг с другом:

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

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

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

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

Замечание. В данном примере того же эффекта можно добиться, если просто обращаться к имени поля через точку, что называется разыменованием ссылочных полей . При этом соединение таблиц производится неявно. Возможность разыменования полей в 1С:Предприятии 8 допускает обращение к свойствам объектов через несколько точек, например, «Номенклатура.Поставщик.Страна». Это позволяет значительно упростить написание запросов.

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

Замечание. При соединениях чаще всего применяется условие на "равно", но в языке запросов есть возможность использовать все операции сравнения и логические операции И, ИЛИ, НЕ.

Левое внешнее соединение

Конструкция ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Но, в отличие от внутреннего соединения, в результат запроса надо включить еще и записи из первого источника (указанного слева от слова СОЕДИНЕНИЕ), для которых не найдено соответствующих условию записей из второго источника.

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

Обратите внимание, что NULL-значения не являются нулем или пустой строкой. Это специальные маркеры, обозначающие неуказанные (отсутствующие) значения или значения, не имеющие смысла.

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

ВЫБРАТЬ Спр.Наименование КАК Валюта, Рег.Курс
ИЗ Справочник.Валюты КАК Спр
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК Рег
ПО Спр.Ссылка = Рег.Валюта

Читайте также:  Bq 5517 l twin pro

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

Для валюты "AUD" (Австралийский доллар) в таблице среза последних записей регистра сведений "КурсыВалют" не было найдено соответствующей записи, поэтому в поле "Курс" содержится значение NULL.

Правое внешнее соединение

Конструкция ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить еще и записи из второго источника (указанного справа от слова СОЕДИНЕНИЕ), для которых не найдено соответствующих условию записей из первого источника.

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

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

ВЫБРАТЬ Спр.Наименование КАК Валюта, Рег.Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних() КАК Рег
ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Справочник.Валюты КАК Спр
ПО Спр.Ссылка = Рег.Валюта

Полное внешнее соединение

Конструкция ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и те записи из обоих источников, для которых не найдено соответствий.

Правило. При полном внешнем соединении в результат запроса будут включены все записи из обоих источников; они будут соединены друг с другом при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из какого-либо источника, будут содержать NULL в полях, формируемых на основании записей из этого источника.

Таким образом, предложение ИЗ является одним из самых важных элементов языка запросов, поскольку позволяет указать таблицы-источники для запроса. Гибкие возможности предложения ИЗ позволяют использовать язык запросов для решения самых разнообразных задач.

Язык запросов 1С позволяет сделать соединения двух и более таблиц. Под соединением понимается состыковка двух таблиц по ключевым полям.

Всего 4 вида соединений

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

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

Условием соединения может быть и простое условие «ИСТИНА», которое соединит таблицы с значительным увеличением количества строк (каждая строка соединится с каждой строкой второй таблицы).

[qu_note note_color=»#f7ebe6″]Такие запросы на больших источниках может вызвать нехватку памяти, либо длительно выполнятся, вплоть до «зависания».[/qu_note]

Различные виды объединений используются для своих своих задач и целей:

Левое, когда требуется к одной основной таблице добавить какие-то свойства из другой. Например к списку контрагентов добавить задолженность, банковские реквизиты, фио руководителей.
При формировании такого запроса, следует добиться отсутствия в правой таблице дублей строк, этому способствует использование временных таблиц или вложенных. В противном случае в левой таблице появятся дубли контрагентов, что будет мешать верному восприятию.

Читайте также:  Dlna плеер для android

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

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

В управлении торговлей для решения такой задачи соединение не так уж важно, достаточного было бы обратится к регистру «Продажи», а вот в «Бухгалтерии предприятия» соединение будет более верным решением: ведь мы не знаем заранее какой счет учета используется для продажи, могут быть созданные пользователем субсчета (это даст более короткое решение, но все зависит от ситуации — не обязательно же оно должно быть универсальным).

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

Требование к таким таблицам:

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

Как задать соединение в конструкторе запроса:

Шаг 1: выберите необходимые таблицы, которые возможно соединить

  • Это производится на вкладке таблицы конструктора запроса.
  • Далее можно сразу выбрать нужные поля.

Шаг 2: Переходим на вкладку «Связи»

  • Для простых таблиц, где явно определяются связи, система их объединит самостоятельно
  • В данном случае левое соединение
  • Чтобы получить внутреннее: снимаются оба флажка «Все» — тогда в таблицу попадут только контрагенты у которых есть контактные лица
  • Чтобы получить полное: устанавливаются оба флажка
  • Если требуется соединение по двум условиям добавляется еще одна строка связи.

Вид соединения задается соответствующим словом перед «СОЕДИНЕНИЕ», остальной синтаксис идентичен. Правое не рассматриваем, так как конструктор запроса автоматически поменяет таблицы местами и сделает левое соединение.

Пример текста запроса «Внутреннее соединение»:

Пример левого соединения

Пример «полного соединения»

На что следует обратить внимание:

  • Как уже было сказано на пустые значения при левом или полном соединении.
  • С осторожностью используйте полные соединения и срезы последних из регистров, это может сильно замедлить выборку.
  • При использовании конструктора обращайте внимание на соединяемые таблицы иногда он может подставить в левую таблицу не ожидаемое вами, если это упустить вначале придется затем исправлять руками или через правое (одна секунда внимания сбережет время в дальнейшем).
  • Если вы выберете 2 таблицы, но не укажите связи, то получится неявное полное соединение (таблицы будут через «запятую»). Пример:

Закон рекламы: родившись, брэнд нуждается в рекламе для своего существования.

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Соединение в запросах в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

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

Нажмите одну из кнопок, чтобы поделиться:

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

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