Задача стоит такая: на СКД нужно сделать отчет по продажам в разрезе конкретного свойства номенклатуры, НО вывести также свойства по которым продаж не было.
Если делать просто через запрос, а значение свойства поставить в колонку структуры отчета, то не увидим свойства по которым не было продаж.

В итоге разных вариаций пришел к формированию ресурсов программно. Вроде ничего сложного.
В событие "ПриКомпоновке": добавил перестроение запроса, добавление полей набора данных, расчет итогов и разрешение на вывод.

Отчет формируется, но почему-то ресурсы в настройке с "крестиком", как будто нет пути к данным. Новых ресурсов нет в списке доступных полей.

Код

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = ложь;
    мСвойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("УТ0000003");
    СвойствоПараметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Свойство");
    СвойствоПараметр.Использование = Истина;
    СвойствоПараметр.Значение = мСвойство;

    //Перестроим компоновщик
    ТекстЗапросаСхемы = "ВЫБРАТЬ
    | ПродажиОбороты.ПериодМесяц,
    | ПродажиОбороты.ПериодКвартал,
    | ПродажиОбороты.ПериодПолугодие,
    | ПродажиОбороты.ПериодГод,
    | ПродажиОбороты.Номенклатура,
    | ПродажиОбороты.ХарактеристикаНоменклатуры,
    | ПродажиОбороты.Контрагент,
    | ПродажиОбороты.КоличествоОборот,";
    //мТекстЗапроса = ";
    СписокПараметров = новый Соответствие;
    СписокРесурсов = новый Соответствие;
    ВыборкаЗначений = Справочники.ЗначенияСвойствОбъектов.Выбрать(,мСвойство);
    сч= 0;
    Пока ВыборкаЗначений.Следующий() Цикл
    Если ВыборкаЗначений.ПометкаУдаления или ВыборкаЗначений.ЭтоГруппа Тогда
    продолжить;
    КонецЕсли;
    сч = СписокПараметров.Количество();
    СписокПараметров.Вставить("Св_"+строка(сч),ВыборкаЗначений.Ссылка);
    СписокРесурсов.Вставить("КоличествоПоСв_"+строка(сч),ВыборкаЗначений.Ссылка.Наименование);

    ТекстЗапросаСхемы = ТекстЗапросаСхемы+символы.ПС+
    "ВЫБОР
    | КОГДА ЗначенияСвойства.Знач = &Св_"+строка(сч)+"
    | ТОГДА ПродажиОбороты.КоличествоОборот
    | ИНАЧЕ 0
    |КОНЕЦ КАК КоличествоПоСв_"+строка(сч)+",";
    КонецЦикла;

    ТекстЗапросаСхемы = ТекстЗапросаСхемы +"
    | ПродажиОбороты.СтоимостьОборот,
    | ПродажиОбороты.СтоимостьБезСкидокОборот
    |ИЗ
    | РегистрНакопления.Продажи.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, Авто, ) КАК ПродажиОбороты
    | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    | ЗначенияСвойствОбъектов.Объект КАК Номенклатура,
    | ЗначенияСвойствОбъектов.Значение КАК Знач
    | ИЗ
    | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    | ГДЕ
    | ЗначенияСвойствОбъектов.Свойство = &Свойство) КАК ЗначенияСвойства
    | ПО ПродажиОбороты.Номенклатура = ЗначенияСвойства.Номенклатура ";

    СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапросаСхемы;

    Для Каждого ТекПараметр из СписокПараметров Цикл
    ПараметрСхемы = СхемаКомпоновкиДанных.Параметры.Найти(ТекПараметр.Ключ);
    Если НЕ ПараметрСхемы = Неопределено Тогда
    СхемаКомпоновкиДанных.Параметры.Удалить(ПараметрСхемы);
    КонецЕсли;
    НовыйПараметр = СхемаКомпоновкиДанных.Параметры.Добавить();
    НовыйПараметр.Имя = ТекПараметр.Ключ;
    НовыйПараметр.Заголовок = ТекПараметр.Ключ;
    НовыйПараметр.ОграничениеИспользования = Истина;
    НовыйПараметр.Значение = ТекПараметр.Значение;

    КонецЦикла;

    Для Каждого ТекРесурс из СписокРесурсов Цикл

    ТекПоле = СхемаКомпоновкиДанных.НаборыДанных[0].Поля.Найти(ТекРесурс.Ключ);
    Если НЕ ТекПоле = Неопределено тогда
    СхемаКомпоновкиДанных.НаборыДанных[0].Поля.Удалить(ТекПоле);
    КонецЕсли;
    ТекПоле = СхемаКомпоновкиДанных.НаборыДанных[0].Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ТекПоле.Поле = ТекРесурс.Ключ;
    ТекПоле.ПутьКДанным = ТекРесурс.Ключ;
    ТекПоле.Заголовок = ТекРесурс.Значение;
    ТекПоле.ТипЗначения = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2));

    ПолеИтога = СхемаКомпоновкиДанных.ПоляИтога.Найти(ТекРесурс.Ключ);
    Если НЕ ПолеИтога = Неопределено Тогда
    СхемаКомпоновкиДанных.ПоляИтога.Удалить(ПолеИтога);
    КонецЕсли;

    ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
    ПолеРесурса.ПутьКДанным = ТекРесурс.Ключ;
    ПолеРесурса.Выражение = "Сумма("+ТекРесурс.Ключ+")";
    ПолеРесурса.Группировки.Добавить("Контрагент");
    ПолеРесурса.Группировки.Добавить("ОбщийИтог");

    ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Заголовок = ТекРесурс.Значение;
    ВыбранноеПоле.Использование = Истина;
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ТекРесурс.Ключ);

    КонецЦикла;

    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

    // Подготовимся к исполнению, сформировав макет компоновки данных
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    //Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);

    // Выполним компоновку данных
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

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

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

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

