Здравствуйте! Помогите пожалуйста разобраться.
Вот запрос:

```1c
    ВЫБРАТЬ
    ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
    ПОМЕСТИТЬ СуммаДоговораВсего
    ИЗ
    РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
    ГДЕ
    ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
    СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов,
    СуммаДоговораВсего.СуммаДоговора
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты,
    СуммаДоговораВсего КАК СуммаДоговораВсего
    ГДЕ
    ХозрасчетныйОстаткиИОбороты.Субконто2 = &Субконто2
    И ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

    СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстаткиИОбороты.Субконто2,
    СуммаДоговораВсего.СуммаДоговора
```

Но иной раз авансов нет. И тогда весь запрос не отрабатывает, по всем полям неопределенно, а данные из него нужны дальше в любом случае. Как проверить поле ХозрасчетныйОстаткиИОбороты.СуммаОборотКт на неопределенно и дать ему значение 0.
пробовал уже по разному и ЕСТЬ NULL и неопределенно, выдает ошибку. Спасибо.
---
Можно и без..

```1c
    |ВЫБРАТЬ
    | &ДоговорКонтрагента КАК ДоговорКонтрагента ,
    | ЕСТЬNULL(Хозрасчетный.СуммаОборотКт, 0) КАК СуммаАвансов,
    | ЕСТЬNULL(Заказы.СуммаВзаиморасчетовПриход, 0) КАК СуммаДоговора
    |ИЗ
    | РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ДоговорКонтрагента = &ДоговорКонтрагента ) КАК Заказы,
    | (ВЫБРАТЬ СУММА(т.СуммаОборотКт) КАК СуммаОборотКт ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов), Субконто1 = &ДоговорКонтрагента , , ) КАК т
    | ГДЕ
    | т.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее) КАК Хозрасчетный
```

В любом случае будет работать лучше чем в (0) и быстрее
---
Разве таблицы связать по полю "Договор" не нужно? Без связи это полное соединение и бред получается, имхо
---
Во-первых, у Вас неверно написан запрос. Таблицы не соединены друг с другом.
---
первые 3 запроса бесплатно?)
---
ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт, 0)
---
пробовал, все равно все поля возвращают значение неопределенно. причем по первому запросу значение всегда есть.
---
у вас результат пустой, вам программа и возвращает пустоту. чего вы удивляетесь? в чем проблема объявить переменную и присвоить ей значение в случае если оно есть?

```1c
    Сумма = 0;

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Сумма = ВыборкаДетальныеЗаписи.Сумма;
    КонецЕсли;
```
---
ВыборкаДетальныеЗаписи.Следующий() весь запрос в этой случае не работает, а не только поле сумма
---
Судя по полям:

```1c
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
    СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов,
    СуммаДоговораВсего.СуммаДоговора
```

Вам нужен договор, Сумма авансов по нему и Сумма по заказам за ВСЕ время., т.е. 1 строка, Договор/Сумма1/Сумма2. Верно?
---
да верно, сумма по договору за все время точнее.
---
подождите, я Вам запрос перепишу полностью. У Вас там просто каша.
---
Тогда лучше сделать так:

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

```1c
    ВЫБРАТЬ
    ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
    ПОМЕСТИТЬ СуммаДоговораВсего
    ИЗ
    РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
    ГДЕ
    ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
    СУММА(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК СуммаАвансов,
    СУММА(СуммаДоговораВсего.СуммаДоговора) КАК СуммаДоговора
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ СуммаДоговораВсего КАК СуммаДоговораВсего
    ПО ХозрасчетныйОстаткиИОбороты.Субконто2 = СуммаДоговораВсего.ДоговорКонтрагента
    ГДЕ
    ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

    СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстаткиИОбороты.Субконто2
```
---
ЕстьNULL забыл добавить )
---
Не забыл. Какой IsNull при внутреннем соединении? Внутреннее соединение и так отрежет все несовпадающие записи.
---
ага, а я чет решил что ты левое сделал, оно вроде как более подходящее по логике первого поста
---
1) Таблицы соединяем внутренним соединением. Тогда и условие по договору на вторую таблицу накладывать не надо: оно и так наложится неявно (просто из первой таблицы придут только записи с нужным договором).
2) Группировка только по группировочному полю, остальные поля - суммировать.
3) У меня этого нет, но Вы можете в первом запросе проиндексировать ещё по полю ДоговорКонтрагента - работать будет шустрее.

