1С 8 объединить все

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

  • левое;
  • правое,
  • внутреннее;
  • полное.

Каждый тип мы рассмотрим на абстрактном примере. Имеется 2 таблицы, в первой храним описательную информацию о номенклатуре, во второй о ее остатках:

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

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

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

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

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

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

Внутреннее соединение

Используя внутреннее соединение мы говорим системе, что в результате хотим видеть только те записи, которые удовлетворяют условию связи как из правой таблицы, так и из левой. Таким образом, количество результирующих записей будет меньше или равно количеству записей самой «короткой таблицы», участвующей в соединении. Применим внутреннее соединение к полям Товар и Цвет наших таблиц:

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

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

Полное соединение передаст в результат все записи из обоих таблиц, те записи, которые удовлетворяет условию связи — будут связаны, те записи, которые не удовлетворяют условию связи все равно окажутся в результате запроса, но с частью NULLовых полей. Полное это как бы левое и правое соединения в одном.
Задач на эту тему может быть много, давайте попробуем решить одну из них. Наша организация является дилером 2 мебельных фабрик: «Заря» и «Рассвет». Ассортимент со стоимостью каждой из фабрик хранится в разных таблицах. Необходимо составить единый прайс лист, причем брать в него продукцию по минимальной цене:
Применим полное соединение с выборкой всех полей, связывать будем по товару:
Запрос.Текст =
«ВЫБРАТЬ
| НоменклатураЗаря.Товар КАК ТоварЗаря,
| НоменклатураЗаря.Цена КАК ЦенаЗаря,
| НоменклатураРассвет.Товар КАК ТоварРассвет,
| НоменклатураРассвет.Цена КАК ЦенаРассвет
|ИЗ
| НоменклатураЗаря КАК НоменклатураЗаря
| ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
| ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар»;

Это не совсем то, что нам нужно, давайте соединим поле товар в одно и обработаем NULLы:
Запрос.Текст =
«ВЫБРАТЬ
//конструкция ЕСТЬNULL рассматривалась в разделе функции языка запросов
| ЕСТЬNULL(НоменклатураЗаря.Товар, НоменклатураРассвет.Товар) КАК Товар,
//если цена не определена, то инициализируем ее
//почему 1000000 см. пояснения ниже
| ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000) КАК ЦенаЗаря,
| ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000) КАК ЦенаРассвет
|ИЗ
| НоменклатураЗаря КАК НоменклатураЗаря
| ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
| ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар»;
Осталось только выбрать минимальную цену. Итоговый тект запроса будет выглядеть следующим образом:
Запрос.Текст =
«ВЫБРАТЬ
| ЕСТЬNULL(НоменклатураЗаря.Товар, НоменклатураРассвет.Товар) КАК Товар,
| ВЫБОР
| КОГДА ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000) > ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000)
| ТОГДА ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000)
| ИНАЧЕ ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000)
| КОНЕЦ КАК Цена
|ИЗ
| НоменклатураЗаря КАК НоменклатураЗаря
| ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
| ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар»;

Если цена не определена (NULL), то ее необходимо инициализировать каким либо значением, иначе операция сравнения на больше/меньше вывалится с ошибкой. инициализируем цену нереально большой суммой, чтобы она «проиграла» в операции сравнения, ведь по условию задачи мы подбираем наименьшую цену.

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

1С:Предприятие 8.2 /
Разработчикам /
Реализация обработки данных

1. Не следует использовать ИЛИ в секции ГДЕ запроса. Это может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время работы запроса и вероятность возникновения блокировок. Вместо этого следует разбить один запрос на несколько и объединить результаты.

Например, запрос

ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «001» ИЛИ Артикул = «002»

следует заменить на запрос:

ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «001» |ОБЪЕДИНИТЬ ВСЕ |ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «002»

2. Не рекомендуется использовать логическое ИЛИ в условиях соединения, то есть в секции ПО запроса. Это так же может привести к выбору неоптимального плана и медленной работе запроса. Простого универсального способа переписать такой запрос без использованияИЛИ не существует. Следует проанализировать решаемую задачу и попытаться найти другой алгоритм ее решения.

Например, неправильно:

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

Правильно:

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

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

3. Если в конфигурации описано несколько ролей с разным ограничением доступа на уровне записей (RLS), то не следует назначать одному пользователю более одной такой роли. Если один пользователь будет включен, например, в две роли с RLS — бухгалтер и кадровик, то при выполнении всех его запросов к их условиям будут добавляться условия обоих RLS с использованием логического ИЛИ. Таким образом, даже если в исходном запросе нет условия ИЛИ, оно появится там после добавления условий RLS. Такой запрос так же может выполняться неоптимально — медленно и с избыточными блокировками.

Вместо этого следует:

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

    Другие материалы по теме:
    объединить все, кадровик, объединить, артикул, роль, иначе, , условия, алгоритм, цена, буфер обмена, копировать, бухгалтер, состав, пользователь, обмен, план, время, выбрать, наименование, товары, конфигурирование, работы, товар, справочник, конфигурации

    Материалы из раздела: 1С:Предприятие 8.2 / Разработчикам / Реализация обработки данных

/// Как упорядочить результат запроса по /// определенным полям в 1с 8.3, 8.2 &НаСервере Процедура КакУпорядочитьРезультатЗапросаПоПолямНаСервере() // Чтобы сортировать строки в результате запроса // используется секция УПОРЯДОЧИТЬ ПО. // Требуется вывести продукты, упорядоченные // сначала по возрастанию цвета, а затем // по убыванию калорийности. Запрос = Новый Запрос( «ВЫБРАТЬ | Наименование, | Цвет, | Калорийность |ИЗ | Справочник.Номенклатура |УПОРЯДОЧИТЬ ПО | Цвет ВОЗР, | Калорийность УБЫВ» ); ВыполнитьЗапросИВывестиНаФорму(Запрос); КонецПроцедуры /// Как упорядочить результат запроса по /// выражению в 1с 8.3, 8.2 &НаСервере Процедура КакУпорядочитьРезультатЗапросаПоВыражениюНаСервере() // В секции УПОРЯДОЧИТЬ ПО можно использовать // выражения. // Например, упорядочим продукты по // максимальному содержанию белков и углеводов // вместе. Запрос = Новый Запрос( «ВЫБРАТЬ | Наименование, | Белки, | Углеводы, | Жиры, | Вода |ИЗ | Справочник.Номенклатура |УПОРЯДОЧИТЬ ПО | (Белки + Углеводы) УБЫВ» ); ВыполнитьЗапросИВывестиНаФорму(Запрос); КонецПроцедуры /// Как упорядочить результат запроса по /// иерархии в 1с 8.3, 8.2 &НаСервере Процедура КакУпорядочитьРезультатЗапросаПоИерархииНаСервере() // Для таблиц, для которых задано свойство иерархичности // возможно упорядочивание в соответствии с иерархией. // К примеру, сделаем вывод элементов из // справочника «Номенклатура» в порядке // их следования в иерархии справочника. Запрос = Новый Запрос( «ВЫБРАТЬ | Наименование |ИЗ | Справочник.Вкусы КАК Вкусы |УПОРЯДОЧИТЬ ПО | Наименование Иерархия» ); ВыполнитьЗапросИВывестиНаФорму(Запрос); КонецПроцедуры /// Как упорядочить результат запроса по /// агрегатной функции группировки в 1с 8.3, 8.2 &НаСервере Процедура КакУпорядочитьРезультатЗапросаПоАгрегатнойФункцииНаСервере() // В секции УПОРЯДОЧИТЬ ПО также возможно использование // агрегатных функций, которые были использованы для // группировки результата запроса. // Для каждого цвета — выберем минимальную калорийность // продукта, имеющиего такой цвет. А затем отсортируем // результат по возрастанию этой минимальной калорийности. Запрос = Новый Запрос( «ВЫБРАТЬ | Цвет, | МИНИМУМ(Калорийность) |ИЗ | Справочник.Номенклатура |СГРУППИРОВАТЬ ПО | Цвет |УПОРЯДОЧИТЬ ПО | МИНИМУМ(Калорийность) ВОЗР»); ВыполнитьЗапросИВывестиНаФорму(Запрос); КонецПроцедуры /// Как работает автоупорядочивание результата /// в 1с 8.3, 8.2 &НаСервере Процедура КакРаботаетАвтоупорядочиваниеНаСервере() // Предложение АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим // автоматического формирования полей для упорядочивания // результата запроса. // Автоупорядочивание работает по следующим принципам: // Если в запросе было указано предложение УПОРЯДОЧИТЬ ПО, // то каждая ссылка на таблицу, находящаяся в этом предложении, // будет заменена полями, по которым по умолчанию сортируется таблица // (для справочников это код или наименование, для документов – дата // документа). Если поле для упорядочивания ссылается на иерархический справочник, // то будет применена иерархическая сортировка по этому справочнику. // Если в запросе отсутствует предложение УПОРЯДОЧИТЬ ПО, // но есть предложение ИТОГИ, тогда результат запроса будет // упорядочен по полям, присутствующим в предложении // ИТОГИ после ключевого слова ПО, в той же последовательности и, // в случае если итоги рассчитывались по полям – ссылкам, // то по полям сортировки по умолчанию таблиц, на которые были ссылки. // Если в запросе отсутствуют предложения УПОРЯДОЧИТЬ ПО и ИТОГИ, // но есть предложение СГРУППИРОВАТЬ ПО, тогда результат запроса // будет упорядочен по полям, присутствующим в предложении, // в той же последовательности и, в случае если группировка велась // по полям – ссылкам, то по полям сортировки по умолчанию таблиц, // на которые были ссылки. // В случае же, если в запросе отсутствуют предложения и // УПОРЯДОЧИТЬ ПО, ИТОГИ и СГРУППИРОВАТЬ ПО, результат будет // упорядочен по полям сортировки по умолчанию для таблиц, // из которых выбираются данные, в порядке их появления в запросе. // В случае, если запрос содержит предложение ИТОГИ, каждый уровень // итогов упорядочивается отдельно. // В примере ниже мы сортируем по полю Ссылка и используем // ключевое слово АВТОУПОРЯДОЧИВАНИЕ. Система при этом // заменит поле Ссылка в секции УПОРЯДОЧИТЬ ПО на дату документа. Запрос = Новый Запрос( «ВЫБРАТЬ | Ссылка |ИЗ | Документ.ПродажаЕды |УПОРЯДОЧИТЬ ПО | Ссылка ВОЗР |АВТОУПОРЯДОЧИВАНИЕ» ); ВыполнитьЗапросИВывестиНаФорму(Запрос); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере

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

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

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

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

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

