Уважаемы форумчане. Помогите решить вопрос.
Платформа: 1С:Предприятие 8.3 (8.3.18.1334)
Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.102.11)
Решил написать простенький отчет по документу Путевой лист (не кидаться в меня сразу тухлыми помидорами, знаю что плохо делать запрос к документам, но тут надо было).
Делаю запрос к двум ТЧ в этом документе и связываю ПОЛНЫМ СОЕДИНЕНИЕМ.

```1c
    ВЫБРАТЬ
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.Дата, ПутевойЛистМаршрут.Ссылка.Дата) КАК Дата,
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка, ПутевойЛистМаршрут.Ссылка) КАК ПутевойЛист,
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство) КАК ТранспортноеСредство,
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ФизЛицо, ПутевойЛистМаршрут.Ссылка.ФизЛицо) КАК Сотрудник,
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство.НормаРасхода, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство.НормаРасхода) КАК НормаРасхода,
    СУММА(ПутевойЛистТопливо.Количество) КАК Количество,
    СУММА(ПутевойЛистМаршрут.Расстояние) КАК Расстояние,
    СУММА(ПутевойЛистМаршрут.Расход) КАК Расход
    ИЗ
    Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
    ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
    ПО ПутевойЛистМаршрут.Ссылка = ПутевойЛистТопливо.Ссылка
    ГДЕ
    ПутевойЛистМаршрут.Ссылка.Проведен
    И ПутевойЛистТопливо.Ссылка.Проведен
    И ПутевойЛистМаршрут.Ссылка.Дата >= &ДатаНач
    И ПутевойЛистМаршрут.Ссылка.Дата <= &ДатаКон
    И ПутевойЛистТопливо.Ссылка.Дата >= &ДатаНач
    И ПутевойЛистТопливо.Ссылка.Дата <= &ДатаКон

    СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.Дата, ПутевойЛистМаршрут.Ссылка.Дата),
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка, ПутевойЛистМаршрут.Ссылка),
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство),
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ФизЛицо, ПутевойЛистМаршрут.Ссылка.ФизЛицо),
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство.НормаРасхода, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство.НормаРасхода)

    УПОРЯДОЧИТЬ ПО
    Дата
```

Так вот выдает мне данный запрос не все нужные документы, а только те, в которых заполнена ТЧ Топливо. Если же ТЧ топливо не заполнено, а ТЧ Маршрут имеет значения - такой документ в выборку не попадает.

Переписал запрос через временные таблицы. Получилось вот так:

```1c
    ВЫБРАТЬ
    ПутевойЛистТопливо.Ссылка.Дата КАК Дата,
    ПутевойЛистТопливо.Ссылка КАК Ссылка,
    ПутевойЛистТопливо.Ссылка.ТранспортноеСредство КАК ТранспортноеСредство,
    ПутевойЛистТопливо.Ссылка.ФизЛицо КАК ФизЛицо,
    ПутевойЛистТопливо.Ссылка.НормаРасхода КАК НормаРасхода,
    СУММА(ПутевойЛистТопливо.Количество) КАК Количество
    ПОМЕСТИТЬ вт_Топливо
    ИЗ
    Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
    ГДЕ
    ПутевойЛистТопливо.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ПутевойЛистТопливо.Ссылка.ФизЛицо = &ФизЛицо
    И ПутевойЛистТопливо.Ссылка.Проведен

    СГРУППИРОВАТЬ ПО
    ПутевойЛистТопливо.Ссылка.Дата,
    ПутевойЛистТопливо.Ссылка,
    ПутевойЛистТопливо.Ссылка.ТранспортноеСредство,
    ПутевойЛистТопливо.Ссылка.ФизЛицо,
    ПутевойЛистТопливо.Ссылка.НормаРасхода
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ПутевойЛистМаршрут.Ссылка.Дата КАК Дата,
    ПутевойЛистМаршрут.Ссылка КАК Ссылка,
    ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство КАК ТранспортноеСредство,
    ПутевойЛистМаршрут.Ссылка.ФизЛицо КАК ФизЛицо,
    ПутевойЛистМаршрут.Ссылка.НормаРасхода КАК НормаРасхода,
    СУММА(ПутевойЛистМаршрут.Расстояние) КАК Расстояние,
    СУММА(ПутевойЛистМаршрут.Расход) КАК Расход
    ПОМЕСТИТЬ вт_Маршрут
    ИЗ
    Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
    ГДЕ
    ПутевойЛистМаршрут.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ПутевойЛистМаршрут.Ссылка.ФизЛицо = &ФизЛицо
    И ПутевойЛистМаршрут.Ссылка.Проведен

    СГРУППИРОВАТЬ ПО
    ПутевойЛистМаршрут.Ссылка.Дата,
    ПутевойЛистМаршрут.Ссылка,
    ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство,
    ПутевойЛистМаршрут.Ссылка.ФизЛицо,
    ПутевойЛистМаршрут.Ссылка.НормаРасхода
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ЕСТЬNULL(вт_Маршрут.Дата, вт_Топливо.Дата) КАК Дата,
    ЕСТЬNULL(вт_Маршрут.Ссылка, вт_Топливо.Ссылка) КАК Ссылка,
    ЕСТЬNULL(вт_Маршрут.ТранспортноеСредство, вт_Топливо.ТранспортноеСредство) КАК ТранспортноеСредство,
    ЕСТЬNULL(вт_Маршрут.ФизЛицо, вт_Топливо.ФизЛицо) КАК ФизЛицо,
    ЕСТЬNULL(вт_Маршрут.НормаРасхода, вт_Топливо.НормаРасхода) КАК НормаРасхода,
    вт_Маршрут.Расстояние КАК Расстояние,
    вт_Маршрут.Расход КАК Расход,
    вт_Топливо.Количество КАК Количество
    ИЗ
    вт_Топливо КАК вт_Топливо
    ПОЛНОЕ СОЕДИНЕНИЕ вт_Маршрут КАК вт_Маршрут
    ПО (вт_Топливо.Ссылка = вт_Маршрут.Ссылка)

    УПОРЯДОЧИТЬ ПО
    Дата
```

Второй запрос отрабатывает как надо.
Кстати в первом запросе не использовал для дат МЕЖДУ, т.к. тоже не отрабатывало, а надо было быстро не стал разбираться.

В итоге 2 вопроса:
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
---
из-за отбора в поле где, полное соединение превращается во внутреннее
и что бы этого не происходило, переделайте условия в такой вид:

```1c
    ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Проведен,Истина)
    И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Проведен,Истина)
    И ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Дата,&ДатаНач) >= &ДатаНач
    И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Дата,&ДатаНач) >= &ДатаНач
    // и т.д.
```

PS а т.к. у вас есть неявное соединение с справочником (дважды!), то лучше сделайте его явным (единожды!):
```1c
    ИЗ
    Документ.ПутевойЛист как спр
    левое соединенние
    Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
    ПО ПутевойЛистМаршрут.Ссылка = спр.Ссылка
    левое СОЕДИНЕНИЕ
    Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
    ПО ПутевойЛистТопливо.Ссылка = спр.Ссылка
    ГДЕ
    спр.Проведен
    И спр.Дата >= &ДатаНач
    И спр.Дата <= &ДатаКон
    и (ПутевойЛистМаршрут.Ссылка Есть НЕ NULL или ПутевойЛистТопливо.Ссылка Есть НЕ NULL)
```
---
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
Потому что дальше в ГДЕ у вас отбор:

```1c
    ПутевойЛистМаршрут.Ссылка.Проведен
    И ПутевойЛистТопливо.Ссылка.Проведен...
```

Если не будет хотя бы одной строки в обеих таблицах, данные не попадут.
---
В итоге 2 вопроса:
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
Ответ на оба вопроса простой:
Полное соединение отрабатывает, но после соединения идет секция ГДЕ, в которой отсекаются не нужные записи.
ГДЕ
    ПутевойЛистМаршрут.Ссылка.Проведен
    И ПутевойЛистТопливо.Ссылка.Проведен
    И ПутевойЛистМаршрут.Ссылка.Дата >= &ДатаНач
    И ПутевойЛистМаршрут.Ссылка.Дата <= &ДатаКон
    И ПутевойЛистТопливо.Ссылка.Дата >= &ДатаНач
    И ПутевойЛистТопливо.Ссылка.Дата <= &ДатаКон
Так вот выдает мне данный запрос не все нужные документы, а только те, в которых заполнена ТЧ Топливо.
Если данных в какой-то таблице нет, то ИмяТаблицы.Ссылка будет null. Соответственно по null все условия дадут Ложь и будут исключены из выборки.
---
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
Потому что дальше в ГДЕ у вас отбор:

```1c
    ПутевойЛистМаршрут.Ссылка.Проведен
    И ПутевойЛистТопливо.Ссылка.Проведен...
```

