Макеты в СКД Ключевые слова: Макет,ЭлементРезультата,СКД
Макеты именуются в порядке их вывода.
А) Вычисление Шапки таблицы.
"Структурные единицы" до шапки имеют по 2 макета: 1ый - макет с содержимым, 2ой - пустая завершающая строка. Например, структурная единица = Отбор:
1ый макет - содержит макеты "Отбор", "Номенклатура = "Телевизор"";
2ой макет - содержит макет пустой строки ТабДока.
Вычисление Шапки:
//Узнать, есть ли Заголовок
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("TitleOutput"));
ВыводитьЗаголовок = ((ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Title"));
Заголовок = ((ЗначениеПараметра.Значение <> "" ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
КолВоЭлементов = 0;
Если (ВыводитьЗаголовок ИЛИ Заголовок) Тогда
КолВоЭлементов = КолВоЭлементов + 1;
КонецЕсли;
//Узнать, если ли ПараметрыДанных
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("DataParametersOutput"));
ЕстьПараметрыДанных = ((ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
ЕстьПараметрыДанных = (ЕстьПараметрыДанных И КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Количество() > 0);
Если ЕстьПараметрыДанных Тогда
КолВоЭлементов = КолВоЭлементов + 1;
КонецЕсли;
//Узнать, если ли Отбор
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("FilterOutput"));
ЕстьОтбор = ((ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
ЕстьОтбор = (ЕстьОтбор И КомпоновщикНастроек.Настройки.Отбор.Элементы.Количество() > 0);
Если ЕстьОтбор Тогда
КолВоЭлементов = КолВоЭлементов + 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].Поле;
ПоляИМакеты.Вставить(ИмяПоля,Макет.Имя);
Иначе //Детали
Для Каждого Параметр Из Макет.Параметры Цикл
//нужные действия
КонецЦикла;
КонецЕсли;
Исключение КонецПопытки;
КонецЦикла;
//Цикл вывода
...
Если ЭлементРезультата.Макет = ПоляИМакеты.МоеПоле Тогда
//выполнить действия для МоеПоле
КонецЕсли;
...
//КонецЦикла; |