|
СКД. Как программно узнать число группировок? | ☑ | ||
---|---|---|---|---|
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
|
||||
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 Как думаешь, твой код справится? Вряд ли... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |