Книга знаний

1С:Предприятие / Приемы программирования / Встроенный язык

Макеты в СКД

Анализ свойства Макет ЭлементРезультатаКомпоновкиДанных. Что в нем есть и как работать.Автор статьи: MoneG
Последняя редакция №1 от 15.10.08
URL: http://kb.mista.ru/article.php?id=712

Ключевые слова: Макет,ЭлементРезультата,СКД


Макеты именуются в порядке их вывода.

А) Вычисление Шапки таблицы.


 "Структурные единицы" до шапки имеют по 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].Поле;
   ПоляИМакеты.Вставить(ИмяПоля,Макет.Имя);            
   Иначе //Детали

   Для Каждого Параметр Из Макет.Параметры Цикл
         //нужные действия

   КонецЦикла;        
   КонецЕсли;
   Исключение КонецПопытки;        
КонецЦикла;

//Цикл вывода

...
   Если ЭлементРезультата.Макет = ПоляИМакеты.МоеПоле Тогда
   //выполнить действия для МоеПоле

   КонецЕсли;
...
//КонецЦикла;

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика