В наборах данных 2 запроса. В первом (КроссТаблица) объемный запрос с ресурсом (ДоходыТест), который и требуется вывести в отчет. Во втором (ТипыУслуг) - все элементы небольшого справочника - это колонки отчета.
Задача: выводить все элементы в колонках вне зависимости от наличия соединенных с ними строк из первого запроса.

Ограничения:
1. Сделать это необходимо не запросом, а исключительно силами СКД, т.к. при полном соединении в запросе получается 42 000 строк за 1800 секунд...
2. Изменение макета не подходит, т.к. состав справочника (а следовательно и колонок) может измениться.

Испробованные варианты:
1. Роль поля в наборе данных "Обязательное" эффекта не дает. Колонки все-равно обрезаются согласно условиям отбора.
2. Отключение "Обязательная связь" в связях этих наборов данных дает некорректный расчет ресурсов.

Прилагаю сам внешний отчет со своими изысканиями.
---
```1c
    СтандартнаяОбработка = Ложь;
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,НастройкиОтчета,ДанныеРасшифровки);
    Для Каждого _Связь Из МакетКомпоновки.СвязиНаборовДанных Цикл
    // Тут какая _Связь.ТипСвязи;
    КонецЦикла;
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
```
---
ПРИЧИНА ПРОБЛЕМЫ:
При наложении отборов на поля НабораДанныхПриемника (зависимого) СКД принудительно меняет тип связи между наборами с левого внешнего соединения на левое внутреннее.

НАЙДЕННОЕ РЕШЕНИЕ:

1. Программное изменение связи между наборами данных в МакетеКомпоновки на ТипСвязиНаборовДанныхКомпоновкиДанных.Внешняя в процедуре модуля отчета ПриКомпоновкеРезультата()

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    // GV - 06.09.2019 - Принудительный вывод всех типов услуг вне зависимости от наложенных отборов
    Для Каждого Связь Из МакетКомпоновки.СвязиНаборовДанных Цикл
    Если Связь.НаборДанныхИсточник = "ТипыУслуг" И Связь.НаборДанныхПриемник = "КроссТаблица" Тогда
    Связь.ТипСвязи = ТипСвязиНаборовДанныхКомпоновкиДанных.Внешняя;
    КонецЕсли;
    КонецЦикла;

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

    ДокументРезультат.Очистить();

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

    КонецПроцедуры
```

2. Опционально. Для корректного расчета ресурсов также потребовалось "обернуть" ресурсные поля в ВычисляемыхПолях в ЕСТЬNULL(<Поле>, 0).
---
Соединить второй набор данных с первым
---
Так они и так соединены.
---
А в ПриКомпоновкеРезультата какой ТипСвязи у МакетКомпоновки.СвязиНаборовДанных. Может быть программно при выводе попробовать заменить связь?
---
```1c
    СтандартнаяОбработка = Ложь;
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,НастройкиОтчета,ДанныеРасшифровки);
    Для Каждого _Связь Из МакетКомпоновки.СвязиНаборовДанных Цикл
    // Тут какая _Связь.ТипСвязи;
    КонецЦикла;
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
```
---
whoo, Спасибо! Все верно. Забавно получилось, сейчас зашел сюда, чтобы отписаться о найденном решении, а оно уже тут и так висит =)
---
ПРИЧИНА ПРОБЛЕМЫ:
При наложении отборов на поля НабораДанныхПриемника (зависимого) СКД принудительно меняет тип связи между наборами с левого внешнего соединения на левое внутреннее.

НАЙДЕННОЕ РЕШЕНИЕ:

1. Программное изменение связи между наборами данных в МакетеКомпоновки на ТипСвязиНаборовДанныхКомпоновкиДанных.Внешняя в процедуре модуля отчета ПриКомпоновкеРезультата()

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    // GV - 06.09.2019 - Принудительный вывод всех типов услуг вне зависимости от наложенных отборов
    Для Каждого Связь Из МакетКомпоновки.СвязиНаборовДанных Цикл
    Если Связь.НаборДанныхИсточник = "ТипыУслуг" И Связь.НаборДанныхПриемник = "КроссТаблица" Тогда
    Связь.ТипСвязи = ТипСвязиНаборовДанныхКомпоновкиДанных.Внешняя;
    КонецЕсли;
    КонецЦикла;

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

    ДокументРезультат.Очистить();

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

    КонецПроцедуры
```

2. Опционально. Для корректного расчета ресурсов также потребовалось "обернуть" ресурсные поля в ВычисляемыхПолях в ЕСТЬNULL(<Поле>, 0).