Старнная работа ПОЛНОГО СОЕДИНЕНИЯ в запросе.
Уважаемы форумчане. Помогите решить вопрос.
Платформа: 1С:Предприятие 8.3 (8.3.18.1334)
Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.102.11)
Решил написать простенький отчет по документу Путевой лист (не кидаться в меня сразу тухлыми помидорами, знаю что плохо делать запрос к документам, но тут надо было).
Делаю запрос к двум ТЧ в этом документе и связываю ПОЛНЫМ СОЕДИНЕНИЕМ.
Так вот выдает мне данный запрос не все нужные документы, а только те, в которых заполнена ТЧ Топливо. Если же ТЧ топливо не заполнено, а ТЧ Маршрут имеет значения - такой документ в выборку не попадает.
Переписал запрос через временные таблицы. Получилось вот так:
Второй запрос отрабатывает как надо.
Кстати в первом запросе не использовал для дат МЕЖДУ, т.к. тоже не отрабатывало, а надо было быстро не стал разбираться.
В итоге 2 вопроса:
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
Платформа: 1С:Предприятие 8.3 (8.3.18.1334)
Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.102.11)
Решил написать простенький отчет по документу Путевой лист (не кидаться в меня сразу тухлыми помидорами, знаю что плохо делать запрос к документам, но тут надо было).
Делаю запрос к двум ТЧ в этом документе и связываю ПОЛНЫМ СОЕДИНЕНИЕМ.
ВЫБРАТЬ
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.Дата, ПутевойЛистМаршрут.Ссылка.Дата) КАК Дата,
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка, ПутевойЛистМаршрут.Ссылка) КАК ПутевойЛист,
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство) КАК ТранспортноеСредство,
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ФизЛицо, ПутевойЛистМаршрут.Ссылка.ФизЛицо) КАК Сотрудник,
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство.НормаРасхода, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство.НормаРасхода) КАК НормаРасхода,
СУММА(ПутевойЛистТопливо.Количество) КАК Количество,
СУММА(ПутевойЛистМаршрут.Расстояние) КАК Расстояние,
СУММА(ПутевойЛистМаршрут.Расход) КАК Расход
ИЗ
Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
ПО ПутевойЛистМаршрут.Ссылка = ПутевойЛистТопливо.Ссылка
ГДЕ
ПутевойЛистМаршрут.Ссылка.Проведен
И ПутевойЛистТопливо.Ссылка.Проведен
И ПутевойЛистМаршрут.Ссылка.Дата >= &ДатаНач
И ПутевойЛистМаршрут.Ссылка.Дата <= &ДатаКон
И ПутевойЛистТопливо.Ссылка.Дата >= &ДатаНач
И ПутевойЛистТопливо.Ссылка.Дата <= &ДатаКон
СГРУППИРОВАТЬ ПО
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.Дата, ПутевойЛистМаршрут.Ссылка.Дата),
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка, ПутевойЛистМаршрут.Ссылка),
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство),
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ФизЛицо, ПутевойЛистМаршрут.Ссылка.ФизЛицо),
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство.НормаРасхода, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство.НормаРасхода)
УПОРЯДОЧИТЬ ПО
Дата
ПоказатьТак вот выдает мне данный запрос не все нужные документы, а только те, в которых заполнена ТЧ Топливо. Если же ТЧ топливо не заполнено, а ТЧ Маршрут имеет значения - такой документ в выборку не попадает.
Переписал запрос через временные таблицы. Получилось вот так:
ВЫБРАТЬ
ПутевойЛистТопливо.Ссылка.Дата КАК Дата,
ПутевойЛистТопливо.Ссылка КАК Ссылка,
ПутевойЛистТопливо.Ссылка.ТранспортноеСредство КАК ТранспортноеСредство,
ПутевойЛистТопливо.Ссылка.ФизЛицо КАК ФизЛицо,
ПутевойЛистТопливо.Ссылка.НормаРасхода КАК НормаРасхода,
СУММА(ПутевойЛистТопливо.Количество) КАК Количество
ПОМЕСТИТЬ вт_Топливо
ИЗ
Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
ГДЕ
ПутевойЛистТопливо.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПутевойЛистТопливо.Ссылка.ФизЛицо = &ФизЛицо
И ПутевойЛистТопливо.Ссылка.Проведен
СГРУППИРОВАТЬ ПО
ПутевойЛистТопливо.Ссылка.Дата,
ПутевойЛистТопливо.Ссылка,
ПутевойЛистТопливо.Ссылка.ТранспортноеСредство,
ПутевойЛистТопливо.Ссылка.ФизЛицо,
ПутевойЛистТопливо.Ссылка.НормаРасхода
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ПутевойЛистМаршрут.Ссылка.Дата КАК Дата,
ПутевойЛистМаршрут.Ссылка КАК Ссылка,
ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство КАК ТранспортноеСредство,
ПутевойЛистМаршрут.Ссылка.ФизЛицо КАК ФизЛицо,
ПутевойЛистМаршрут.Ссылка.НормаРасхода КАК НормаРасхода,
СУММА(ПутевойЛистМаршрут.Расстояние) КАК Расстояние,
СУММА(ПутевойЛистМаршрут.Расход) КАК Расход
ПОМЕСТИТЬ вт_Маршрут
ИЗ
Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
ГДЕ
ПутевойЛистМаршрут.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПутевойЛистМаршрут.Ссылка.ФизЛицо = &ФизЛицо
И ПутевойЛистМаршрут.Ссылка.Проведен
СГРУППИРОВАТЬ ПО
ПутевойЛистМаршрут.Ссылка.Дата,
ПутевойЛистМаршрут.Ссылка,
ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство,
ПутевойЛистМаршрут.Ссылка.ФизЛицо,
ПутевойЛистМаршрут.Ссылка.НормаРасхода
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ЕСТЬNULL(вт_Маршрут.Дата, вт_Топливо.Дата) КАК Дата,
ЕСТЬNULL(вт_Маршрут.Ссылка, вт_Топливо.Ссылка) КАК Ссылка,
ЕСТЬNULL(вт_Маршрут.ТранспортноеСредство, вт_Топливо.ТранспортноеСредство) КАК ТранспортноеСредство,
ЕСТЬNULL(вт_Маршрут.ФизЛицо, вт_Топливо.ФизЛицо) КАК ФизЛицо,
ЕСТЬNULL(вт_Маршрут.НормаРасхода, вт_Топливо.НормаРасхода) КАК НормаРасхода,
вт_Маршрут.Расстояние КАК Расстояние,
вт_Маршрут.Расход КАК Расход,
вт_Топливо.Количество КАК Количество
ИЗ
вт_Топливо КАК вт_Топливо
ПОЛНОЕ СОЕДИНЕНИЕ вт_Маршрут КАК вт_Маршрут
ПО (вт_Топливо.Ссылка = вт_Маршрут.Ссылка)
УПОРЯДОЧИТЬ ПО
Дата
ПоказатьВторой запрос отрабатывает как надо.
Кстати в первом запросе не использовал для дат МЕЖДУ, т.к. тоже не отрабатывало, а надо было быстро не стал разбираться.
В итоге 2 вопроса:
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
Найденные решения
(1) из-за отбора в поле где, полное соединение превращается во внутреннее
и что бы этого не происходило, переделайте условия в такой вид:
PS а т.к. у вас есть неявное соединение с справочником (дважды!), то лучше сделайте его явным (единожды!):
и что бы этого не происходило, переделайте условия в такой вид:
ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Проведен,Истина)
И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Проведен,Истина)
И ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Дата,&ДатаНач) >= &ДатаНач
И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Дата,&ДатаНач) >= &ДатаНач
// и т.д.
PS а т.к. у вас есть неявное соединение с справочником (дважды!), то лучше сделайте его явным (единожды!):
ИЗ
Документ.ПутевойЛист как спр
левое соединенние
Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
ПО ПутевойЛистМаршрут.Ссылка = спр.Ссылка
левое СОЕДИНЕНИЕ
Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
ПО ПутевойЛистТопливо.Ссылка = спр.Ссылка
ГДЕ
спр.Проведен
И спр.Дата >= &ДатаНач
И спр.Дата <= &ДатаКон
и (ПутевойЛистМаршрут.Ссылка Есть НЕ NULL или ПутевойЛистТопливо.Ссылка Есть НЕ NULL)
Показать
(1)
Ответ на оба вопроса простой:
Полное соединение отрабатывает, но после соединения идет секция ГДЕ, в которой отсекаются не нужные записи.
Если данных в какой-то таблице нет, то ИмяТаблицы.Ссылка будет null. Соответственно по null все условия дадут Ложь и будут исключены из выборки.
В итоге 2 вопроса:
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
Ответ на оба вопроса простой:
Полное соединение отрабатывает, но после соединения идет секция ГДЕ, в которой отсекаются не нужные записи.
ГДЕ
ПутевойЛистМаршрут.Ссылка.Проведен
И ПутевойЛистТопливо.Ссылка.Проведен
И ПутевойЛистМаршрут.Ссылка.Дата >= &ДатаНач
И ПутевойЛистМаршрут.Ссылка.Дата <= &ДатаКон
И ПутевойЛистТопливо.Ссылка.Дата >= &ДатаНач
И ПутевойЛистТопливо.Ссылка.Дата <= &ДатаКон
ПутевойЛистМаршрут.Ссылка.Проведен
И ПутевойЛистТопливо.Ссылка.Проведен
И ПутевойЛистМаршрут.Ссылка.Дата >= &ДатаНач
И ПутевойЛистМаршрут.Ссылка.Дата <= &ДатаКон
И ПутевойЛистТопливо.Ссылка.Дата >= &ДатаНач
И ПутевойЛистТопливо.Ссылка.Дата <= &ДатаКон
Так вот выдает мне данный запрос не все нужные документы, а только те, в которых заполнена ТЧ Топливо.
Если данных в какой-то таблице нет, то ИмяТаблицы.Ссылка будет null. Соответственно по null все условия дадут Ложь и будут исключены из выборки.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Ответ на оба вопроса простой:
Полное соединение отрабатывает, но после соединения идет секция ГДЕ, в которой отсекаются не нужные записи.
Если данных в какой-то таблице нет, то ИмяТаблицы.Ссылка будет null. Соответственно по null все условия дадут Ложь и будут исключены из выборки.
В итоге 2 вопроса:
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
Ответ на оба вопроса простой:
Полное соединение отрабатывает, но после соединения идет секция ГДЕ, в которой отсекаются не нужные записи.
ГДЕ
ПутевойЛистМаршрут.Ссылка.Проведен
И ПутевойЛистТопливо.Ссылка.Проведен
И ПутевойЛистМаршрут.Ссылка.Дата >= &ДатаНач
И ПутевойЛистМаршрут.Ссылка.Дата <= &ДатаКон
И ПутевойЛистТопливо.Ссылка.Дата >= &ДатаНач
И ПутевойЛистТопливо.Ссылка.Дата <= &ДатаКон
ПутевойЛистМаршрут.Ссылка.Проведен
И ПутевойЛистТопливо.Ссылка.Проведен
И ПутевойЛистМаршрут.Ссылка.Дата >= &ДатаНач
И ПутевойЛистМаршрут.Ссылка.Дата <= &ДатаКон
И ПутевойЛистТопливо.Ссылка.Дата >= &ДатаНач
И ПутевойЛистТопливо.Ссылка.Дата <= &ДатаКон
Так вот выдает мне данный запрос не все нужные документы, а только те, в которых заполнена ТЧ Топливо.
Если данных в какой-то таблице нет, то ИмяТаблицы.Ссылка будет null. Соответственно по null все условия дадут Ложь и будут исключены из выборки.
(1) из-за отбора в поле где, полное соединение превращается во внутреннее
и что бы этого не происходило, переделайте условия в такой вид:
PS а т.к. у вас есть неявное соединение с справочником (дважды!), то лучше сделайте его явным (единожды!):
и что бы этого не происходило, переделайте условия в такой вид:
ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Проведен,Истина)
И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Проведен,Истина)
И ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Дата,&ДатаНач) >= &ДатаНач
И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Дата,&ДатаНач) >= &ДатаНач
// и т.д.
PS а т.к. у вас есть неявное соединение с справочником (дважды!), то лучше сделайте его явным (единожды!):
ИЗ
Документ.ПутевойЛист как спр
левое соединенние
Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
ПО ПутевойЛистМаршрут.Ссылка = спр.Ссылка
левое СОЕДИНЕНИЕ
Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
ПО ПутевойЛистТопливо.Ссылка = спр.Ссылка
ГДЕ
спр.Проведен
И спр.Дата >= &ДатаНач
И спр.Дата <= &ДатаКон
и (ПутевойЛистМаршрут.Ссылка Есть НЕ NULL или ПутевойЛистТопливо.Ссылка Есть НЕ NULL)
Показать
(13) Исправил. Вдруг кому надо. Результирующий запрос, который отрабатывает как надо:
ВЫБРАТЬ
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.Дата, ПутевойЛистМаршрут.Ссылка.Дата) КАК Дата,
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка, ПутевойЛистМаршрут.Ссылка) КАК ПутевойЛист,
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство) КАК ТранспортноеСредство,
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ФизЛицо, ПутевойЛистМаршрут.Ссылка.ФизЛицо) КАК Сотрудник,
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство.НормаРасхода, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство.НормаРасхода) КАК НормаРасхода,
СУММА(ПутевойЛистТопливо.Количество) КАК Количество,
СУММА(ПутевойЛистМаршрут.Расстояние) КАК Расстояние,
СУММА(ПутевойЛистМаршрут.Расход) КАК Расход
ИЗ
Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
ПО ПутевойЛистМаршрут.Ссылка = ПутевойЛистТопливо.Ссылка
ГДЕ
ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Проведен,Истина)
И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Проведен, Истина)
И ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Дата,&ДатаНач) >= &ДатаНач
И ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Дата,&ДатаКон) <= &ДатаКон
И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Дата,&ДатаНач) >= &ДатаНач
И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Дата,&ДатаКон) <= &ДатаКон
СГРУППИРОВАТЬ ПО
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.Дата, ПутевойЛистМаршрут.Ссылка.Дата),
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка, ПутевойЛистМаршрут.Ссылка),
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство),
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ФизЛицо, ПутевойЛистМаршрут.Ссылка.ФизЛицо),
ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство.НормаРасхода, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство.НормаРасхода)
УПОРЯДОЧИТЬ ПО
Дата
Показать
(17) и всё же...
слишком много ЕстьNULL у вас, я бы оставил только один:
слишком много ЕстьNULL у вас, я бы оставил только один:
ВЫБРАТЬ
ПутевойЛист.Дата,
ПутевойЛист.Ссылка,
ПутевойЛист.ТранспортноеСредство,
ПутевойЛист.ФизЛицо КАК Сотрудник,
ПутевойЛист.ТранспортноеСредство.НормаРасхода КАК НормаРасхода,
СУММА(ПутевойЛистТопливо.Количество) КАК Количество,
СУММА(ПутевойЛистМаршрут.Расстояние) КАК Расстояние,
СУММА(ПутевойЛистМаршрут.Расход) КАК Расход
ИЗ
Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
ПО ПутевойЛистМаршрут.Ссылка = ПутевойЛистТопливо.Ссылка
левое СОЕДИНЕНИЕ Документ.ПутевойЛист КАК ПутевойЛист
ПО ЕстьNULL(ПутевойЛистМаршрут.Ссылка, ПутевойЛистТопливо.Ссылка)=ПутевойЛист.Ссылка
ГДЕ
ПутевойЛист.Проведен
И ПутевойЛист.Дата >= &ДатаНач
И ПутевойЛист.Дата <= &ДатаКон
СГРУППИРОВАТЬ ПО
ПутевойЛист.Дата,
ПутевойЛист.Ссылка,
ПутевойЛист.ТранспортноеСредство,
ПутевойЛист.ФизЛицо
УПОРЯДОЧИТЬ ПО
ПутевойЛист.Дата
Показать
(18)Почему у вас такое?
Почему не так?
Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
ПО ПутевойЛистМаршрут.Ссылка = ПутевойЛистТопливо.Ссылка
левое СОЕДИНЕНИЕ Документ.ПутевойЛист КАК ПутевойЛист
ПО ЕстьNULL(ПутевойЛистМаршрут.Ссылка, ПутевойЛистТопливо.Ссылка)=ПутевойЛист.Ссылка
Почему не так?
Документ.ПутевойЛист КАК ПутевойЛист
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
ПО ПутевойЛист.Ссылка = ПутевойЛистМаршрут.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
ПО ПутевойЛист.Ссылка = ПутевойЛистТопливо.Ссылка
(23)
двойное соединение = одинарное соединение, где первый запрос "вложенный" (ну или, в вашем случае, временная таблица)
перефразирую:
если у вас в голове есть результат первого соединения, то вы всегда можете присоединить к нему ещё одно и т.д.
Для меня тяжелочитаемы двойные соединения...
двойное соединение = одинарное соединение, где первый запрос "вложенный" (ну или, в вашем случае, временная таблица)
перефразирую:
если у вас в голове есть результат первого соединения, то вы всегда можете присоединить к нему ещё одно и т.д.
(7)
как-то так, извините за неровный почерк
в выходном запросе пропустить астерикс через конструктор и убрать два лишних поля ссылок
Выбрать Ссылка, Дата, ТранспортноеСредство, ФизЛицо КАК Сотрудник,
ТранспортноеСредство.НормаРасхода КАК НормаРасхода
поместить Доки из Документ.ПутевойЛист ГДЕ
Проведен
И (Дата Между &ДатаНач и &ДатаКон)
;
Выбрать СУММА(Количество) КАК Количество, Ссылка поместить топливо
из Документ.ПутевойЛист.Топливо
где Ссылка.Проведен
И (Ссылка.Дата Между &ДатаНач и &ДатаКон)
СГРУППИРОВАТЬ ПО
Ссылка
;
Выбрать СУММА(Расстояние) КАК Расстояние, СУММА(Расход) КАК Расход,
Ссылка поместить маршрут
из Документ.ПутевойЛист.ПутевойЛистМаршрут
где Ссылка.Проведен
И (Ссылка.Дата Между &ДатаНач и &ДатаКон)
СГРУППИРОВАТЬ ПО
Ссылка
;
выбрать * из Доки левое соединение Топливо КАК топливо по Доки.Ссылка = Топливо.Ссылка
левое соединение маршрут как Маршрут по Доки.Ссылка = маршрут.Ссылка
Показатькак-то так, извините за неровный почерк
в выходном запросе пропустить астерикс через конструктор и убрать два лишних поля ссылок
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот