Имя: Пароль:
1C
1С v8
СКД. Как программно узнать число группировок?
0 napagokc
 
15.11.12
13:03
1С8.2.13
Хочу зафиксировать шапку в отчете, но используя стандартную кнопку "Сформировать".
Обрабатываю событие:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
   КолвоОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы.Количество() + 2; // +2 на ячейку сверху и снизу
   Шапка = 9; // <-- как узнать программно глубину группировок?
   ДокументРезультат.ФиксацияСверху = КолвоОтбор + Шапка;
КонецПроцедуры

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

[url=http://www.fotolink.su/v.php?id=e9e83da9ff019e8906fecd2f359dc6e0]
[img]http://www.fotolink.su/pic_s/e9e83da9ff019e8906fecd2f359dc6e0.gif[/img][/url]
1 napagokc
 
15.11.12
13:04
вот верная ссылка скрина:

http://www.fotolink.su/pic_s/e9e83da9ff019e8906fecd2f359dc6e0.gif
2 Cube
 
15.11.12
13:05
3 acsent
 
15.11.12
13:05
так сама же фиксируется
4 napagokc
 
15.11.12
13:07
(3) С 8.2.14 сама фиксируется, а у меня 8.2.13
5 napagokc
 
15.11.12
13:07
(2) Я тебе прямые ссылки могу дать, но там нет ответа на мой вопрос. Вчитайся сначала, а потом говори баян или нет
6 abjurer
 
15.11.12
13:12
Процедура СформироватьОтчет(Кнопка)
   Настройки = КомпоновщикНастроек.Настройки;
   ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
   // Инициализируем процессор СКД
   ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
   ЭлементыФормы.Результат.Очистить();
   // Инициализируем процессор вывода
   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
   
   
   //Обозначим начало вывода
   ПроцессорВывода.НачатьВывод();
   ТаблицаЗафиксирована = Ложь;
   ФиксацияСверху = 0;
   
   НастройкиВыводаИтогов = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВертикальноеРасположениеОбщихИтогов"));
   ИтогиРасположеныВверху =
       (
        НастройкиВыводаИтогов.Значение = РасположениеИтоговКомпоновкиДанных.Начало
       ИЛИ
        НастройкиВыводаИтогов.Значение = РасположениеИтоговКомпоновкиДанных.НачалоИКонец
       )
       И
        НастройкиВыводаИтогов.Использование = Истина
       ;
   //Основной цикл вывода отчета
   Пока Истина Цикл
       ОбработкаПрерыванияПользователя();
       //Получим следующий элемент результата компоновки
       ЭлементРезультата = ПроцессорКомпоновкиДанных.Следующий();
       Если ЭлементРезультата = Неопределено Тогда
           //Следующий элемент не получен - заканчиваем цикл вывода
           Прервать;
       Иначе
           // Зафиксируем шапку
           Если Не ТаблицаЗафиксирована
               И ЭлементРезультата.ЗначенияПараметров.Количество() > 0
               И ТипЗнч(КомпоновщикНастроек.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда
               ТаблицаЗафиксирована = Истина;
               ФиксацияСверху = ЭлементыФормы.Результат.ВысотаТаблицы + ?(ИтогиРасположеныВверху, 1, 0);
           КонецЕсли;
           //Элемент получен - выведем его при помощи процессора вывода
           ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
       КонецЕсли;
   КонецЦикла;
   //Обозначем завершение вывода
   ПроцессорВывода.ЗакончитьВывод();
   ЭлементыФормы.Результат.ФиксацияСверху = ФиксацияСверху;
КонецПроцедуры

Писано для принудительной фиксации строки итогов, но этот кусок (ИтогиРасположеныВверху) убери и будет щастье.
7 napagokc
 
15.11.12
13:15
(6) Еще раз: "..используя стандартную кнопку "Сформировать"."

Ваш вариант подходит при замене стандартной кнопки своей собственной. Этот вариант я знаю, но как раз не хочу его использовать. Вопрос заключается в том, как добиться желаемого по-минимому прилагая собственных усилий.
Думаю, это всем полезно будет
8 napagokc
 
15.11.12
13:16
В принципе, если всегда точно знаешь количество группировок, то вполне подходит приведенный мной выше код: вне зависимости от числа отбора он будет верно фиксировать шапку
9 napagokc
 
15.11.12
13:17
Да, чтобы не постили подобные (6) ссылки дальше, сразу приведу прямую ссылку с разбором этой проблемы на 1ССКД:
http://1cskd.ru/2010/07/fiksaciya-strok-kolonok-v-skd/
10 Cube
 
15.11.12
13:18
(5) Я тебе тоже могу прямых ссылок дать, но лень одолевает меня. Вон (6) уже пожевал тебе... А на счет стандартной кнопки - так положи код из (6) в ПриКомпоновкеРезультата() если сам не догадался...
11 ДемонМаксвелла
 
15.11.12
13:21

Процедура ПолучитьВсеПоляГруппировок(МассивПолейГруппировок)

Для Каждого Стр Из КомпоновщикНастроек.Настройки.Структура Цикл
       
Для Каждого ПолеГруппировки Из Стр.ПоляГруппировки.Элементы Цикл
Если ПолеГруппировки.Использование=Истина Тогда
               МассивПолейГруппировок.Добавить(Строка(ПолеГруппировки.Поле));
КонецЕсли;
КонецЦикла;
       
       ДобавитьВсеПодчиненныеПоляВМассив(Стр,МассивПолейГруппировок);    
       
КонецЦикла;    
   
КонецПроцедуры


Процедура ДобавитьВсеПодчиненныеПоляВМассив(Строка,МассивПолейГруппировок)
   
КоллекцияСтрок = Строка.Структура;    
   
Для Каждого Стр Из КоллекцияСтрок Цикл
Если Стр.Использование=Истина Тогда
           
Для Каждого ПолеГруппировки Из Стр.ПоляГруппировки.Элементы Цикл
Если ПолеГруппировки.Использование=Истина Тогда
                   МассивПолейГруппировок.Добавить(Строка(ПолеГруппировки.Поле));
КонецЕсли;
КонецЦикла;
           
           ДобавитьВсеПодчиненныеПоляВМассив(Стр,МассивПолейГруппировок);    
КонецЕсли;
КонецЦикла;    
   
КонецПроцедуры
12 ДемонМаксвелла
 
15.11.12
13:22
так можно обойти все группировки, если немного допилить, то можно вычислить глубину
13 napagokc
 
15.11.12
13:22
(10) Понимаешь в чем дело... Количество группировок всяко где-то хранится в настройках СКД. И если это так, то мне достаточно одной строчки кода, которая, к слову, будет не только более читабельной, но и быстрее работать. Вот этого я и хочу добиться. А писать цикл не хочу. Знаю, что можно им, но не хочу. Все должно быть просто, надо только узнать где это все хранится...
14 napagokc
 
15.11.12
13:24
(11) А точно нет какого-нибудь свойства, типа "Количество()"? Печалька ;(
15 Cube
 
15.11.12
13:24
(13) Если б искал в поиске, то понял бы, что нет такого волшебного хранилища высоты шапки... Нету...
16 Cube
 
15.11.12
13:24
+(15) Поэтому я и сказал, что баян.
17 napagokc
 
15.11.12
13:24
(15) Я про группировку спрашивал, а не про шаку. Ога?
18 ДемонМаксвелла
 
15.11.12
13:25
(14) там структура, элементами которой могут быть структуры. так что надо обходить, и проверять использование.
19 acsent
 
15.11.12
13:25
КомпоновщикНастроек.Настройки.Структура - дерево группировок
20 napagokc
 
15.11.12
13:25
фигово. Ясно, спасибо.
21 napagokc
 
15.11.12
13:52
Так вот, граждане! Вы не верили, а я допилил:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
   КолвоОтбор = ?(КомпоновщикНастроек.Настройки.Отбор.Элементы.Количество(), КомпоновщикНастроек.Настройки.Отбор.Элементы.Количество() + 2, 0);
   КолвоГрупп = ПолучитьЧислоГруппировокШапки(КомпоновщикНастроек.Настройки.Структура);
   ДокументРезультат.ФиксацияСверху = КолвоОтбор  + КолвоГрупп ;
КонецПроцедуры

Функция ПолучитьЧислоГруппировокШапки(СтруктураКомпоновщика)
   Рез = 0;
   Для каждого стр Из СтруктураКомпоновщика Цикл
       Рез = ПолучитьЧислоГруппировокШапки(стр.Структура) + 1;
   КонецЦикла;
   Возврат Рез;
КонецФункции

Получилось довольно компактненько =)
22 Cube
 
15.11.12
13:57
(21) Да-да, а я в доступных полях папок насоздаю, вот весело будет...
23 Cube
 
15.11.12
13:57
+(22) Точнее в выбранных полях.
24 napagokc
 
15.11.12
13:58
(22) Код рабочий, можешь проверить по отладчику. Все верно считает. Доступные поля я не смотрю, если что
25 napagokc
 
15.11.12
14:01
+(24) Может быть добавлена отдельная статическая группировка, например, для вывода названия отчета и периода. Но она всегда имеет фиксированную глубину.
Я ее не учитываю в функции, но можно и с ней допилить, так-то. Одну строчку добавить.
26 ДемонМаксвелла
 
15.11.12
14:07
(21) но это не глубину он у тебя считает, а общее число группировок. хотя видимо тебе это и нужно.
27 ДемонМаксвелла
 
15.11.12
14:09
и ты флаг "Использование" не учитываешь. Если его снять у одной из верхних группировок, то твоя функция покажет больше группировок, чем выведется в отчете.
28 napagokc
 
15.11.12
14:56
(27) Да, ты прав, этот флаг я не учел. Исправил. Заодно добавил учет отдельной статической группировки в одну строчку.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
   КолвоОтбор = ?(КомпоновщикНастроек.Настройки.Отбор.Элементы.Количество(), КомпоновщикНастроек.Настройки.Отбор.Элементы.Количество() + 2, 0);
   КолвоГрупп = ПолучитьЧислоГруппировокШапки(КомпоновщикНастроек.Настройки.Структура);
   ДокументРезультат.ФиксацияСверху = КолвоОтбор + КолвоГрупп;
КонецПроцедуры

Функция ПолучитьЧислоГруппировокШапки(СтруктураКомпоновщика)
   Рез = 0;
   СчетчикИтераций = 0;
   Для каждого стр Из СтруктураКомпоновщика Цикл
       СчетчикИтераций = СчетчикИтераций + 1;
       Если НЕ стр.Использование Тогда
           Прервать;
       КонецЕсли;
       Рез = ПолучитьЧислоГруппировокШапки(стр.Структура) + 1;
   КонецЦикла;
   Возврат ?(СчетчикИтераций > 1, СчетчикИтераций + Рез, Рез);
КонецФункции

В цикле использую "Прервать" потому, что если отключить одну группировку, то все группировки, входящие в нее, тоже отключаются.
29 ДемонМаксвелла
 
15.11.12
15:49
(28) тогда не Прервать, а Продолжить.
30 Cube
 
16.11.12
05:24
(28) Ну, во первых, на платформе 8.2.16.368 не фурычит (разбираться не стал).

А во вторых, то, про что я говорил в (22) демонстрирую на примере: http://storage3.static.itmages.ru/i/12/1116/h_1353028930_5478384_6817aa1336.jpeg
Как думаешь, твой код справится? Вряд ли...