Если не будет хотя бы одной строки в обеих таблицах, данные не попадут.
---
2. Почему в первом запросе не работает оператор МЕЖДУ?
В чем выражается, что он не работает?
---
Очень просто - не отсекает ненужных дат документа. Вываливает либо все доки, либо вообще не выдает ни одного.
---
Приложите текст запроса, приложите результат, тогда можно будет сказать, что не верно.
---
начнем с того, зачем вообще использовать полное соединение?
---
Поддержу. Сначала взять данные шапки, и к ним присоединить данные ТЧ.
---
Этот запрос для СКД. Нужны поля из обеих ТЧ. Потому и соединяю их. Если выбрать в качестве источника документ (а не две ТЧ), то он ссыпает все в одно поле.
---
что значит "ссыпает все в одно поле"?
---
В итоге 2 вопроса:
1. Почему в первом запросе не работает ПОЛНОЕ СОЕДИНЕНИЕ?
2. Почему в первом запросе не работает оператор МЕЖДУ?
Ответ на оба вопроса простой:
Полное соединение отрабатывает, но после соединения идет секция ГДЕ, в которой отсекаются не нужные записи.
ГДЕ
    ПутевойЛистМаршрут.Ссылка.Проведен
    И ПутевойЛистТопливо.Ссылка.Проведен
    И ПутевойЛистМаршрут.Ссылка.Дата >= &ДатаНач
    И ПутевойЛистМаршрут.Ссылка.Дата <= &ДатаКон
    И ПутевойЛистТопливо.Ссылка.Дата >= &ДатаНач
    И ПутевойЛистТопливо.Ссылка.Дата <= &ДатаКон
Так вот выдает мне данный запрос не все нужные документы, а только те, в которых заполнена ТЧ Топливо.
Если данных в какой-то таблице нет, то ИмяТаблицы.Ссылка будет null. Соответственно по null все условия дадут Ложь и будут исключены из выборки.
---
из-за отбора в поле где, полное соединение превращается во внутреннее
и что бы этого не происходило, переделайте условия в такой вид:

```1c
    ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Проведен,Истина)
    И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Проведен,Истина)
    И ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Дата,&ДатаНач) >= &ДатаНач
    И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Дата,&ДатаНач) >= &ДатаНач
    // и т.д.
```

PS а т.к. у вас есть неявное соединение с справочником (дважды!), то лучше сделайте его явным (единожды!):
```1c
    ИЗ
    Документ.ПутевойЛист как спр
    левое соединенние
    Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
    ПО ПутевойЛистМаршрут.Ссылка = спр.Ссылка
    левое СОЕДИНЕНИЕ
    Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
    ПО ПутевойЛистТопливо.Ссылка = спр.Ссылка
    ГДЕ
    спр.Проведен
    И спр.Дата >= &ДатаНач
    И спр.Дата <= &ДатаКон
    и (ПутевойЛистМаршрут.Ссылка Есть НЕ NULL или ПутевойЛистТопливо.Ссылка Есть НЕ NULL)
```
---
Исправил. Вдруг кому надо. Результирующий запрос, который отрабатывает как надо:

```1c
    ВЫБРАТЬ
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.Дата, ПутевойЛистМаршрут.Ссылка.Дата) КАК Дата,
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка, ПутевойЛистМаршрут.Ссылка) КАК ПутевойЛист,
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство) КАК ТранспортноеСредство,
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ФизЛицо, ПутевойЛистМаршрут.Ссылка.ФизЛицо) КАК Сотрудник,
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство.НормаРасхода, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство.НормаРасхода) КАК НормаРасхода,
    СУММА(ПутевойЛистТопливо.Количество) КАК Количество,
    СУММА(ПутевойЛистМаршрут.Расстояние) КАК Расстояние,
    СУММА(ПутевойЛистМаршрут.Расход) КАК Расход
    ИЗ
    Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
    ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
    ПО ПутевойЛистМаршрут.Ссылка = ПутевойЛистТопливо.Ссылка
    ГДЕ
    ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Проведен,Истина)
    И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Проведен, Истина)
    И ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Дата,&ДатаНач) >= &ДатаНач
    И ЕстьNULL(ПутевойЛистМаршрут.Ссылка.Дата,&ДатаКон) <= &ДатаКон
    И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Дата,&ДатаНач) >= &ДатаНач
    И ЕстьNULL(ПутевойЛистТопливо.Ссылка.Дата,&ДатаКон) <= &ДатаКон

    СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.Дата, ПутевойЛистМаршрут.Ссылка.Дата),
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка, ПутевойЛистМаршрут.Ссылка),
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство),
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ФизЛицо, ПутевойЛистМаршрут.Ссылка.ФизЛицо),
    ЕСТЬNULL(ПутевойЛистТопливо.Ссылка.ТранспортноеСредство.НормаРасхода, ПутевойЛистМаршрут.Ссылка.ТранспортноеСредство.НормаРасхода)

    УПОРЯДОЧИТЬ ПО
    Дата
```
---
и всё же...
слишком много ЕстьNULL у вас, я бы оставил только один:

```1c
    ВЫБРАТЬ
    ПутевойЛист.Дата,
    ПутевойЛист.Ссылка,
    ПутевойЛист.ТранспортноеСредство,
    ПутевойЛист.ФизЛицо КАК Сотрудник,
    ПутевойЛист.ТранспортноеСредство.НормаРасхода КАК НормаРасхода,
    СУММА(ПутевойЛистТопливо.Количество) КАК Количество,
    СУММА(ПутевойЛистМаршрут.Расстояние) КАК Расстояние,
    СУММА(ПутевойЛистМаршрут.Расход) КАК Расход
    ИЗ
    Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
    ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
    ПО ПутевойЛистМаршрут.Ссылка = ПутевойЛистТопливо.Ссылка
    левое СОЕДИНЕНИЕ Документ.ПутевойЛист КАК ПутевойЛист
    ПО ЕстьNULL(ПутевойЛистМаршрут.Ссылка, ПутевойЛистТопливо.Ссылка)=ПутевойЛист.Ссылка
    ГДЕ
    ПутевойЛист.Проведен
    И ПутевойЛист.Дата >= &ДатаНач
    И ПутевойЛист.Дата <= &ДатаКон

    СГРУППИРОВАТЬ ПО
    ПутевойЛист.Дата,
    ПутевойЛист.Ссылка,
    ПутевойЛист.ТранспортноеСредство,
    ПутевойЛист.ФизЛицо

    УПОРЯДОЧИТЬ ПО
    ПутевойЛист.Дата
```
---
Почему у вас такое?

```1c
    Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
    ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
    ПО ПутевойЛистМаршрут.Ссылка = ПутевойЛистТопливо.Ссылка
    левое СОЕДИНЕНИЕ Документ.ПутевойЛист КАК ПутевойЛист
    ПО ЕстьNULL(ПутевойЛистМаршрут.Ссылка, ПутевойЛистТопливо.Ссылка)=ПутевойЛист.Ссылка
```

Почему не так?

```1c
    Документ.ПутевойЛист КАК ПутевойЛист
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Маршрут КАК ПутевойЛистМаршрут
    ПО ПутевойЛист.Ссылка = ПутевойЛистМаршрут.Ссылка
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист.Топливо КАК ПутевойЛистТопливо
    ПО ПутевойЛист.Ссылка = ПутевойЛистТопливо.Ссылка
```
---
потому что такой вариант я предлагал выше...

но он "не зашел" автору топика....
---
ТС не ищет легких путей))
---
Это точно.))))
---
А вот этого я не знаю. Для меня тяжелочитаемы двойные соединения...
---
Для меня тяжелочитаемы двойные соединения...
двойное соединение = одинарное соединение, где первый запрос "вложенный" (ну или, в вашем случае, временная таблица)

перефразирую:

если у вас в голове есть результат первого соединения, то вы всегда можете присоединить к нему ещё одно и т.д.
---
это массовый гипноз - что подокументарные отчеты - это плохо
пусть сначала начнут писать что-то вразумительно с регистрами, потом будут щОки надувать, правильно-неправильно
---
кто видел в реальных базах РАУЗ, тот над документаркой не смеется
---
В условиях уберите ТЧ, если они требуются, то перенесите условия в соединение
---
а так, да
запросец весьма смишон
---
```1c
    Выбрать Ссылка, Дата, ТранспортноеСредство, ФизЛицо КАК Сотрудник,
    ТранспортноеСредство.НормаРасхода КАК НормаРасхода
    поместить Доки из Документ.ПутевойЛист ГДЕ
    Проведен
    И (Дата Между &ДатаНач и &ДатаКон)
    ;
    Выбрать СУММА(Количество) КАК Количество, Ссылка поместить топливо
    из Документ.ПутевойЛист.Топливо
    где Ссылка.Проведен
    И (Ссылка.Дата Между &ДатаНач и &ДатаКон)
    СГРУППИРОВАТЬ ПО
    Ссылка

    ;
    Выбрать СУММА(Расстояние) КАК Расстояние, СУММА(Расход) КАК Расход,
    Ссылка поместить маршрут
    из Документ.ПутевойЛист.ПутевойЛистМаршрут
    где Ссылка.Проведен
    И (Ссылка.Дата Между &ДатаНач и &ДатаКон)
    СГРУППИРОВАТЬ ПО
    Ссылка

    ;
    выбрать * из Доки левое соединение Топливо КАК топливо по Доки.Ссылка = Топливо.Ссылка
    левое соединение маршрут как Маршрут по Доки.Ссылка = маршрут.Ссылка
```

как-то так, извините за неровный почерк
в выходном запросе пропустить астерикс через конструктор и убрать два лишних поля ссылок
---
Я бы еще посмотрел в сторону объединения, так как фактически это оно и есть