Коллеги, приветствую! Помогите горю моему)

Задача: в УТ 11.4..6.* к отчету "Валовая прибыль" (по поставщикам) приклеить колонку "Сумма закупки у поставщика", чтобы клиент мог видеть товары, которые куплены, но плохо продаются.

Решение мое: приклеиваем полным соединением колонку "Сумма закупки" из РН Закупки.

Проблема: если был куплен товар, но продаж по нему не было, то в отчет он не попадет. Хотя я же не левое соединение использую, а полное.

Наверное, мне нужно в самом макете СКД что-то настроить?

Для проверки, написал такой запрос:

```1c
    ВЫБРАТЬ
    ЕстьNull(ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура,Значение(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура,
    ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК Выручка,
    ЗакупкиОбороты.СуммаОборот КАК ЗакупкаСуммаОборот
    ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Н, &К, , ) КАК ВыручкаИСебестоимостьПродажОбороты
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки.Обороты(&Н, &К, , ) КАК ЗакупкиОбороты
    ПО (ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура = ЗакупкиОбороты.АналитикаУчетаНоменклатуры.Номенклатура)
```

Получаю результат на рисунке 1.
А мой отчет показывает результат на рисунке 2.

Ниже я упростил запрос отчета для восприятия

```1c
    ВЫБРАТЬ
    Таблица.Регистратор КАК Регистратор,
    ЕстьNull(Таблица.Номенклатура, Значение(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура,
    Таблица.Организация КАК Организация,
    Таблица.Продавец КАК Продавец,
    Таблица.Партнер КАК Партнер,
    //
    // ...
    //
    ЕСТЬNULL(ЗакупкиОбороты.СуммаОборот, 0) КАК СуммаЗакупки
    ИЗ
    (
    АналитикаНоменклатуры.Номенклатура КАК Номенклатура,
    АналитикаНоменклатуры.Характеристика КАК Характеристика,
    АналитикаНоменклатуры.Серия КАК Серия,
    АналитикаПоПартнерам.Организация КАК Организация,
    АналитикаПоПартнерам.Организация КАК Продавец,
    АналитикаПоПартнерам.Партнер КАК Партнер,
    //...
    Продажи.СуммаРучнойСкидкиОборот КАК СуммаРучнойСкидкиОборот,
    Продажи.СуммаАвтоматическойСкидкиОборот КАК СуммаАвтоматическойСкидкиОборот,
    Продажи.ХозяйственнаяОперация КАК ХозяйственнаяОперация

    ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты({(&НачалоПериода)}, {(&ОкончаниеПериода)},
    // ...
    ) КАК Продажи
    {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК АналитикаНоменклатуры
    ПО Продажи.АналитикаУчетаНоменклатуры = АналитикаНоменклатуры.КлючАналитики}
    {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаПоПартнерам
    ПО Продажи.АналитикаУчетаПоПартнерам = АналитикаПоПартнерам.КлючАналитики}
    {ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасчетСебестоимостиТоваров.Организации КАК РасчетСебестоимости
    ПО (НАЧАЛОПЕРИОДА(Продажи.ПериодМесяц, МЕСЯЦ) = НАЧАЛОПЕРИОДА(РасчетСебестоимости.Ссылка.Дата, МЕСЯЦ))
    И (АналитикаПоПартнерам.Организация = РасчетСебестоимости.Организация)
    И (РасчетСебестоимости.Ссылка.Проведен)}
    //...

    ) КАК Таблица
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки.Обороты({(&НачалоПериода)}, {(&ОкончаниеПериода)}, , ) КАК ЗакупкиОбороты
    ПО Таблица.Организация = ЗакупкиОбороты.Организация
    И Таблица.Партнер = ЗакупкиОбороты.Партнер
    И Таблица.Контрагент = ЗакупкиОбороты.Контрагент
    И Таблица.Номенклатура = ЗакупкиОбороты.АналитикаУчетаНоменклатуры.Номенклатура
```
---
Не вчитывался в запрос, но сразу скажу, что при полном соединении с измерениями, по которым соединяете, нужно делать так:
ВЫБОР
   КОГДА Таблица1.Измерение1 ЕСТЬ NULL ТОГДА Таблица2.Измерение1
   ИНАЧЕ Таблица1.Измерение1
КОНЕЦ
Иначе строки и потеряете.
---
не рекомендуется использовать полное соединение на виртуальных таблицах https://its.1c.ru/db/metod8dev#content:5842:hdoc
---
Раздели 2 регистра по 2 временным таблицам с общим реквизитом НОМЕНКЛАТУРА и потом связывай эти таблицы
---
Там не два регистра :) Ну поместил я итоговую выборку отчета в одну ВТ, а таблицу закупок в другую ВТ. Связал и по ключевым полям (Организация, Партнер, Номенклатура...). Тоже самое имею на выходе.

Я так понимаю все упирается в то, что в полях, где нет данных по выручке и себестоимости, но есть данные по закупкам, везде стоит NULL.

Не пойму как грамотно оформить. Где-то читал, что надо связывать наборы данных СКД. Но не умею это делать,
---
Что значит Там не два регистра :)
А это что по вашему ? Справочники? ))))
 РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Н, &К, , ) КАК ВыручкаИСебестоимостьПродажОбороты
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления

И кроме того вопрос - а в консоли вы прекрасно получаете все данные так как хотите видеть?
Приведите картинку с этими данными.....
---
Я имел ввиду, что оригинальный текст запроса посложнее:

Ну сделаю я выборку по закупкам и помещу ее во временную таблицу. Потом приклею к итоговой таблице оригинального запроса. Результат прежний.
---
Вот вы и добейтесь "на кошках", чтобы ваш упрощенный вариант отрабатывал так как вы хотите.
Вы же нам простой запрос привели и сказали, что он не работает.
Лезть в сложный нужно тогда, когда поймешь почему простой не работает на 2 регистрах...
---
Гениально, коллега! Мне нужно разобраться! Так и запишем)
Спасибо!
---
Вы не записывайте, вы разбирайтесь со своими задачами...
Предлагая читателям одну задачу , имея ввиду совершенно другую и пытаясь еще возмущаться , что предлагают решение предложенной задачи вы ОЧЕНЬ много помощи получите...
---
Коллега, давайте не будем спорить. Я не возмущаюсь. Вероятно, Вы не поняли суть. Вы ответили как могли, я Вас услышал.

Я попробую упростить запрос штатного отчета, чтобы приклеить нужную мне колонку.
Еще раз повторюсь, дело не во временных таблицах. Дело в том, что скорее всего СКД из-за NULL'ов в измерениях отсекает строки.
Я думал, что наверняка у многих такое было, кто пишет отчеты.
---
Во временные таблицы помещать нужно не итоговые выборки , а выборки из обоих регистров, или из каждого регистра в свою ВТ - для понятности
---
Может, дело в отборе "Кроме услуг"?
---
Это:

```1c
    ВЫБРАТЬ
    Таблица.Регистратор КАК Регистратор,
    ЕстьNull(Таблица.Номенклатура, Значение(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура,
    Таблица.Организация КАК Организация,
    Таблица.Продавец КАК Продавец,
    Таблица.Партнер КАК Партнер,
```

по хорошему нужно обернуть:

```1c
    ВЫБРАТЬ
    Таблица.Регистратор КАК Регистратор,
    ЕстьNull(Таблица.Номенклатура, ЕстьNull(ЗакупкиОбороты.АналитикаУчетаНоменклатуры, Значение(Справочник.Номенклатура.ПустаяСсылка))) КАК Номенклатура,
    ЕстьNull(Таблица.Организация, ЗакупкиОбороты.Организация) КАК Организация, ,
    ЕстьNull(Таблица.Продавец, ЗакупкиОбороты.Продавец) КАК Продавец,
    ЕстьNull(Таблица.Партнер, ЗакупкиОбороты.Партнер) КАК Партнер,
```
---
Не вчитывался в запрос, но сразу скажу, что при полном соединении с измерениями, по которым соединяете, нужно делать так:
ВЫБОР
   КОГДА Таблица1.Измерение1 ЕСТЬ NULL ТОГДА Таблица2.Измерение1
   ИНАЧЕ Таблица1.Измерение1
КОНЕЦ
Иначе строки и потеряете.
---
Да, вот я и подозревал, что так и есть.

