Добрый вечер.
Нужно вывести по каждому физлицу все виды документов которые по которым нету записей отсутствуют в регистре, но есть в справочнике виды документов.. То есть к примеру есть 2 сотрудника то по каждому сотруднику должны попасть условно по 6 видов и всего в запросе будет 12 видов по 6 одинаковых для каждого.

Как это сделать в запросе? Понятно что через есть null, но как корректно соединить.

ФизЛицо ВидДокумента Ссылка
Иванов null Паспорт
Иванов null ИНН
Иванов null ОМС
Иванов null ДМС
Алёхин null Паспорт
Алёхин null ИНН
Алёхин null ОМС
Алёхин null ДМС

```1c
    ВЫБРАТЬ
    ДокументыСрезПоследних.ФизическоеЛицо КАК ФизическоеЛицо,
    ДокументыСрезПоследних.ВидДокумента КАК ВидДокумента,
    ВидыДокументов.Ссылка КАК Ссылка
    ИЗ
    Справочник.ВидыДокументов КАК ВидыДокументов
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыСрезПоследних.СрезПоследних КАК ДокументыСрезПоследних
    ПО (ДокументыСрезПоследних.ВидДокумента = ВидыДокументов .Ссылка)
```
---
```1c
    ВЫБРАТЬ
    ВложенныйЗапрос.ФизЛицо КАК ФизЛицо,
    ВложенныйЗапрос.ВидДокумента КАК ВидДокумента
    ИЗ
    (ВЫБРАТЬ
    ВидыДокументовФизическихЛиц.Ссылка КАК ВидДокумента,
    ФизическиеЛица.Ссылка КАК ФизЛицо
    ИЗ
    Справочник.ВидыДокументовФизическихЛиц КАК ВидыДокументовФизическихЛиц,
    Справочник.ФизическиеЛица КАК ФизическиеЛица) КАК ВложенныйЗапрос
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыФизическихЛиц.СрезПоследних КАК ДокументыФизическихЛицСрезПоследних
    ПО ВложенныйЗапрос.ВидДокумента = ДокументыФизическихЛицСрезПоследних.ВидДокумента
    И ВложенныйЗапрос.ФизЛицо = ДокументыФизическихЛицСрезПоследних.Физлицо
    ГДЕ
    ДокументыФизическихЛицСрезПоследних.ВидДокумента ЕСТЬ NULL
```
---
```1c
    ВЫБРАТЬ
    ДокументыФизическихЛицСрезПоследних.Физлицо КАК ФизЛицо,
    ВложенныйЗапрос.ВидДокумента КАК ВидДокумента
    ИЗ
    (ВЫБРАТЬ
    ВидыДокументовФизическихЛиц.Ссылка КАК ВидДокумента
    ИЗ
    Справочник.ВидыДокументовФизическихЛиц КАК ВидыДокументовФизическихЛиц) КАК ВложенныйЗапрос
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыФизическихЛиц.СрезПоследних КАК ДокументыФизическихЛицСрезПоследних
    ПО ВложенныйЗапрос.ВидДокумента = ДокументыФизическихЛицСрезПоследних.ВидДокумента
    ГДЕ
    ДокументыФизическихЛицСрезПоследних.ВидДокумента ЕСТЬ NULL
```
---
Если у физ лица не будет ни одной записи в регистре то оно не попадет в выборку
---
надо, чтобы попало )
---
Так я написал ниже запрос в который попадет
---
Как насчет ГДЕ?
---
,,,,,,,,,,,,,,,,
немного отсыпал Вам запятых
Казнить нельзя помиловать
---
```1c
    ВЫБРАТЬ
    ВложенныйЗапрос.ФизЛицо КАК ФизЛицо,
    ВложенныйЗапрос.ВидДокумента КАК ВидДокумента
    ИЗ
    (ВЫБРАТЬ
    ВидыДокументовФизическихЛиц.Ссылка КАК ВидДокумента,
    ФизическиеЛица.Ссылка КАК ФизЛицо
    ИЗ
    Справочник.ВидыДокументовФизическихЛиц КАК ВидыДокументовФизическихЛиц,
    Справочник.ФизическиеЛица КАК ФизическиеЛица) КАК ВложенныйЗапрос
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыФизическихЛиц.СрезПоследних КАК ДокументыФизическихЛицСрезПоследних
    ПО ВложенныйЗапрос.ВидДокумента = ДокументыФизическихЛицСрезПоследних.ВидДокумента
    И ВложенныйЗапрос.ФизЛицо = ДокументыФизическихЛицСрезПоследних.Физлицо
    ГДЕ
    ДокументыФизическихЛицСрезПоследних.ВидДокумента ЕСТЬ NULL
```
---
Спасибо!
Но вроде же, если у физ лица будет заведен ОМС, то в выборку два раза попадёт ОМС. Один заполненый,другой пустой..
---
Там левая связь не только по физ лицу, но еще и по виду документа, так что нет, не попадет 2 раза, и обратите внимание на условие
---
Эх мне бы Вашу соображалку :) Благодарю!
---
Правда не очень красиво наверно тянуть фул справочник и всех физ лиц вложенном. Без вложенного никак?
---
(4) Правда не очень красиво наверно тянуть фул справочник и всех физ лиц вложенном. Без вложенного никак? Писал на коленке, синтаксис проверяйте. Так вообще без JOIN, если не считать обязательное для решения этой задачи, декартово перемножение :-). Есть и другие варианты без JOIN, но такие конструкции SQL не поддерживаются в 1С запросах.
В данном случае это простая и стандартная задача вычитания двух множеств т1 EXCEPT т2.
```1c
    ВЫБРАТЬ
    т1.Ссылка КАК ФизЛицо
    ,т2.Ссылка КАК ВидДокумента
    ИЗ
    Справочник.ФизическиеЛица КАК т1
    ,Справочник.ВидыДокументовФизическихЛиц КАК т2
    ГДЕ
    НЕ (т1.Ссылка, т2.Ссылка) В
    (ВЫБРАТЬ т3.ФизЛицо, т3.ВидДокумента ИЗ РегистрСведений.ДокументыФизическихЛиц.СрезПоследних КАК т3)
```
---
Стараюсь не В вообще не использовать. Не оптимально..
Как и в (4) тоже. Надо бы соединениями только обойтись
---
Ну если нужно по всем физ лицам то да
---
По сути это такой запрос, но синтаксис 1С так не умеет. UNION 1С умеет, а EXCEPT, INTERSECT не умеет.
```1c
    ВЫБРАТЬ
    т1.Ссылка КАК ФизЛицо
    ,т2.Ссылка КАК ВидДокумента
    ИЗ
    Справочник.ФизическиеЛица КАК т1
    ,Справочник.ВидыДокументовФизическихЛиц КАК т2

    EXCEPT ALL

    ВЫБРАТЬ
    т3.ФизЛицо
    ,т3.ВидДокумента
    ИЗ
    РегистрСведений.ДокументыФизическихЛиц.СрезПоследних КАК т3
```
---
В данной задаче самый быстрый вариант наверное будет EXCEPT. Но его в 1С нет.
Но если физических лиц тысяч 20 и видов документов десяток, то все эти запросы всё равно выполнятся слишком быстро (можете проверить и сообщить нам свои результаты), что бы заниматься оптимизацией. На первый план выходит читабельность текста запроса. А тут уже кому как удобнее :-)