8.х Проблемы с программным созданием набора данных в СКД

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Petrony, 29 апр 2016.

  1. TopicStarter Overlay
    Petrony
    Offline

    Petrony Новичок в 1С

    Регистрация:
    29 апр 2016
    Сообщения:
    5
    Симпатии:
    1
    Баллы:
    4
    Хочу сделать универсальный вывод таблицы значений средствами СКД с возможностью дальнейшего отбора по всем полям. Будет вызываться отчет, в который будет передаваться таблица значений, а дальше по колонкам таблицы будет создаваться схема компоновки и формироваться отчет.
    Столкнулся с проблемой, что в выбранных полях красным крестиком отображаюся добавленные программно поля внешнего набора данных. И эти поля не отображаются в списке доступных. Отчет не формируется и не выдает никаких ошибок. Ниже упрощенный код модуля отчета.
    Я так подозреваю, что каким-то образом КомпоновщикМакета.Выполнить() у меня не срабатывает. Может есть какие-то идеи?

    Код:
    Перем Настройки, ТаблицаДанных;
    
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
     
        СтандартнаяОбработка = Ложь;
     
        СоздатьТестовуюТаблицуДанных();
        СоздатьСхемуПоПереданнымДанным();
        УстановитьНастройки();
     
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
         
        ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, Новый Структура("ВнешниеДанные", ТаблицаДанных));
                             
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
        ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
     
    КонецПроцедуры
    
    Процедура СоздатьТестовуюТаблицуДанных()
     
        Если ТаблицаДанных = Неопределено Или ТаблицаДанных.Количество() = 0 Тогда
            Запрос = Новый Запрос;
            Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 2
                      |    ПродажиОбороты.Номенклатура,
                      |    ПродажиОбороты.КоличествоОборот Как Количество
                      |ИЗ
                      |    РегистрНакопления.Продажи.Обороты(ДАТАВРЕМЯ(2016, 4, 1), ДАТАВРЕМЯ(2016, 4, 2), , ) КАК ПродажиОбороты";
                   
            ТаблицаДанных = Запрос.Выполнить().Выгрузить();
         КонецЕсли;
     
    КонецПроцедуры
    
    Процедура СоздатьСхемуПоПереданнымДанным()
     
    Если СхемаКомпоновкиДанных <> Неопределено И СхемаКомпоновкиДанных.НаборыДанных.Количество() <> 0 Тогда
    Возврат;
        КонецЕсли;
     
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
         ИД = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
         ИД.Имя = "ИсточникДанных";
         ИД.ТипИсточникаДанных = "Local";
         НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
        НаборДанных.Имя = "ВнешниеДанные";
        НаборДанных.ИмяОбъекта = "ВнешниеДанные";
        НаборДанных.ИсточникДанных = "ИсточникДанных";
       
        Для Каждого КолонкаВнешнейТаблицы Из ТаблицаДанных.Колонки Цикл
            ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
            ПолеНабора.Поле = КолонкаВнешнейТаблицы.Имя;
            ПолеНабора.ТипЗначения = КолонкаВнешнейТаблицы.ТипЗначения;
            ПолеНабора.ПутьКДанным = КолонкаВнешнейТаблицы.Имя;
         КонецЦикла;
           
    КонецПроцедуры
    
    Процедура УстановитьНастройки()
     
        Если Настройки <> Неопределено Тогда // пользователь уже изменил настройки
            Настройки = КомпоновщикНастроек.ПолучитьНастройки();
            Возврат;
        КонецЕсли;
     
        Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
     
        ГруппировкаВерхнегоУровня = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
        ГруппировкаВерхнегоУровня.Использование = Истина;
               
        Для Каждого НаборДанных Из СхемаКомпоновкиДанных.НаборыДанных Цикл
            Для Каждого ПолеНабораДанных Из НаборДанных.Поля Цикл
                НовоеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
                НовоеПоле.Поле = Новый ПолеКомпоновкиДанных(ПолеНабораДанных.Поле);
                НовоеПоле.Использование = Истина;
            КонецЦикла;
        КонецЦикла;
     
        КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
     
    КонецПроцедуры
    Последнее редактирование модератором: 29 апр 2016
  2. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    У меня сразу вопрос
    у вас изначально в отчете есть схема копановки

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

    в глобальных перменных ее нигде не описано
    в процедуре СоздатьСхемуПоПереданнымДанным() вы по сути создаете заново схему компановки Новый СхемаКомпоновкиДанных;

    вопрос зачем создавать если она у Вас уже есть. (если конечно есть). а если нет тогда какую вы передаете в компановщик?
  3. TopicStarter Overlay
    Petrony
    Offline

    Petrony Новичок в 1С

    Регистрация:
    29 апр 2016
    Сообщения:
    5
    Симпатии:
    1
    Баллы:
    4
    Если в свойствах отчета не указана Основная Схема Компоновки данных, то из кода свойство СхемаКомпоновкиДанных = Неопределено
    Именно поэтому я проверяю на Неопределено и создаю новую. Я пробовал также и создавать интерактивно новую схему компоновки данных с набором данных но без полей и устанавливать ее основной. Тогда свойство СхемаКомпоновкиДанных уже содержит эту схему.
    Но точно также, если программно в набор данных схемы по умолчанию добавляю поля, то отчет корректно не компонуется.
    Код
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; создает новую схему и записывает ее в свойство, в котором обычно содержится схема по умолчанию. Это срабатывает корректно, так как в отладчике, в момент выполнения
    КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки)
    содержится и программно созданная схема и настройки, причем и схема и настройки содержат все данные, которые я туда добавлял.

Поделиться этой страницей