Объединение таблиц в запросе для отсеивания лишних строк.

1. BuryMeInVegas 30.09.19 14:24 Сейчас в теме
Добрый день. Столкнулся с полным непониманием, каким образом можно решить возникшую проблему.

Итак, задача: имеются справочники "Контрагенты" и "КонтактныеЛица", имеется регистр сведений, по которому движется документ "РаботаМенеджера". Когда менеджер обзванивает контрагента, запись ведётся в регистр. Необходимо составить запрос, который выводил бы 20 контрагентов, кому менеджер ещё не звонил (нет записей в регистре) и запланированные звонки.

Текст моего запроса следующий:

Запрос = Новый Запрос ("ВЫБРАТЬ
	                       |	ВложенныйЗапрос.Контрагент КАК Контрагент,
	                       |	ВложенныйЗапрос.КонтактноеЛицо КАК КонтактноеЛицо,
	                       |	ВложенныйЗапрос.ТипЗвонкаСсылка КАК ТипЗвонка,
	                       |	ВложенныйЗапрос.РезультатОбзвона КАК РезультатОбзвона,
	                       |	ВложенныйЗапрос.ПричинаПереноса КАК ПричинаПереноса,
	                       |	ВложенныйЗапрос.ДатаПереноса КАК ДатаПереноса
	                       |ИЗ
	                       |	(ВЫБРАТЬ ПЕРВЫЕ 20
	                       |		Контрагенты.Ссылка КАК Контрагент,
	                       |		КонтактныеЛица.Ссылка КАК КонтактноеЛицо,
	                       |		NULL КАК ТипЗвонкаСсылка,
	                       |		NULL КАК РезультатОбзвона,
	                       |		NULL КАК ПричинаПереноса,
	                       |		NULL КАК ДатаПереноса
	                       |	ИЗ
	                       |		Справочник.Контрагенты КАК Контрагенты
	                       |			ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
	                       |			ПО (КонтактныеЛица.Владелец = Контрагенты.Ссылка)
	                       |			ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеОЗвонках КАК ДанныеОЗвонках
	                       |			ПО Контрагенты.Ссылка <> ДанныеОЗвонках.Контрагент.Ссылка ЕСТЬ NULL
	                       |	
	                       |	ОБЪЕДИНИТЬ ВСЕ
	                       |	
	                       |	ВЫБРАТЬ
	                       |		ДанныеОЗвонках.Контрагент.Ссылка,
	                       |		КонтактныеЛица.Ссылка,
	                       |		ДанныеОЗвонках.ТипЗвонка.Ссылка,
	                       |		ДанныеОЗвонках.РезультатОбзвона,
	                       |		ДанныеОЗвонках.ПричинаПереноса,
	                       |		ДанныеОЗвонках.ДатаПереноса
	                       |	ИЗ
	                       |		РегистрСведений.ДанныеОЗвонках КАК ДанныеОЗвонках
	                       |			ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
	                       |			ПО ДанныеОЗвонках.Контрагент = КонтактныеЛица.Владелец
	                       |	ГДЕ
	                       |		ДанныеОЗвонках.ДатаПереноса >= &ТекущаяДата) КАК ВложенныйЗапрос");

Показать


Проблема: не понимаю, каким образом необходимо составить условие связи регистра сведений со справочником контрагенты, чтобы отсеять те записи, которые уже есть в регистре. Подскажите, пожалуйста, где моя ошибка?
Найденные решения
7. starjevschik 30.09.19 14:43 Сейчас в теме
Выбрать
блабла
ИЗ
Справочник
ЛЕВОЕ Соединение Регистр
По Регистр.СсылкаНаСправочник Есть NULL
ПодводныйТ; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. YannikAlx 43 30.09.19 14:38 Сейчас в теме
А прокоментируйте хоть одну непонятку
Вот это что такое
 ПО Контрагенты.Ссылка <> ДанныеОЗвонках.Контрагент.Ссылка ЕСТЬ NULL
3. ПодводныйТ 45 30.09.19 14:39 Сейчас в теме
Ну прикольно конечно, только если у менеджера нет специального списка клиентов, то ему выпадут вообще все контрагенты, которых нет в регистре. Надо делать не объединить все, а левым соединением присоединять регистр к контрагенту и условие, что запись в регистре = null
5. YannikAlx 43 30.09.19 14:41 Сейчас в теме
(3) Как могут выпасть все при ВЫБРАТЬ ПЕРВЫЕ 20 ??
6. ПодводныйТ 45 30.09.19 14:43 Сейчас в теме
(5) ну как бы в этом и странность - по какому принципу эти первые 20 отбираются, или нужны просто любые 20 необзвоненых? постановка задачи странная - вот я о чем.
9. YannikAlx 43 30.09.19 14:45 Сейчас в теме
(6) Постановка задачи в это части нормальная - ну просто выдаст 20, кому еще не звонили - нету тут никакой проблемы...
Проблема в другом, что при простой задаче накручен запутанный запрос ...
Вот (7) уже предложил суперупрощение... )))))
4. YannikAlx 43 30.09.19 14:39 Сейчас в теме
А вторая непонятка - "и запланированные звонки".
7. starjevschik 30.09.19 14:43 Сейчас в теме
Выбрать
блабла
ИЗ
Справочник
ЛЕВОЕ Соединение Регистр
По Регистр.СсылкаНаСправочник Есть NULL
ПодводныйТ; +1 Ответить
8. YannikAlx 43 30.09.19 14:43 Сейчас в теме
А вообще запрос очень сумбурный....
10. BuryMeInVegas 30.09.19 14:45 Сейчас в теме
Прошу прощения, давайте внесу ясность. Условие задачи подробно таково:

1) Организовать вывод 20 контрагентов из справочника "Контрагенты", не попавших в обзвон (т.е. тех, для кого нет соответствующих записей в регистре сведений).

2) Организовать вывод запланированных менеджером звонков (т.е. те контрагенты, с кем ещё не подписан договор).

На эту часть вопроса ответил.

Касательно этой строчки: ПО Контрагенты.Ссылка <> ДанныеОЗвонках.Контрагент.Ссылка ЕСТЬ NULL - я просто перебирал различные варианты, этот не подошёл и сам по себе полная чушь, с этим я разобрался. :)
12. ПодводныйТ 45 30.09.19 14:49 Сейчас в теме
(10) в (7) нормальное решение.
11. GeraltSnow 174 30.09.19 14:46 Сейчас в теме
Выбрать Первые 20 
Контрагенты.Ссылка  КАК Контрагент
Из 
Справочник.Контрагенты КАК Контрагенты
Где 
НЕ Контрагенты.Ссылка В (запрос по регистру ДанныеОЗвонках)


Вот так получишь контрагентов, которым ещё не звонили. Прикрути контактное лицо и отбор по ответственному менеджеру и получится то, что надо.
14. BuryMeInVegas 30.09.19 14:54 Сейчас в теме
(11)Такой вариант уже использовал, сказали, что так делать в этой задаче нельзя, мол читы. :)
16. ПодводныйТ 45 30.09.19 14:54 Сейчас в теме
17. BuryMeInVegas 30.09.19 15:01 Сейчас в теме
(16) Я сам не понял, мне это решение понравилось больше, но сверху сказали, мол при большом количестве записей в регистре (например, двух миллионах), запрос будет выполняться ой, как долго. :)
18. ПодводныйТ 45 30.09.19 15:02 Сейчас в теме
(17) делай как в (7) подсказали, у тебя ошибка в том, что ты делаешь "Объединить все", а надо - левое соединение с регистром
19. BuryMeInVegas 30.09.19 15:04 Сейчас в теме
В итоге запрос принял следующий вид, всё работает корректно:
Запрос = Новый Запрос ("ВЫБРАТЬ ПЕРВЫЕ 20
	                       |	Контрагенты.Ссылка КАК Контрагент,
	                       |	КонтактныеЛица.Ссылка КАК КонтактноеЛицо,
	                       |	NULL КАК ТипЗвонка,
	                       |	NULL КАК РезультатОбзвона,
	                       |	NULL КАК ПричинаПереноса,
	                       |	NULL КАК Дата
	                       |ИЗ
	                       |	Справочник.Контрагенты КАК Контрагенты
	                       |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
	                       |		ПО (КонтактныеЛица.Владелец = Контрагенты.Ссылка)
	                       |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеОЗвонках КАК ДанныеОЗвонках
	                       |		ПО Контрагенты.Ссылка = ДанныеОЗвонках.Контрагент
	                       |ГДЕ
	                       |	ДанныеОЗвонках.Контрагент ЕСТЬ NULL
	                       |
	                       |ОБЪЕДИНИТЬ ВСЕ
	                       |
	                       |ВЫБРАТЬ
	                       |	ДанныеОЗвонкахСрезПоследних.Контрагент,
	                       |	КонтактныеЛица.Ссылка,
	                       |	ДанныеОЗвонкахСрезПоследних.ТипЗвонка,
	                       |	ДанныеОЗвонкахСрезПоследних.РезультатОбзвона,
	                       |	ДанныеОЗвонкахСрезПоследних.ПричинаПереноса,
	                       |	ДанныеОЗвонкахСрезПоследних.ДатаПереноса
	                       |ИЗ
	                       |	РегистрСведений.ДанныеОЗвонках.СрезПоследних КАК ДанныеОЗвонкахСрезПоследних
	                       |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
	                       |		ПО ДанныеОЗвонкахСрезПоследних.Контрагент = КонтактныеЛица.Владелец
	                       |ГДЕ
	                       |	ДанныеОЗвонкахСрезПоследних.ДатаПереноса >= &ТекущаяДата");
Показать
13. BuryMeInVegas 30.09.19 14:53 Сейчас в теме
Текст запроса:
Запрос = Новый Запрос ("ВЫБРАТЬ ПЕРВЫЕ 20
	                       |	Контрагенты.Ссылка КАК Контрагент,
	                       |	КонтактныеЛица.Ссылка КАК КонтактноеЛицо,
	                       |	NULL КАК ТипЗвонка,
	                       |	NULL КАК РезультатОбзвона,
	                       |	NULL КАК ПричинаПереноса,
	                       |	NULL КАК Дата
	                       |ИЗ
	                       |	Справочник.КонтактныеЛица КАК КонтактныеЛица
	                       |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
	                       |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеОЗвонках КАК ДанныеОЗвонках
	                       |			ПО (ДанныеОЗвонках.Контрагент ЕСТЬ NULL)
	                       |		ПО КонтактныеЛица.Владелец = Контрагенты.Ссылка
	                       |
	                       |ОБЪЕДИНИТЬ ВСЕ
	                       |
	                       |ВЫБРАТЬ
	                       |	ДанныеОЗвонкахСрезПоследних.Контрагент,
	                       |	КонтактныеЛица.Ссылка,
	                       |	ДанныеОЗвонкахСрезПоследних.ТипЗвонка,
	                       |	ДанныеОЗвонкахСрезПоследних.РезультатОбзвона,
	                       |	ДанныеОЗвонкахСрезПоследних.ПричинаПереноса,
	                       |	ДанныеОЗвонкахСрезПоследних.ДатаПереноса
	                       |ИЗ
	                       |	РегистрСведений.ДанныеОЗвонках.СрезПоследних КАК ДанныеОЗвонкахСрезПоследних
	                       |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
	                       |		ПО ДанныеОЗвонкахСрезПоследних.Контрагент = КонтактныеЛица.Владелец
	                       |ГДЕ
	                       |	ДанныеОЗвонкахСрезПоследних.ДатаПереноса >= &ТекущаяДата");

Показать


Результат запроса на скринах. Всё равно в результат запроса попадают контрагенты, записанные в регистр сведений.
Прикрепленные файлы:
15. ПодводныйТ 45 30.09.19 14:54 Сейчас в теме
(13) потому что "ОБЪЕДИНИТЬ ВСЕ" - вот и выводит
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот