Содержание:
1. Внутреннее соединение таблиц
6. Перекрёстное соединение (декартово произведение )
Для извлечения и обработки данных в «1С:Предприятии» используют запросы, которые пишутся на собственном SQL-подобном языке запросов. Зачастую в запросе нужно собрать данные из нескольких таблиц, соединив данные из них в результирующей таблице. При этом обычно требуется связать данные таблиц по некоторому общему полю.
Таблицы, являющиеся источниками данных для последующего соединения, перечисляются в запросе после ключевого слова ИЗ.
Обычно таблицы, из которых извлекаются данные в запросе с соединением, связываются между собой по некому условию (условию связи). Соединение таблиц в запросах обычно производится по полю, имеющему ссылочный тип, для каждой записи в исходных таблицах производится проверка условия (на равенство, неравенство) значений полей, выступающих условием связи. Это условие задаётся в запросе после ключевого слова ПО в предложении ИЗ, например: ПО Должности.ФизЛицо = ФизЛица.Ссылка.
В соответствии с тем, должны ли записи таблиц-источников удовлетворять условию связи, можно выделить несколько вариантов соединения двух таблиц: внутреннее и внешнее соединение, к которому относят левое и правое соединение, полное соединение, при этом в запросе используются соответствующие ключевые слова.
Рассмотрим каждый из видов соединения подробнее и расскажем, как соединить две таблицы.
1. Внутреннее соединение таблиц
В результате внутреннего соединения таблиц соединяются лишь записи из таблиц-источников данных, удовлетворяющие объявленному условию связи, прочие же записи игнорируются. Иными словами, запрос ищет строки с идентичным значением ключа и включает в результат только их. Ключевое слово ВНУТРЕННЕЕ в тексте запроса использовать необязательно. Стоит отметить, что в результате запроса в случае, когда несколько одинаковых записей удовлетворяют условию, в таблицу попадёт каждая из них.
Продемонстрируем сказанное на пример. Пусть у нас имеются две таблицы: ФизЛица и Должности:
Запрос: Справочник.ФизЛица (Записей в результате: 8)
Рисунок 1. Исходная таблица 1 ФизЛица
Запрос: Справочник.Должности (Записей в результате: 8)
Рисунок 2. Исходная таблица 2 Должности
Выполним следующий запрос для внутреннего соединения:
ВЫБРАТЬ
ФизЛица.Код КАК Код,
ФизЛица.Наименование КАК Имя,
ГОД(ФизЛица.ДатаРождения) КАК ГодРождения,
Должности.Наименование КАК Должность,
Должности.Отдел КАК Отдел
ИЗ
Справочник.ФизЛица КАК ФизЛица
ВНУТРЕННЕЕ СОЕДИНЕНИЕСправочник.Должности КАК Должности
ПО Должности.ФизЛицо = ФизЛица.Ссылка
УПОРЯДОЧИТЬ ПО
Код
В результате внутреннего соединения таблиц получим такую таблицу:
Запрос: Справочник.ФизЛица (Записей в результате: 6)
Как видим, в результате мы получили исключительно те строки из двух таблиц-источников, которые соответствовали объявленному условию, а физлица и должности, не сопоставленные друг другу, в таблицу не вошли.
2. Внешнее соединение таблиц
Данный тип соединения, именуемый внешним соединением таблиц, приводит к принципиально иному результату, что и обусловливает его название – в результат запроса попадут как те строки, которые удовлетворяют объявленному в тексте запроса условию работы соединения, так и строки, для которых соответствия в другой таблице не было найдено.
Рассмотрим варианты внешних соединений – левого и правого соединения.
3. Левое соединение в 1С
Метод левого соединения в 1С Предприятие – это способ соединения, при котором помимо записей из обеих таблиц-источников, удовлетворяющих объявленному условию работы соединения, в полученную после выполнения запроса таблицу попадают записи из левой относительно ключевого слова СОЕДИНЕНИЕ таблицы значений (безотносительно наличия соответствий в правой таблице-источнике).
При этом в результирующей таблице «недостающим» значениям будет присвоено NULL. Из правой таблицы-источника в результирующей таблице будут исключительно те записи, для которых соблюдается объявленное условие, прочие же записи будут игнорированы.
Ключевое слово ВНЕШНЕЕ в тексте запроса использовать не обязательно.
Приведём текст запроса:
ВЫБРАТЬ
ФизЛица.Код КАК Код,
ФизЛица.Наименование КАК Имя,
ГОД(ФизЛица.ДатаРождения) КАК ГодРождения,
Должности.Наименование КАК Должность,
Должности.Отдел КАК Отдел
ИЗ
Справочник.ФизЛица КАК ФизЛица
ЛЕВОЕ СОЕДИНЕНИЕСправочник.Должности КАК Должности
ПО Должности.ФизЛицо = ФизЛица.Ссылка
УПОРЯДОЧИТЬ ПО
Код
Результат выполнения запроса будет иметь следующий вид:

