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