Такие запросы на больших источниках может вызвать нехватку памяти, либо длительно выполнятся, вплоть до «зависания».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ВЫБРАТЬ
Контрагенты.Ссылка,
КонтактныеЛица.Ссылка КАК КонтактноеЛицо
ИЗ
Справочник.Контрагенты КАК Контрагенты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты.ОсновноеКонтактноеЛицо = КонтактныеЛица.Ссылка
И (Контрагенты.ЮрФизЛицо = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)

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

ВЫБРАТЬ
Контрагенты.Ссылка,
КонтактныеЛица.Ссылка КАК КонтактноеЛицо
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты.ОсновноеКонтактноеЛицо = КонтактныеЛица.Ссылка
И (Контрагенты.ЮрФизЛицо = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)

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

ВЫБРАТЬ
Контрагенты.Ссылка,
КонтактныеЛица.Ссылка КАК КонтактноеЛицо
ИЗ
Справочник.Контрагенты КАК Контрагенты
ПОЛНОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты.ОсновноеКонтактноеЛицо = КонтактныеЛица.Ссылка
И (Контрагенты.ЮрФизЛицо = ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо)

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

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

ВЫБРАТЬ
Контрагенты.Ссылка,
КонтактныеЛица.Ссылка КАК КонтактноеЛицо
ИЗ
Справочник.Контрагенты КАК Контрагенты,
Справочник.КонтактныеЛица КАК КонтактныеЛица