Почему поля не в списке доступных?
Как сделать чтобы перестроение запроса и количества полей происходила до формирования отчета, т.е. новые поля были сразу доступны в настройках отчета?
---
я в отладчике просматривал
Мне было не понятно почему мои поля и ресурсы в действющих настройках не появляются

Решение нашел в инете по коряво поставленной поисковой фразе :)
Суть оказалась в следующем:
Действия создания полей и ресурсов надо выполнять на схеме. После этого обязательно нужно переинициализировать настройки компановщика. И только тогда нужно добавлять выбранные поля в настройки компановщика.
т.е. вставить после создания полей след код

```1c
    ИсточникНастроек=Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
    КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
```

ну а далее в новом цикле

```1c
    ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Заголовок = ТекРесурс.Значение;
    ВыбранноеПоле.Использование = Истина;
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ТекРесурс.Ключ);
```
---
Сериализуй полученную схему и настройки, а затем загрузи все это в консоль. И увидишь наглядно, что именно не так.

```1c
    ЗаписьХМЛ = Новый ЗаписьXML;
    ЗаписьХМЛ.ОткрытьФайл("ИмяФайла.xml");
    СериализаторXDTO.ЗаписатьXML(ЗаписьХМЛ, Схема);
    ЗаписьХМЛ.Закрыть();
```

```1c
    ЗаписьХМЛ = Новый ЗаписьXML;
    ЗаписьХМЛ.ОткрытьФайл("ИмяФайла.xml");
    СериализаторXDTO.ЗаписатьXML(ЗаписьХМЛ, Компоновщик.Настройки);
    ЗаписьХМЛ.Закрыть();
```
---
я в отладчике просматривал
Мне было не понятно почему мои поля и ресурсы в действющих настройках не появляются

Решение нашел в инете по коряво поставленной поисковой фразе :)
Суть оказалась в следующем:
Действия создания полей и ресурсов надо выполнять на схеме. После этого обязательно нужно переинициализировать настройки компановщика. И только тогда нужно добавлять выбранные поля в настройки компановщика.
т.е. вставить после создания полей след код

```1c
    ИсточникНастроек=Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
    КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
```

ну а далее в новом цикле

```1c
    ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Заголовок = ТекРесурс.Значение;
    ВыбранноеПоле.Использование = Истина;
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ТекРесурс.Ключ);
```
---
нужно создавать свою форму отчета. И в событии ПриСозданииНаСервере делать нужные изменения.
---
Обычные формы. УТ10.3.
---
подниму тему