Рисунок 4. . Демонстрация левого соединения
Из таблицы видно, что из левой таблицы-источника ФизЛица были взяты все записи, даже те, для которых не нашлось соответствия в правой таблице Должности.
4. Правое соединение
Этот способ соединения, если сравнить его с левым, даёт зеркально противоположный результат. Иначе говоря, из правой таблицы-источника будут взяты все записи, тогда как из левой – лишь те, что соответствуют записям правой таблицы-источника, то есть те, для которых удовлетворяется объявленное условие связи.
При этом в результирующей таблице «недостающим» (для которых не найдены связи по условию) значениям будет присвоено NULL.. Указание ключевого слова ВНЕШНЕЕ в тексте запроса не имеет принципиального значения.
Фактически, правое соединение преобразуется к левому, если поменять таблицы одну относительно другой местами и соединить их левым – противоположным – соединением. Такое преобразование осуществляет платформа «1С:Предприятия» при выполнении запроса.
В случае и левого, и правого соединения принципиальный момент заключается в том, по какую сторону от ключевого слова СОЕДИНЕНИЕ в тесте запроса указана соответствующая таблица, сам же порядок указания таблиц в условии связи неважен.
Запрос с использованием правого соединения:
ВЫБРАТЬ
ФизЛица.Код КАК Код,
ФизЛица.Наименование КАК Имя,
ГОД(ФизЛица.ДатаРождения) КАК ГодРождения,
Должности.Наименование КАК Должность,
Должности.Отдел КАК Отдел
ИЗ
Справочник.ФизЛица КАК ФизЛица
ПРАВОЕ СОЕДИНЕНИЕСправочник.Должности КАК Должности
ПО Должности.ФизЛицо = ФизЛица.Ссылка
УПОРЯДОЧИТЬ ПО
Код
Результат запроса:
Запрос: Справочник.ФизЛица (Записей в результате: 8)

Рисунок 5. Демонстрация правого соединения
Как видим, теперь все записи взяты из правой таблицы Должности, и в таблице оказались даже те записи о должностях, для которых не нашлось физлиц.
5. Полное соединение в 1С
При полном соединении в 1С Предприятие в результате таблица будет состоять как из удовлетворяющих условию объединения записей, так и тех записей, для которых это условие не было выполнено. Иначе говоря, в результате получится таблица, состоящая из всех строк обеих исходных таблиц.
При этом в результирующей таблице «недостающим» (для которых не найдены связи по условию) значениям будет присвоено NULL.
Запрос:
ВЫБРАТЬ
ФизЛица.Код КАК Код,
ФизЛица.Наименование КАК Имя,
ГОД(ФизЛица.ДатаРождения) КАК ГодРождения,
Должности.Наименование КАК Должность,
Должности.Отдел КАК Отдел
ИЗ
Справочник.ФизЛица КАК ФизЛица
ПОЛНОЕ СОЕДИНЕНИЕСправочник.Должности КАК Должности
ПО Должности.ФизЛицо = ФизЛица.Ссылка
УПОРЯДОЧИТЬ ПО
Код
Запрос: Справочник.ФизЛица (Записей в результате: 10)

Рисунок 6. Демонстрация полного соединения
В результате запроса в таблице, кроме полных строк, оказались как сведения о физлицах, для которых нет соответствия в таблице Должности, так и должности, не связанные с физлицами.
6. Перекрёстное соединение (декартово произведение )
Перекрёстное соединение позволяет соединить каждую строку одной таблице с каждой строкой другой таблице. Такой запрос приведёт к созданию таблицы размером x*y, где x и y – соответственно, число строк в соединяемых таблицах.
С математической точки зрения, приведённые выше виды внешних соединений таблиц являются производными от декартова произведения, однако используются намного чаще, так как результат декартова произведения обычно избыточен для пользователя.
Приведём запрос перекрёстного соединения:
ВЫБРАТЬ
ФизЛица.Код КАК Код,
ФизЛица.Наименование КАК Имя,
ГОД(ФизЛица.ДатаРождения) КАК ГодРождения,
Должности.Наименование КАК Должность,
Должности.Отдел КАК Отдел
ИЗ
Справочник.ФизЛица КАК ФизЛица
ПОЛНОЕ СОЕДИНЕНИЕСправочник.Должности КАК Должности
ПО ИСТИНА
УПОРЯДОЧИТЬ ПО
Код
Заметим, что запрос можно написать иначе:
ВЫБРАТЬ
ФизЛица.Код КАК Код,
ФизЛица.Наименование КАК Имя,
ГОД(ФизЛица.ДатаРождения) КАК ГодРождения,
Должности.Наименование КАК Должность,
Должности.Отдел КАК Отдел
ИЗ
Справочник.ФизЛица КАК ФизЛица,
Справочник.Должности КАК Должности
Запрос: Справочник.ФизЛица (Записей в результате: 64)

Рисунок 7. Заголовок таблицы декартова произведения
В результате выполнения запроса получается таблица с 64 строками (8*8).
Специалист компании «Кодерлайн»
Дмитрий Колесников