Что получится на Ваших данных?
---
спасибо за старания. но пусто снова в запросе. даже если писать естьnull
---
а вот это как раз из-за внутреннего соединения, имхо. Сделай левое
---
Внутреннее соединение в моём запросе замените на левое.
---
тогда не работает условие по договору из первого запроса, добавил его во второй. и результат также, пусто
---
Уберите временно таблицу СуммаДоговораВсего. Отладьте данные во втором запросе.
Верните таблицу СуммаДоговораВсего. Настройте соединение таблиц по полю ДоговорКонтрагента.
Проверьте данные. Если появляются Null, вставьте внутрь сумм ЕСТЬNULL(***,0).

Трудно Вам дальше помогать (делать всё за Вас ;-) ), не имея источника для проверки.
---
Ты там правое соединение запулил. Это ж к авансам обороты цепляет, а надо наоборот
---
Покажи текст получившегося запроса-то. И отбор по договору запихни сразу в параметры виртуальных таблиц
P/S/ Смени правое соединение на левое
---
```1c
    ВЫБРАТЬ
    ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаДоговора
    ПОМЕСТИТЬ СуммаДоговораВсего
    ИЗ
    РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
    ГДЕ
    ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента
    ;

    ////////////////////////////////////////////////////////////­­////////////////////
    ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
    СУММА(ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаОборотКт,0)) КАК СуммаАвансов,
    СУММА(ЕСТЬNULL(СуммаДоговораВсего.СуммаДоговора,0)) КАК СуммаДоговора
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, , Регистратор, , Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), , ) КАК ХозрасчетныйОстаткиИОбороты
    ПРАВОЕ СОЕДИНЕНИЕ СуммаДоговораВсего КАК СуммаДоговораВсего
    ПО ХозрасчетныйОстаткиИОбороты.Субконто2 = СуммаДоговораВсего.ДоговорКонтрагента
    ГДЕ
    ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее

    СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстаткиИОбороты.Субконто2
```
---
зачем по ИСТИНА-то соединять? Оно и так соединится. А вообще, похоже именно что надо покажет и ничего лишнего не тянет. Только больно уж узко специализированно получается, потом фиг этот запрос расширишь
---
Можно и без..

```1c
    |ВЫБРАТЬ
    | &ДоговорКонтрагента КАК ДоговорКонтрагента ,
    | ЕСТЬNULL(Хозрасчетный.СуммаОборотКт, 0) КАК СуммаАвансов,
    | ЕСТЬNULL(Заказы.СуммаВзаиморасчетовПриход, 0) КАК СуммаДоговора
    |ИЗ
    | РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ДоговорКонтрагента = &ДоговорКонтрагента ) КАК Заказы,
    | (ВЫБРАТЬ СУММА(т.СуммаОборотКт) КАК СуммаОборотКт ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ДоговорыКонтрагентов), Субконто1 = &ДоговорКонтрагента , , ) КАК т
    | ГДЕ
    | т.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее) КАК Хозрасчетный
```

В любом случае будет работать лучше чем в (0) и быстрее
---
Вот это - хорошо! Особенно хорошо, что обе задействованные виртуальные таблицы фильтруются сразу при получении.
Пожалуй, лучший вариант.
Хотя, вариации на тему (21) будут универсальнее, тут Reset Atreides прав.
---
Есть задача - есть решение)
Это не типовой код с запросом для 5 различных вариантов отчетов или еще что на 150 строк.. Это решение под конкретную задачу. Должно быть просто и оптимально, без излишеств. Что тут может модернизироваться? Добавить отбор за период, сделать по нескольким договорам(Чуть изменить отбор и связь добавить).. не очень понимаю для чего тут универсальность для дальнейших доработок, все итак легко и понятно.

Имхо. Без обид, но на (0) и (21) с такими отборами смотреть больно. =)
---
Без обид. Я всегда стараюсь быть объективным. Потому и написал, что решение хорошее, но не масштабируемое.
А завтра понадобится всю эту красоту делать не по одному договору, а по списку, и сгруппировать долги по определённому признаку (ни разу не сталкивались с таким - "для ВОТ ЭТОЙ группы контрагентов считаем чётко, а по остальным - без учёта договоров"? Реально, такая задача была), и...?
А выбрать данные в две ВТ и потом их соединить по любому признаку - всегда проще и потом можно расширить, хоть по признаку длины ног секретарши директора!
---
Согласен, но а что, если надо будет добавить еще сумму приходов (если поставщик и покупатель одно лицо)?
Или разбить все это дело по реквизитам из регистратора определенного типа со сложными группировками по итогам?)

Я это к тому, что когда понадобиться - тогда и надо делать(под конкретные определенные потребности). Обычно такие доработки как минимум требуют переписать часть кода, а сложные - и вовсе иногда всю логику переделать.. Универсальность - не панацея)
---
спасибо за помощь!
Спасибо всем кто принимал участие!