Нашел статью на ИТС про объединение наборов данных https://its.1c.ru/db/pubcomplexreports/content/37/hdoc
Очень удобный прием тем, что тест запроса можно разбить на наборы - легче визуально воспринимать структуру запроса.

В упрощенном варианте этим приемом я склеил данные регистров накопления "ВыручкаИСебестоимостьПродаж" и "Закупки".

Теперь осталось победить штатный отчет.
---
азу скажу, что при полном соединении с измерениями, по которым соединяете, нужно делать так:
ВЫБОР
КОГДА Таблица1.Измерение1 ЕСТЬ NULL ТОГДА Табл

Спасибо, очень помогло ваше сообщение!
---
Ну, это про объединение. А вы же про соединение писали. Совсем разные вещи.
При объединении валятся в одни и те же колонки разные наборы несвязанных данных. При соединении вы приращиваете колонки, пересекая наборы по каким-либо измерениям.
Вот я и пишу выше - в этом случае, если вы эти измерения включаете в состав выбираемых колонок, то надо их брать из какой-либо из пересекаемых таблиц. А если в ней не окажется данных в текущей троке - то из другой таблицы. Иначе строка выпадет.
---
См. скрин. Результат я получаю идентичный штатному отчету. Колонка клеится как надо.
По сути, забыв сейчас про возможности СКД и говоря только о запросе, то две таблицы мы можем одинаково склеить по колонкам с помощью объединения (вертикальное) и полного соединения (горизонтальное).
Наверняка, есть нюансы, но в целом, применимо к моей задаче, мне подходит и объединение.

Ну и собственно я так понял исходя из статьи, что это аналог "вертикального" соединения в самом запросе. А связи наборов данных в СКД всегда работают как левое внешнее соединение (горизонтальное).

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

Я не пойму, про что Вы писали...
какие еще несвязанные данные. Вы скриншот посмотрите в 17 посте. Все связано как надо.
---
Кстати, может кому интересно будет, прикладываю файл отчета.
Это набросок для проверки связи наборов данных СКД, который я сделал по статье с ИТС https://its.1c.ru/db/pubcomplexreports/content/37/hdoc
---
Феерично.
---
Да что я не так делаю? Я не стесняюсь ступорезить. Мне просто понять хочется, что же я не так делаю.
---
Знаете, вот конечно огорчают такие "коллеги", у которых цель, не помочь по теме, а блеснуть прозой.
В начале темы Вы написали по делу, а потом не в то русло пошло.
---
Попробуйте протестировать ключи аналитики, возможно потеря данных все же на левых соединениях
---
Нет, мой косяк был из-за null'ов в измерениях.

Вот решение задачи полным соединением (запрос упрощенный).

Результат запроса абсолютно идентичен варианту с использованием объединений наборов данных. Так что я не понял выше слов уважаемого коллеги про фееричность.

КодВЫБРАТЬ
   Продажи.АналитикаУчетаПоПартнерам.Организация КАК Организация,
   Продажи.АналитикаУчетаПартий.Поставщик КАК ПартнерПоставщик,
   Продажи.АналитикаУчетаПартий.Контрагент КАК Контрагент,
   Продажи.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
   СУММА(ЕСТЬNULL(Продажи.СуммаВыручкиОборот, 0)) КАК Выручка,
   СУММА(ЕСТЬNULL(Продажи.СтоимостьОборот, 0)) КАК Себестоимость,
   СУММА(ЕСТЬNULL(Продажи.СуммаВыручкиОборот, 0) - ЕСТЬNULL(Продажи.СтоимостьОборот, 0)) КАК ВаловаяПрибыль
ПОМЕСТИТЬ ВТПродажи
ИЗ
   РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты({(&НачалоПериода)}, {(&ОкончаниеПериода)}, , ) КАК Продажи

СГРУППИРОВАТЬ ПО
   Продажи.АналитикаУчетаПоПартнерам.Организация,
   Продажи.АналитикаУчетаПартий.Поставщик,
   Продажи.АналитикаУчетаПартий.Контрагент,
   Продажи.АналитикаУчетаНоменклатуры.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ЗакупкиОбороты.Организация КАК Организация,
   ЗакупкиОбороты.Партнер КАК ПартнерПоставщик,
   ЗакупкиОбороты.Контрагент КАК Контрагент,
   ЗакупкиОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
   ЕСТЬNULL(ЗакупкиОбороты.СуммаОборот, 0) КАК СуммаЗакупки
