![]() |
![]() |
![]() |
|
Макеты в СКД | ☑ | ||
---|---|---|---|---|
0
MoneG
15.10.08
✎
08:44
|
В продолжение темы v8: СКД Как закрепить шапку в отчете?.
Как и обещал, анализ свойства "Макет" для ЭлементаРезультата. Макеты именуются в порядке их вывода. А) Вычисление Шапки таблицы. "Структурные единицы" до шапки имеют по 2 макета: 1ый - макет с содержимым, 2ой - пустая завершающая строка. Например, структурная единица = Отбор: 1ый макет - содержит макеты "Отбор", "Номенклатура = "Телевизор""; 2ой макет - содержит макет пустой строки ТабДока. Поэтому можно упростить вычисление Шапки: //Узнать, есть ли Заголовок КолВоЭлементов = 0; Если (ВыводитьЗаголовок ИЛИ Заголовок) Тогда КолВоЭлементов = КолВоЭлементов + 1; КонецЕсли; //Узнать, если ли ПараметрыДанных Если ЕстьПараметрыДанных Тогда КолВоЭлементов = КолВоЭлементов + 1; КонецЕсли; //Узнать, если ли Отбор Если ЕстьОтбор Тогда КолВоЭлементов = КолВоЭлементов + 1; КонецЕсли; //2 - т.к. на каждую структурную единицу по 2 макета МакетШапки = "Макет"+(КолВоЭлементов *2 + 1); Пока Истина Цикл ЭлементРезультата = ПроцессорКомпоновки.Следующий(); Если ЭлементРезультата = Неопределено Тогда Прервать; Иначе //До вывода шапки Если ЭлементРезультата.Макет = МакетШапки И ТипЗнч(КомпоновщикНастроек.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда НачалоШапки = ЭлементыФормы.Результат.ВысотаТаблицы + 1; КонецЕсли; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); //После вывода шапки Если ЭлементРезультата.Макет = МакетШапки И ТипЗнч(КомпоновщикНастроек.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда ЭлементыФормы.Результат.ФиксацияСверху = ЭлементыФормы.Результат.ВысотаТаблицы; КонецЕсли; КонецЕсли; КонецЦикла; Б) Группировки,Детали. Для однозначной "идентификации" из параметров макета ЭлементаРезультата можно выцепить, какое именно поле выводится в данный момент. В общем случае структура параметров такова (для одного поля): Параметр1 - выражение, по которому будет вычисляться поле, Параметр2 - представление поле и его имя. Б.1. Неиерархические группировки. Количество полей = 1, Количество параметров = 2. Б.2. Иерархические группировки. Количество полей = 1, Количество параметров = 4 : Добаляется 2 параметра, описывающих уровень группировки. Б.3. Детали. Количество полей = N, Количество параметров = N*2. Например, можно создать структуру соответствий полей и их макетов, чтобы использовать ее затем при выводе: ПоляИМакеты = Новый Структура; Для Каждого Макет Из МакетКомпоновки.Макеты Цикл ЧислоПараметров = Макет.Параметры.Количество(); Попытка Если ЧислоПараметров = 2 Тогда //Неиерархическая группировка ИмяПоля = Макет.Параметры.П2.ВыраженияПолей[0].Поле; ПоляИМакеты.Вставить(ИмяПоля,Макет.Имя); ИначеЕсли ЧислоПараметров = 4 Тогда //Иерархическая группировка ИмяПоля = Макет.Параметры.П2.ВыраженияПолей[0].Поле; ПоляИМакеты.Вставить(ИмяПоля,Макет.Имя); Иначе //Детали Для Каждого Параметр Из Макет.Параметры Цикл //нужные действия КонецЦикла; КонецЕсли; Исключение КонецПопытки; КонецЦикла; //Цикл вывода ... Если ЭлементРезультата.Макет = ПоляИМакеты.МоеПоле Тогда //выполнить действия для МоеПоле КонецЕсли; ... Судите, пользуйтесь... P.S. Может, изобрел велосипед, т.к. книжку "Разработка сложных отчетов.." пока не читал. |
|||
1
zag2art
15.10.08
✎
09:07
|
(0) Напиши статейку в книгу знаний. Будет польза однозначно...
|
|||
2
MoneG
15.10.08
✎
09:20
|
(1) Ага, имеется.
|
|||
3
zag2art
15.10.08
✎
09:32
|
(3) Кстати и ЗуПовское решение ФиксацииСверху тоже неплохо было-бы в книгу знаний закинуть
|
|||
4
Garkin
15.10.08
✎
12:05
|
Хорошее начало
|
|||
5
Maxus43
15.10.08
✎
12:09
|
(0) вот, говорил же что есть за что зацепиться!
|
|||
6
Garkin
15.10.08
✎
16:07
|
2(0) (4)- это был намек, я требую продолжения банкета. :)
Хотелось бы иметь возможность определить строку (колонку) итогов, размеры и положение таблицы (первой, второй, третьей и т.д. ) |
|||
7
НичегоНеЗнаюВ1С
22.10.08
✎
12:53
|
(6)
А что значит определить? Опишите, пожалуйста, что именно, к примеру, хотелось бы сделать. |
|||
8
Garkin
22.10.08
✎
13:05
|
Ну к примеру, после вывода отчета
хотелось бы иметь информацию о табличном документе Область(1,1,2,15) - Заголовок Область(3,1,8,15) - Информация о отборе Область(9,1,10,15) - Информация о параметрах Область(11,1,60,30) - Таблица №1 Область(11,1,13,30) - Шапка Таблицы №1 Область(59,1,60,30) - Итоги Таблицы №1 Область(62,1,160,40) - Таблица №2 Область(62,1,64,40) - Шапка Таблицы №2 и т.д. |
|||
9
Garkin
22.10.08
✎
13:08
|
На всякий случай задача для которой это нужно,
моджет есть более элегантное решение: Вывести итоги на каждо |
|||
10
Garkin
22.10.08
✎
13:10
|
ааа, рука дрогнула, (9) не читать, читать здесь.
На всякий случай задача для которой это нужно, может есть более элегантное решение: Как вывести итоги по каждой странице? |
|||
11
НичегоНеЗнаюВ1С
22.10.08
✎
13:18
|
Универсальное решение предложить сейчас не смогу, но посмотреть какой-нибудь конкретный отчет могу попробовать.
Если да, то могу стукнуться в аську. |
|||
12
Garkin
22.10.08
✎
13:23
|
(11) Да не спасибо, я и сам все могу, вот лень только :)
|
|||
13
НичегоНеЗнаюВ1С
22.10.08
✎
13:28
|
(12)
А с универсальным решением трудность в том, что пока не достаточно накоплено знаний по СКД. Например, в моем отчете наименования макетов не ссответствуют тому алгоритму, который написан в (0): "//2 - т.к. на каждую структурную единицу по 2 макета" У меня почему-то так: Шапка - "Макет1" Каждая строка - "Макет2" Итоги - "Макет3" |
|||
14
Garkin
22.10.08
✎
13:33
|
Читай (0) внимательнее, "//2 - т.к. на каждую структурную единицу по 2 макета"
Это до шапки макета, у тебя просто нет ничего перед шапкой. |
|||
15
MoneG
24.10.08
✎
07:42
|
(6) Поскольку востребовано, то продолжим :)
Более глубокий анализ... показал: 1. В (0) пункт А) есть неточности, а именно: " "Структурные единицы" до шапки имеют по 2 макета: 1ый - макет с содержимым, 2ой - пустая завершающая строка. Например, структурная единица = Отбор: 1ый макет - содержит макеты "Отбор", "Номенклатура = "Телевизор""; 2ой макет - содержит макет пустой строки ТабДока." Читать как " "Структурные единицы" до шапки относятся к одному конкретному макету. При этом ДО шапки заводится Макет1 - начальный элемент (пустой) и МакетК - заверщающий элемент (пустая строка ТабДока), где К зависит от наличия ПараметровДанных и Отбора. ПроцессорВывода вставляет МакетК в нужные строки ТабДока, разбивая визуально "структурные единицы". При этом далее ДО шапки идет Макет итога по отчету в целом. В случае, когда СКД выводит только Таблицу, такой итог не имеет смысла и попросту не выводится. Однако, в многотабличном отчете (МТО) такой макет выводится. Поэтому применять ранее приведенный алгоритм для МТР нельзя." 2. Анализ МТО Рассмотрим наиболее полный случай. Имеется Заголовок Отчета, выводятся ПараметрыДанных, Отбор. в Отчет выводится несколько полей-таблиц (или диаграмм), а также поля-строки таблиц. Пусть выводится КК колонок ресурсов (для диаграмм только один). Тогда макеты элементов результата будут иметь следующую структуру: Таблицы ----------------------------------------------- Макет1 - Начальный элемент - пусто; Макет2 - Заголовок отчет. Содержит 2 макета - пустую строку ТабДока и ТекстЗаголока с оформлением Макет3 - ПараметрыДанных. Содержит столько макетов, сколько параметров данных + 1 - пустой. Каждый непустой макет имеет по 2 ячейки с названием и значением соответственно. Например, "Параметры данных: Дата = 01010001" разбивается на 2 ячейки - "Параметры данных:" и "Дата = 01010001". Макет4 - Завершающий элемент - пустая строка ТабДока. При выводе вставляется после Заголовка, затем после ПараметровДанных и(или) Отбора. Макет5 - Отбор. По аналогии с ПараметрамиДанных. Макет6 - Макет поля-таблицы верхнего уровня ПолейГруппировки. При этом: - кол-во макетов = кол-во строк (если есть папки колонок, то для каждой папки по макету) - кол-во параметров. На каждое поле приходится по 2 параметра - Представление и Значение: КолВоПараметров = 2*(КК+1), где 1 - параметр поля, по которому выводится таблица; Макет7 - Макет поля-таблицы нижнего уровня ПолейГруппировки. Аналогично макету ПолюГруппировки верхнего уровня, за исключением разве что шрифта (не жирный). ...... поля-таблицы могут иметь иерархическую структуру! ...... Макет9 - --//-- Макет10 - Макет итога по Отчету. Содержит КК макетов и КК параметров. При этом выводится в самом конце ТабДока и является его завершением. Макет11 - Макет шапки группировок полей-строк таблицы. Содержит столько макетов с оформлением, сколько группировок в строках выводится. Распологаются в порядке вывода. Макет12 - Макет шапки полей-колонок таблицы. Содержит как минимум 1 макет - Итого. Сюда же включаются макеты шапки папок ресурсов и макеты шапки ресурсов. Располагаются в порядке вывода. Макет13 - Макет неиерархической группировки в таблице. Содержит 2 параметра - Представление и Значение. .... Макет14 - Макет иерархической группировки в таблице. Содержит 4 параметра - Представление и Значение поля + 2 поля для подсчета уровня группировки. .... Макет16 - Макет деталей неирерхической группировки в таблице. Содержит 2*КК параметров. Макет17 - Макет деталей ирерхической группировки в таблице. Содержит 2*КК параметров. .... Макет19 - Макет деталей самой нижней группироки в таблице. Содержит 2*КК параметров. Диаграммы ---------------------------------------------- Макет1 - Макет5 - по аналогии с Таблицами. Макет6 - Макет поля-диаграммы верхнего уровня ПоляГруппировки. Содержит 3 макета: Поле-диаграмму верхнего уровня, Ресурс, Завершающий элемент - построчно. - Кол-во параметров = 2*(Поле-диаграмма + Ресурс). Макет7 - Макет поля-диаграммы нижнего уровня ПоляГруппировки. Содержит 3 макета: Поле-диаграмму нижнего уровня, Ресурс, Завершающий элемент - построчно. - Кол-во параметров = 2*(Поле-диаграмма + Ресурс). ..... Макет9 - --//-- Макет10 - Макет итога по Отчету. Содержит 2 макета (Итого,Ресурс) и 1 параметр - ресурс. При этом выводится в самом конце ТабДока и является его завершением. Макет12 - Макет непосредственно Диаграммы. При этом тип Макета = "МакетДиаграммыОбластиКомпоновкиДанных". Макет13 - Макет ресурса диаграммы. Содержит Значение ресурса и оформление и 2 параметра (Представление и Значение ресурса). Макет14 - Макет группировки диаграммы (серии диаграммы). Содержит Значение группировки и 2 параметра (Представление и Значение группировки). Макет15 - Макет группировки диаграммы с параметром расшифровки серии. Содержит 2 параметра (Представление и Значение серии (значение расшифровки)). Макет16 - Макет ресурса диаграммы с параметром расшифровки ресурса. Содержит 2 параметра (Представление и Значение ресурса (значение ресурса по текущей серии)). .... Макет18 - Повторяет Макет16 (по количеству серий диаграммы). Выводы ---------------------------------------------- 1) Зафиксировать шапку (как и повторять при печати) можно только для одной таблицы ТабДока, поэтому необходимо заранее и точно знать, к какой таблице это применять. Желательно, к самой первой, иначе ТабДок не будет прокручиваться (зафиксируется не видимая на экране строка). 2) Если при МТО требуется знать координаты таблиц (или имена их макетов), то необходимо вычислить число ПолейГруппировок СКД (не путать с группировками данных). Информация о ПоляхГруппировок содержится в "КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки". В случае однотабличного отчета ПолеГруппировки всего одно и имеет тип "ТаблицаКомпоновкиДанных", а в более общем случае (МТО) эта группировка "обвешивается" полями-таблицами (полями-диаграммами) с типом "ГруппировкаКомпоновкиДанных". При этом иерархия ПолейГруппировок составлена рекурсивно через свойство ".Структура[0]". Например: Функция ПолучитьКолВоПолейГруппировки(СтруктураНастроек) Если ТипЗнч(СтруктураНастроек) = Тип("ТаблицаКомпоновкиДанных") Тогда Возврат 0; КонецЕсли; Попытка НоваяСтруктураНастроек = СтруктураНастроек.Структура[0]; Исключение Возврат 0; КонецПопытки; Возврат (ПолучитьКолВоПолейГруппировки(НоваяСтруктураНастроек)+1); КонецФункции //Когда известно количество полей группировки, макет шапки вычисляется однозначно: МакетШапки = "Макет"+ //(КолВоЭлементов *2) = // (КолВоЭлементов *2) -1 // ПараметрыДанных и Отбор не разделяются пустым макетом // +1 // Пропустить Итог по Отчету (КолВоЭлементов *2 + ПолучитьКолВоПолейГруппировки(КомпоновщикНастроек.Настройки.Структура[0]) + //Перейти на следующий 1); 3) Для обращения к конкретным таблицам МТО уже после вывода Результата необходимо при выводе (например, как в (0) ) запоминать координаты таблиц в некую структуру данных. 4) Не пробовал, но уверен, при использовании вложенных отчетов любого рода Макеты родительского отчета генерируются описанным выше "способом". Судите, пробуйте, дополняйте... |
|||
16
Garkin
24.10.08
✎
08:52
|
(15) респект. Jсвобожусь почитаю :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |