Имя: Пароль:
1C
1С v8
Автоматическое добавление группировки в СКД
0 chingiz
 
13.10.11
10:21
Итак задача автоматически добавлять группировку Период в настройках последней группировкой. http://savepic.su/287794.jpg

Сложность в том, что мы не знаем точное количество группировок. Может быть 1 уровень, мб 3. Как проверять КомпоновщикНастроек.Настройки.Структура.ПоляГруппировки.Элементы, ведь каждая следующая уже будет КомпоновщикНастроек.Настройки.Структура.Получить(...).Структура и так далее.
1 Defender aka LINN
 
13.10.11
10:25
(0) Месье не слышал про рекурсию?
З.Ы. А если структура отчета сложная будет, куда побежишь?
2 chingiz
 
13.10.11
10:35
(1) нет сэр. Печально, что программирование начинаю с 1С. Подозревал, что нужно делать какой-то цикл. Ну группировки будут иметь примерно такой вид всегда, максимум пару группировок или их полей добавится. Ведь обходим Для каждого, так что все норм.
3 comp2006
 
13.10.11
10:52
Процедура УстановитьНастройкиКомпоновщика()
   КомпоновщикНастроек.Настройки.Структура.Очистить();
   Если ГруппироватьПоОрганизациям Тогда
       КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
   Иначе
       ГруппировкаКонтрагент = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
       ГруппировкаКонтрагент.Использование = Истина;
       ПолеКонтрагент = ГруппировкаКонтрагент.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
       ПолеКонтрагент.Использование = Истина;
       ПолеКонтрагент.Поле = Новый ПолеКомпоновкиДанных("Контрагент");
       
       ВыбранныеПоляДляКонтрагента = ГруппировкаКонтрагент.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
       ВыбранныеПоляДляКонтрагента.Использование = Истина;
       
       
       ГруппировкаДетальныеЗаписи = ГруппировкаКонтрагент.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
       ГруппировкаДетальныеЗаписи.Использование = Истина;
           
       ВыбранныеПоляДляДетальныхЗаписей = ГруппировкаДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
       ВыбранныеПоляДляДетальныхЗаписей.Использование = Истина;
       
   КонецЕсли;
КонецПроцедуры
4 chingiz
 
13.10.11
11:41
(3) еще раз (1) и поймешь, что твой пост неуместен :)

Сейчас пытаюсь сделать с рекурсией.
5 chingiz
 
13.10.11
14:07
Получилось! (1) навел на мысль, теперь хоть буду знать что это 8) Думаю кому-нибудь пригодится:

Процедура РекурсияПериод(Уровень)
   
   Флаг = Ложь;
   
   Для каждого ИндПериод из КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора.Элементы Цикл
       
       Если ИндПериод.Заголовок = "Период" Тогда
           
           ИндексПериод = КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора.Элементы.Индекс(ИндПериод);
           
       КонецЕсли;
       
   КонецЦикла;
   
   Для каждого Структура Из Уровень Цикл
       
       Если НЕ ТипЗнч(Структура) = Тип("ДиаграммаКомпоновкиДанных") тогда
           
           Флаг = Истина;
           
           Для Каждого ПолеГруппировки Из Структура.ПоляГруппировки.Элементы Цикл
               
               Если ПолеГруппировки.Поле = КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора.Элементы.Получить(ИндексПериод).Поле Тогда
                   
                   Возврат;
                   
               Иначе
                   
                   Если Структура.Структура.Количество() > 0 Тогда
                       
                       РекурсияПериод(Структура.Структура);
                       
                   Иначе
                       
                       НоваяГруппировка = Структура.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
                       НоваяГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
                       НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")).Поле = НоваяГруппировка.ПоляГруппировки.ДоступныеПоляПолейГруппировок.Элементы.Получить(ИндексПериод).Поле;
                       
                   КонецЕсли;
                   
               КонецЕсли;
               
           КонецЦикла;  
           
       ИначеЕсли НЕ Флаг Тогда
           
           НоваяГруппировка = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
           НоваяГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
           НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")).Поле = НоваяГруппировка.ПоляГруппировки.ДоступныеПоляПолейГруппировок.Элементы.Получить(ИндексПериод).Поле;
           
           Флаг = Истина;
           
       КонецЕсли;
       
   КонецЦикла;
   
КонецПроцедуры