Имя: Пароль:
1C
1С v8
Программное добавление параметров в СКД
0 Желтый домик
 
30.09.13
03:22
Встречал ветки на форуме, но решения в них нет. Может, кто набрался опыта, поделится?

    //1. Необходимо получить нужный макет СКД

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

    //2. Проинициализировать компоновщик настроек.

    //КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
    КомпоновщикНастроек.Инициализировать(ИсточникНастроек);


    //3. Установить параметры компоновщика настроек

    номерПериода = 1;
    Для Каждого стрПериод из спПериодов Цикл
        ПараметрКомпоновки = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Добавить();
        ПараметрКомпоновки.Параметр = Новый ПараметрКомпоновкиДанных("парамПериодБюджетирования" + номерПериода);
        ПараметрКомпоновки.Использование = Истина;
        ПараметрКомпоновки.Значение = стрПериод;
        
        номерПериода = номерПериода + 1;
    КонецЦикла;    


Ошибка при вызове метода контекста (Добавить)
        ПараметрКомпоновки = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Добавить();
по причине:
Коллекция значений параметров не может изменять свой состав, так как она связана с доступными параметрами.
1 Бертыш
 
30.09.13
04:58
Они как то сами добавляются вроде в зависимости от запроса
2 Defender aka LINN
 
30.09.13
05:57
(0) И что же ты с ним делать будешь, если добавишь?
3 Желтый домик
 
30.09.13
11:20
Мне нужно сделать отчет по выполнению бюджета
-------------------------------|
               |       январь  |
Статья         |---------------|
               |  план  | факт |
-------------------------------|

Если в СКД сделать группировки по колонкам, то лезут итоги вначале по Периоду, потом по Сценарию. В общем - не комильфо.
Поэтому решил просто сделать столько колонок, сколько нужно пользователю (месяц, квартал, год). В СКД запрос подменяю, остается задать параметры. Сделать это нужно программно, в уже существующую схему.

    Для Каждого стрПериод из спПериодов Цикл
        НомерСценария = 1;
        Для Каждого стрСценарий из спСценариев Цикл
            //ТекстПараметрПериод = "&"+стрПериод;
            ИмяКолонки = "ПериодСценарий_"+НомерПериода+"_"+НомерСценария;
            
            ТекстКолонки = ТекстКолонки + "
                |    СУММА(ВЫБОР
                |        КОГДА БюджетОбороты.ПериодБюджетирования = &парамПериодБюджетирования" + номерПериода + "
                |            И БюджетОбороты.Сценарий = &парамСценарий" + НомерСценария + "
                |        ТОГДА БюджетОбороты.СуммаОборот
                |        ИНАЧЕ 0
                |    КОНЕЦ) КАК " + ИмяКолонки + ", ";
                
                
            
            НомерСценария = НомерСценария + 1;        
        КонецЦикла;
        
        ТекстКолонки = Лев(ТекстКолонки, СтрДлина(ТекстКолонки)-2);        //убрали последнюю запятую
4 Желтый домик
 
30.09.13
11:23
Ну так, на всякий случай, потом, конечно, абракадабру типа "ПериодСенарий_1_1" меняю в заголовке отчета на "Январь 2013, План"
5 Желтый домик
 
30.09.13
12:27
(1) Это только, если интерактивно.
6 Другая
 
30.09.13
12:30
"v8: Программное добавление параметров в СКД"
" В СКД запрос подменяю, остается задать параметры"
Так задать параметр или добавить?
7 Желтый домик
 
30.09.13
13:05
(6) Именно добавить. Этих параметров в схеме раньше не было, после измененния текста запроса набора данных появились новые параметры. С ними и воюю
8 Желтый домик
 
30.09.13
13:25
Вот решение

    ТекстЗапросаИерархия = ПолучитьТекстЗапросаИерархия();
    ТекстЗапросаРегистр = ПолучитьТекстЗапросаРегистр();
    
    Схема = ЭтотОбъект.СхемаКомпоновкиДанных;
    
    Схема.НаборыДанных.ИерархияСтатьи.Запрос = ТекстЗапросаИерархия;
    Схема.НаборыДанных.Регистр.Запрос = ТекстЗапросаРегистр;
    
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
    
    Настройки = Схема.НастройкиПоУмолчанию;
    ИойКомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    
    номерПериода = 1;
    Для Каждого стрПериод из спПериодов Цикл
        ПараметрКомпоновки = ИойКомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Добавить();
        ПараметрКомпоновки.Параметр = Новый ПараметрКомпоновкиДанных("парамПериодБюджетирования" + номерПериода);
        ПараметрКомпоновки.Использование = Истина;
        ПараметрКомпоновки.Значение = стрПериод;
        
        ПараметрСхемы = Схема.Параметры.Добавить();
        ПараметрСхемы.Значение = стрПериод;
        ПараметрСхемы.Имя = "парамПериодБюджетирования" + номерПериода;
        
        номерПериода = номерПериода + 1;
    КонецЦикла;    
    
    НомерСценария = 1;
    Для Каждого стрСценарий из спСценариев Цикл
        ПараметрКомпоновки = ИойКомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Добавить();
        ПараметрКомпоновки.Параметр = Новый ПараметрКомпоновкиДанных("парамСценарий" + НомерСценария);
        ПараметрКомпоновки.Использование = Истина;
        ПараметрКомпоновки.Значение = стрСценарий;
        
        ПараметрСхемы = Схема.Параметры.Добавить();
        ПараметрСхемы.Значение = стрСценарий;
        ПараметрСхемы.Имя = "парамСценарий" + НомерСценария;
        
        НомерСценария = НомерСценария + 1;        
    КонецЦикла;
    
    ИойКомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
    ИойКомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
    
    СхемаКомпоновкиДанных = Схема;
    
    Настройки = КомпоновщикНастроек.Настройки;
9 Другая
 
30.09.13
14:08
(7) а в процессе чего изменяется текст запроса? от каких-то настроек? может не менять его программно, а использовать средства СКД, или создать несколько схем и использовать необходимую.
Я так поняла не добавлять, после изменения запроса, а просто установить значение не вышло?
10 Желтый домик
 
30.09.13
14:16
(9) Не так.

Колонка это СуммаОборот по Периоду и Сценарию за этот период.

Таких периодов и сценариев - произвольное множество. В общем случае - 12 периодов и 2 сценария. Но в зависимости от желания пользователя период отчета, соответственно и количество колонок может меняться. Поэтому я и добавляю колонки программно (3).
11 Другая
 
30.09.13
15:32
эмм, произвольное количество периодов??? что-то явно идет не так)
а чем вас не устраивает группировка по колонкам? запрос без изменения текста с одним периодом, нужно только помучиться над настройками СКД. Там практически все можно настроить. В крайнем случае - нарисовать свой макет.

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

Но мне кажется выбранный вами путь - не самый лучший для решения задачи...
12 Желтый домик
 
01.10.13
15:14
(11) Может и не самый лучший, конечно. Но он позволяет мне не перерисовывать макет, не выводить итоги по колонкам Период и Сценарий, если бы они были группировками.
Программно добавить параметры - лишний 20 строк кода. знаю, что прорисовка группировок (2-х) в колонках сильно тормозила вывод макета в построителе. Думаю, в СКД наблюдалась бы та же картина с производительностью. А так - вывод обычных колонок - при выводе макета, ничего не рассчитывается. Достаточно быстро. Я уверенно говорю, потому что перепробывал все варианты колонок с замером производительности.
13 banco
 
01.10.13
15:39
(0)  может в схему компоновки данных надо параметры добавить?