ПОМЕСТИТЬ ВТЗакупки
ИЗ
   РегистрНакопления.Закупки.Обороты({(&НачалоПериода)}, {(&ОкончаниеПериода)}, , ) КАК ЗакупкиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВЫБОР
      КОГДА ВТЗакупки.Организация ЕСТЬ NULL
         ТОГДА ВТПродажи.Организация
      ИНАЧЕ ВТЗакупки.Организация
   КОНЕЦ КАК Организация,
   ВЫБОР
      КОГДА ВТЗакупки.ПартнерПоставщик ЕСТЬ NULL
         ТОГДА ВТПродажи.ПартнерПоставщик
      ИНАЧЕ ВТЗакупки.ПартнерПоставщик
   КОНЕЦ КАК ПартнерПоставщик,
   ВЫБОР
      КОГДА ВТЗакупки.Контрагент ЕСТЬ NULL
         ТОГДА ВТПродажи.Контрагент
      ИНАЧЕ ВТЗакупки.Контрагент
   КОНЕЦ КАК Контрагент,
   ВЫБОР
      КОГДА ВТЗакупки.Номенклатура ЕСТЬ NULL
         ТОГДА ВТПродажи.Номенклатура
      ИНАЧЕ ВТЗакупки.Номенклатура
   КОНЕЦ КАК Номенклатура,
   ВТПродажи.Выручка КАК Выручка,
   ВТПродажи.Себестоимость КАК Себестоимость,
   ВТПродажи.ВаловаяПрибыль КАК ВаловаяПрибыль,
   ВЫРАЗИТЬ(ВЫБОР
         КОГДА ВТПродажи.Выручка <> 0
            ТОГДА ВТПродажи.Выручка - ВТПродажи.Себестоимость / ВТПродажи.Выручка
         ИНАЧЕ 0 * 100
      КОНЕЦ КАК ЧИСЛО(15, 2)) КАК Рентабельность,
   ВТЗакупки.СуммаЗакупки КАК СуммаЗакупки
ИЗ
   ВТПродажи КАК ВТПродажи
      ПОЛНОЕ СОЕДИНЕНИЕ ВТЗакупки КАК ВТЗакупки
      ПО ВТПродажи.Организация = ВТЗакупки.Организация
         И ВТПродажи.ПартнерПоставщик = ВТЗакупки.ПартнерПоставщик
         И ВТПродажи.Контрагент = ВТЗакупки.Контрагент
         И ВТПродажи.Номенклатура = ВТЗакупки.НоменклатураПоказать полностью
---
То есть, всё-таки вы смогли привести код? )) То есть, всё-таки не всё делает сама СКД?
Вы все время приводите соединение, и ни разу объединение. И при этом почему-то утверждаете, что это одно и тоже.
Однако, вам всё-таки надо придти к тому, что это никак не одно и то же.
Соединение производится на уровне строк. Берётся строка из одной таблицы, ищется подходящая по условиям строка из другой, и из последней к исходной строке добавляются нужные поля. И так со всеми подходящими по условиям строками. Ещё раз обращаю внимание - добавляются поля к строке.
При объединении же сразу "рисуются" нужные колонки, и в них "вываливаются" данные сначала из одной таблицы, потом из другой. Потом из третьей, четвёртой.. из всех выбранных. При этом каждой из этих таблиц абсолютно всё равно, что содержится во всех остальных. Это данные не связанные.
Собственно, ничего нового не говорю, всё это я уже писал выше.
---
То есть, всё-таки вы смогли привести код? ))
Да на кой хрен писать этот код, если мы с Вами понимаем как решить задачу полным соединением?

Я обеими способами решил задачу. А значит оба способа имеют право на жизнь.
А Вы мне толкуете там про теорию. Я понимаю, что эти способы по разному обрабатывают данные, но в моем конкретном случае даже объединение наборов данных с последующей группировкой средствами СКД дает аналогичный результат.