8.х Программно добавить доступное поле в СКД (набор данных - объект)

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем ЧКДзержинский, 6 июл 2015.

  1. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Всем доброго дня ваяю в СКД отчет с произвольным числом колонок, т.е. наименование колонок и их состав заранее неизвестен.
    Пытаюсь добавить поле в отчет, но натыкаюсь на проблему - не могу добавить поле список доступных полей. В список выбранных полей получилось добавить, но он так с красным крестиком, т.к. его нет в списке доступных.
  2. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    скрин покажите.

    В выборке из запроса это поле точно есть?
  3. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Источник данных объект и среди колонок таблицы значений есть та, которую я пытаюсь добавить в список доступных полей.
  4. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    ну покажите скрин? может там на вкладке набор данных у этого поля галочка стоит что поле недоступно для выбора
  5. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Зачем вам скрин? Проблема с полями, существование которых заранее неизвестно. Когда я создаю СКД, то в перечень полей набора данных я добавляю только те, которые точно будут, а есть поля которые будут появляться или исчезать, в зависимости от номенклатурного состава определенных документов. Иными словами, на скрине не может быть полей, с которыми у меня проблемы. Эти поля я добавляю программно:


    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.НаборДанныхТЗ;
    ПолеНекаяУслуга = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ПолеНекаяУслуга.Заголовок = "НекаяУслуга";
    ПолеНекаяУслуга.ПутьКДанным = "НекаяУслуга";
    ПолеНекаяУслуга.Поле = "НекаяУслуга";

    В таблице-источнике данных есть поле "НекаяУслуга".

    Если просмотреть ограничения использования, то везде Ложь:

    ПолеНекаяУслуга.ОграничениеИспользования:
    Группировка - Ложь
    Поле - Ложь
    Порядок - Ложь
    Условие - Ложь
  6. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    я просто не совсем понимаю что именно и где не выводится.
    Просто есть ПолеНабораДанныхСхемыКомпоновкиДанных - это вы создаете поля СКД образног говоря вкладка набор данных
    есть ПолеГруппировкиКомпоновкиДанных - это когда вы программно групировку формируете в макете
    есть ПолеКомпоновкиДанных там либо авто поля либо какое конкретное.

    У Вас группировка в СКд кодом строится?
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    мне еще не понятно, для чего формировать поля вручную, если можно выводить в таблицу и колонки при этом могут сами формироваться?
  8. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    Ну в этом плане все просто.
    У него есть ТЗ. изначально он не знает сколько в ней будет колонок. Он ее(ТЗ) колом заполняет, один раз у него 3 колонки, другой раз 4 и т.д. потом ее передает в СКд как внешний набор, при этом ему надо тогда создать поляе в СКД и прописать их вывод.
    вотя и не пойму где именно не так.
    если ему не известно какие поля и сколько будет то получается он изначально в настройках не модет настроить группировки и т.д. значит он их прописывает.
    может там где то ошибка.
    просто вот это
    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.НаборДанныхТЗ;
    ПолеНекаяУслуга = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ПолеНекаяУслуга.Заголовок = "НекаяУслуга";
    ПолеНекаяУслуга.ПутьКДанным = "НекаяУслуга";
    ПолеНекаяУслуга.Поле = "НекаяУслуга";

    вроде как правильно, хотя мне интересно посмотреть что вот это СхемаКомпоновкиДанных.НаборыДанных.НаборДанныхТЗ ка оно создано.

    потому ка кдобавить поле и набор вот так, пример с запросом, а не внешним источником
    Код:
    СхемаКомпоновки = Новый СхемаКомпоновкиДанных;
    //   
    //    ИсточникДанных = СхемаКомпоновки.ИсточникиДанных.Добавить();
    //    ИсточникДанных.Имя = "МойИсточникДанных";
    //    ИсточникДанных.ТипИсточникаДанных = "Local";
    //   
    //    НаборДанных = СхемаКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    //    НаборДанных.Имя = "МойНаборДанных";
    //    НаборДанных.ИсточникДанных = ИсточникДанных.Имя;
    //    НаборДанных.Запрос = "ВЫБРАТЬ
    //                         |    ПродажиОбороты.Номенклатура,
    //                         |    ПродажиОбороты.Контрагент,
    //                         |    ПродажиОбороты.СуммаОборот
    //                         |ИЗ
    //                         |    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты";
    //   
    //    ДоступноеПоле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    //    ДоступноеПоле.Поле = "Номенклатура";
    //    ДоступноеПоле.ПутьКДанным = "Номенклатура";
    //    ДоступноеПоле.Роль.Измерение = Истина;
    
  9. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Я так понимаю, необходимо выполнять инициализацию компоновщика настроек после добавления ТЗ в виде источника данных, чтобы компоновщик "понял" с какой структурой данных ему вообще придется работать. После инициализации компоновщика должны появится доступные поля везде, где они подразумеваются.
  10. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Что касается группировок, то они изначально созданы, я могу просто дополнить их состав, т.е. новые группировки не нужно создавать. Но вы напрасно интересуетесь ими. Дело в том, что группировки можно настроить и в режиме Предприятия при условии, что необходимые данные будут в списке доступных полей, а у меня именно в этом проблема.

    Что касается источника данных, то я не понял вопроса. НаборДанныхТЗ - это таблица значений и она задана в качестве источника. Все поля, которые я формирую непрограммно, выводятся в отчет.
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Количество колонок в ТЗ может быть разное - это верное утверждение?
  12. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    т.е я правильно понял что у Вас уже есть Схема компановки, Вы к ней подключаетесь и добавляете поля. Так?
    Можно тогда код от того как вы получили схему и до того как поля добавили.
  13. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Да, количество колонок в ТЗ может быть разное.

    Да, схема компоновки данных уже есть, я к ней подключаюсь и добавляю поля. И, как я ранее уже писал, удается добавить поле в список выбранных полей, но оно с крестиком, т.к. отсутствует в списке доступных.

    Далее сокращенный код процедуры ПриКомпоновкеРезультата;

    Код:
    СтандартнаяОбработка = Ложь;
    Запрос = Новый Запрос;
    Запрос.Текст = ".............."
    ТаблицаРезальтат = Запрос.Выполнить().Выгрузить();   
    ОбработкаТаблицыЗначений(ТаблицаРезальтат);
    
        
        ВнешниеНаборыДанных = Новый Структура;
        ВнешниеНаборыДанных.Вставить("ТаблицаРезальтат", ТаблицаРезальтат);
       
       
        //Добавим дополнительные поля
        НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.НаборДанныхТЗ;
        ПолеНекаяУслуга = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        ПолеНекаяУслуга.Заголовок = "НекаяУслуга";
        ПолеНекаяУслуга.ПутьКДанным = "НекаяУслуга";
        ПолеНекаяУслуга.Поле = "НекаяУслуга";
       
       
        // Подготовимся к исполнению, сформировав макет компоновки данных
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        Настройки =  КомпоновщикНастроек.ПолучитьНастройки();
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
       
        // Выполним компоновку данных
        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
       
        ПолеВыбора = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
        ПолеВыбора.Поле = Новый ПолеКомпоновкиДанных("НекаяУслуга");
        ПолеВыбора.Заголовок = "НекаяУслуга";
        ПолеВыбора.Использование = Истина;
       
       
        ПолеГруппировки = КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));    
        ПолеГруппировки.Использование = Истина;
        ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("НекаяУслуга");
    
       
        // Создадим и инициализируем процессор вывода результата
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
       
        // Обозначим начало вывода
        ПроцессорВывода.НачатьВывод();
       
        // Основной цикл вывода отчета
        Пока Истина Цикл
           
            // Получим следующий элемент результата компоновки
            ЭлементРезультата = ПроцессорКомпоновки.Следующий();
            Если ЭлементРезультата = Неопределено Тогда
               
                // Следующий элемент не получен - заканчиваем цикл вывода
                Прервать;
               
            Иначе
               
                // Элемент получен - выведем его при помощи процессора вывода
                ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
               
            КонецЕсли; 
        КонецЦикла; 
       
        // Обозначем завершение вывода
        ПроцессорВывода.ЗакончитьВывод();
       
        //Зададим настройки табличного документа
        ДокументРезультат.ОтображатьСетку = Ложь;
        ДокументРезультат.ОтображатьЗаголовки = Ложь;
        ДокументРезультат.Показать();
    
    --- Объединение сообщений, 8 июл 2015 ---
    И еще, поле в группировку тоже добавляется и тоже с крестиком.
  14. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    1.а можете все же скрин Набора данных
    2. У Вас одна настройка основная? и она же в ползовательском режие открыввается.?
    3. Отладчиком разверните и покажите что вот тут
    СхемаКомпоновкиДанных.НаборыДанных
  15. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Как подключить картинку, чтобы напрямую с локального компа загрузить, чтобы без УРЛа?
    --- Объединение сообщений, 8 июл 2015 ---
    2. Была одна настройка, я ее удалял, но от этого ничего не менялось.
    3. СхемаКомпоновкиДанных.НаборыДанных
    +НаборДанныхТЗ
    --- Объединение сообщений, 8 июл 2015 ---
    У меня не пустой отчет выходит. Более того, если и одно из динамичных полей прописываю в СКД, то тогда в отчете выходит и это поле и его содержимое.
    --- Объединение сообщений, 8 июл 2015 ---
    вот скрин

    Вложения:

    • Скрин.png
      Скрин.png
      Размер файла:
      56 КБ
      Просмотров:
      14
    Последнее редактирование: 8 июл 2015
  16. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    А я по коду что то не вижу перед процессором вывода вот такого

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

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

    Ну тут более важное вот это КомпоновщикМакета.Выполнить -оно скопанует макет с настройками. Вы же настройки поменяли.
  17. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Есть там такой код - сразу после комментария:
    // Подготовимся к исполнению, сформировав макет компоновки данных
  18. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.634
    Симпатии:
    946
    Баллы:
    204
    Ну так после него у вас потом написано
    ПолеВыбора = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ПолеВыбора.Поле = Новый ПолеКомпоновкиДанных("НекаяУслуга");
    ПолеВыбора.Заголовок = "НекаяУслуга";
    ПолеВыбора.Использование = Истина;


    ПолеГруппировки = КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    ПолеГруппировки.Использование = Истина;
    ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("НекаяУслуга");

    т.е это вновь добавленое нескомпановано
  19. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Тем не менее поле появляется в группировке отчета. Но опять же, группировки - это не проблема.
  20. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Да, в этом был косяк, что-то я ступил. :)
    Спасибо.

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