Имя: Пароль:
1C
1С v8
Создание СКД из ПостроителяОтчета (УФ)
0 SashaNox
 
01.04.14
13:58
Добрый день! Необходимо на основе ПостроителяОтчета создать схему компоновки с настройками. Вот накопал на форуме информацию, и все же не могу добиться того чтобы у меня появились доступные поля выбора, отбора, порядка и т.д.

Итак, что я делаю:

   // процедура исполняется на сервере
   // КомпоновщикНастроек - реквизит формы

    //1. создаем схему компоновки данных на основе построителя отчета
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
    
    //1.0 подготовим построитель отчета
    ПостроительОтчета = ПодготовитьПостроительОтчета();
    
    //1.1 определяем источник данных для схемы
    //для наших целей - текущая ИБ
    Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
    Источник.Имя                = "ЛокальнаяБаза";
    Источник.СтрокаСоединения   = "";
    Источник.ТипИсточникаДанных = "Local";
    
    //1.2 определяем набор данных
    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанных.Имя                          = "РаботникиОрганизации";
    НаборДанных.ИсточникДанных               = "ЛокальнаяБаза";
    НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
    НаборДанных.Запрос                       = ПостроительОтчета.Текст;
    
    //1.2.1 добавляем поля
    Для каждого ДоступноеПоле Из ПостроительОтчета.ДоступныеПоля Цикл
        ПолеСКД = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        
        ПолеСКД.Заголовок   = ДоступноеПоле.Представление;
        ПолеСКД.ПутьКДанным = ДоступноеПоле.ПутьКДанным;
        ПолеСКД.ТипЗначения = ДоступноеПоле.ТипЗначения;
        ПолеСКД.Поле        = ДоступноеПоле.Имя;
        
        ПолеСКД.ОграничениеИспользования.Группировка = ДоступноеПоле.Измерение;
        ПолеСКД.ОграничениеИспользования.Условие     = ДоступноеПоле.Отбор;
        ПолеСКД.ОграничениеИспользования.Поле        = ДоступноеПоле.Поле;
        ПолеСКД.ОграничениеИспользования.Порядок     = ДоступноеПоле.Порядок;
        
        ПолеСКД.ОграничениеИспользованияРеквизитов.Группировка = ДоступноеПоле.Измерение;
        ПолеСКД.ОграничениеИспользованияРеквизитов.Условие     = ДоступноеПоле.Отбор;
        ПолеСКД.ОграничениеИспользованияРеквизитов.Поле        = ДоступноеПоле.Поле;
        ПолеСКД.ОграничениеИспользованияРеквизитов.Порядок     = ДоступноеПоле.Порядок;
        
        Если СтруктураФорматаПолей.Свойство(ДоступноеПоле.Имя) Тогда
            ПолеСКД.Оформление.УстановитьЗначениеПараметра("Формат", СтруктураФорматаПолей[ДоступноеПоле.Имя]);
        КонецЕсли;
    КонецЦикла;

    //1.3 определяем ресурсы
    // их нет
    
    //2. создаем настройки для схемы
    НастройкиКомпоновкиДанных = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    
    //2.1 определяем структуру
    //2.1.1 добавляем группировку "Номенклатура"
    ГруппировкаДетальныеЗаписи = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    АвтоПоле = ГруппировкаДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоПоле.Использование = Истина;
    
    //2.2 определим выбранные поля
    Для каждого ВыбранноеПолеПО Из ПостроительОтчета.ВыбранныеПоля Цикл
        ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
        ВыбранноеПоле.Заголовок     = ВыбранноеПолеПО.Представление;
        ВыбранноеПоле.Использование = Истина;
        ВыбранноеПоле.Поле          = Новый ПолеКомпоновкиДанных(ВыбранноеПолеПО.Имя);
    КонецЦикла;
    
    //2.3 определим отборы
    Для каждого ПолеОтбораПО Из ПостроительОтчета.Отбор Цикл
        ЭлементОтбора = НастройкиКомпоновкиДанных.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(ПолеОтбораПО.Имя);
        ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных[СтрЗаменить(ПолеОтбораПО.ВидСравнения, " ", "")];
        ЭлементОтбора.ПравоеЗначение = ПолеОтбораПО.Значение;
        ЭлементОтбора.Использование  = ПолеОтбораПО.Использование;
    КонецЦикла;
    
    //2.4 загрузим настройки
// это результат поисков на форуме, и всевозможных (судя по результату наверное не всевозможных) вариантов
// где не посмотри - доступные поля содержат только две папки: Параметры и СистемныеПоля
    КомпоновщикНастроекСервер = Новый КомпоновщикНастроекКомпоновкиДанных;
    АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных);
    КомпоновщикНастроекСервер.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
    КомпоновщикНастроекСервер.ЗагрузитьНастройки(НастройкиКомпоновкиДанных);
    КомпоновщикНастроек = КомпоновщикНастроекСервер;
    
    //3. готовим макет
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет             = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    //4. исполняем макет
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(Макет);
    ПроцессорКомпоновки.Сбросить();
    
    //5. выводим результат
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);


Помоги народ! Убил кучу времени уже!
1 SashaNox
 
01.04.14
14:34
Вопрос закрыт! Разобрался!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс