Имя: Пароль:
1C
 
СКД - как повторять шапку таблицы на каждой странице - как узнать высоту?
0 RomaH
 
naïve
14.08.14
07:56
Как бы в СКД высота шапки зависит от настройки отчета
плюс еще могут выводится всякие заголовки таблицы, параметры и отборы

как узнать "Верх" для области данных в документе результате?
1 чувак
 
14.08.14
07:58
ТабДок.ВысотаТаблицы() ?
2 organizm
 
14.08.14
07:58
никак, СКД для этого не допилен, как обычно... делают, делают, но вот в мелочях так и не доделают...
3 RomaH
 
naïve
14.08.14
08:13
есть там такая штука как МакетКомпановки.Макеты
и у Макетов у которых "Параметры.Количество() = 0
как бы те самые которые выводятся перед областью данных
4 RomaH
 
naïve
14.08.14
08:16
http://www.dropmocks.com/mGx9Mb
вот такая вот фигня получилась - но работает
при каких условиях работать не будет?

или как понять какой макет для какой области отчета предназначен?
5 RomaH
 
naïve
14.08.14
08:34
на второй картинке - как бы есть возможность по типу элемента дерева определить, что это не область данных
т.е. если тип элемента - "МакетОбластиМакета..", то это макет над областью данных

только вот который куда ... с наибольшим индексом - шапка

ну естественно это все достоверно, только для вывода в одну таблицу
6 RomaH
 
naïve
15.08.14
09:23
ну так что насчет способа из (4)
не слишком кривой? как улучшить?
7 Kalambur
 
15.08.14
09:31
у Макета имя есть?
8 RomaH
 
naïve
15.08.14
09:57
(7) У какого макета - на скринах все видно, вроде
9 Cube
 
15.08.14
10:00
(2) Сам придумал?
10 Cube
 
15.08.14
10:01
(0) Большую красную букву "Я" справа от заголовка темы нажми...
11 Cube
 
15.08.14
10:14
Эх, доброта моя... Я делаю так:


    Попытка
        
        НачалоШапки = 1;
        ВысотаШапки = 0;
        
        //Заголовок
        ЗаголовокСКД = КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("Заголовок");
        ВыводитьЗаголовокСКД = КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок");
        Если (ВыводитьЗаголовокСКД.Использование И ((ВыводитьЗаголовокСКД.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто И ЗаголовокСКД.Использование) ИЛИ ВыводитьЗаголовокСКД.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить)) ИЛИ (НЕ ВыводитьЗаголовокСКД.Использование И ЗаголовокСКД.Использование) Тогда
            НачалоШапки = НачалоШапки + 2;
        КонецЕсли;
        
        //ПараметрыДанных
        ЕстьПараметрыДанныхСКД = Ложь;
        ВыведеныПараметрыДанныхСКД = Ложь;
        Для Каждого ПараметрДанныхСКД Из КомпоновщикНастроек.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы Цикл
            Если ПараметрДанныхСКД.Видимость Тогда
                ЕстьПараметрыДанныхСКД = Истина;
            КонецЕсли;
        КонецЦикла;
        ВыводитьПараметрыДанныхСКД = КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьПараметрыДанных");
        Если (ВыводитьПараметрыДанныхСКД.Использование И ((ВыводитьПараметрыДанныхСКД.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто И ЕстьПараметрыДанныхСКД) ИЛИ ВыводитьПараметрыДанныхСКД.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить)) ИЛИ (НЕ ВыводитьПараметрыДанныхСКД.Использование И ЕстьПараметрыДанныхСКД) Тогда
            НачалоШапки = НачалоШапки + 2;
            ВыведеныПараметрыДанныхСКД = Истина;
        КонецЕсли;
        
        //Отбор
        ОтборСКД = КомпоновщикНастроек.Настройки.Отбор.Элементы;
        ВыводитьОтборСКД = КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьОтбор");
        Если (ВыводитьОтборСКД.Использование И ((ВыводитьОтборСКД.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто И ОтборСКД.Количество() > 0) ИЛИ ВыводитьОтборСКД.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить)) ИЛИ (НЕ ВыводитьОтборСКД.Использование И ОтборСКД.Количество() > 0) Тогда
            НачалоШапки = НачалоШапки + 1;
            Если НЕ ВыведеныПараметрыДанныхСКД Тогда
                НачалоШапки = НачалоШапки + 1;
            КонецЕсли;
        КонецЕсли;
        
        //Отступ сверху
        Если НачалоШапки > 1 Тогда
            НачалоШапки = НачалоШапки + 1;
        КонецЕсли;
        
        //Получаем высоту шапки
        ТекущаяСтруктура = КомпоновщикНастроек.Настройки.Структура;
        Если ТекущаяСтруктура.Количество() > 0 И ТекущаяСтруктура[0].Использование Тогда
            Если Тип(ТекущаяСтруктура[0]) = Тип("ТаблицаКомпоновкиДанных") И ТекущаяСтруктура[0].Строки.Количество() > 0 Тогда
                ТекущаяСтруктура = ТекущаяСтруктура[0].Строки;
            Иначе
                ВысотаШапки = ВысотаШапки + 1;
            КонецЕсли;
            Для Сч = 0 По 20 Цикл
                ТекущаяСтруктура = ТекущаяСтруктура[0].Структура;
                Если ТекущаяСтруктура.Количество() > 0 И ТекущаяСтруктура[0].Использование Тогда
                    ВысотаШапки = ВысотаШапки + 1;
                Иначе
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
        
        ЭлементыФормы.Результат.ПовторятьПриПечатиСтроки = ЭлементыФормы.Результат.Область(НачалоШапки, , НачалоШапки + ВысотаШапки);
        
    Исключение
    КонецПопытки;
12 RomaH
 
naïve
15.08.14
10:19
продублирую сюда:

v8: СКД Как закрепить шапку в отчете?

MoneG

кроме заголовка еще могут быть параметры, отборы.. пусть ситуация, когда перед таблицей нет никаких диаграмм и еще чего-то, тогда можно пользоваться этим:


    ЕстьЗаголовок = (ВыводитьЗаголовок ИЛИ Заголовок);
    ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("DataParametersOutput"));
    ЕстьПараметрыДанных = ((ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
    ЕстьПараметрыДанных = (ЕстьПараметрыДанных И КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Количество() > 0);
    
    ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("FilterOutput"));
    ЕстьОтбор = ((ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
    ЕстьОтбор = (ЕстьОтбор И КомпоновщикНастроек.Настройки.Отбор.Элементы.Количество() > 0);
    
    ТаблицаЗафиксирована = Ложь;
    Пока Истина Цикл
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
        
        Если ЭлементРезультата = Неопределено Тогда
            Прервать;
        Иначе            
            //Обработка фиксации шапки

            
            ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
            
            //Начало и Вертикально = столько раз, сколько перед шапкой элементов

            Если ЭлементРезультата.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.Начало
                И ЭлементРезультата.РасположениеВложенныхЭлементов = РасположениеВложенныхЭлементовРезультатаКомпоновкиДанных.Вертикально

               И ЭлементРезультата.ЗначенияПараметров.Количество() = 0 Тогда

                Если ЕстьЗаголовок Тогда
                    НачалоШапки = ЭлементыФормы.Результат.ВысотаТаблицы;
                    ЕстьЗаголовок = Ложь;
                    Продолжить;
                КонецЕсли;
                
                Если ЕстьПараметрыДанных Тогда
                    НачалоШапки = ЭлементыФормы.Результат.ВысотаТаблицы;
                    ЕстьПараметрыДанных = Ложь;
                    Продолжить;
                КонецЕсли;
                
                Если ЕстьОтбор Тогда
                    НачалоШапки = ЭлементыФормы.Результат.ВысотаТаблицы;
                    Естьотбор = Ложь;
                КонецЕсли;
            КонецЕсли;    
        КонецЕсли;
    КонецЦикла;
    
    ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры

оно?
13 RomaH
 
naïve
15.08.14
10:21
(11) а почему решил рассчитывать из количества параметров, а не при выводе результата?
14 RomaH
 
naïve
15.08.14
10:22
и согласись - код из (4) намного прозрачнее и проще, чем в (12) и (13)
15 RomaH
 
naïve
15.08.14
10:23
+(14) ведь программный вывод отчета в любом случае описывать, вроде?
16 Cube
 
15.08.14
10:24
(13) Маеты в 90% случаев не делаю... Твой код работать не будет без макетов...
17 Cube
 
15.08.14
10:24
(16) "Маеты" = "Макеты"
18 RomaH
 
naïve
15.08.14
10:26
(16) что значит макеты не делаешь?
щас покажу весь код
19 Cube
 
15.08.14
10:29
(15) Нет, можешь код из (11) вставить в ПриКомпоновкеРезультата() заменив ЭлементыФормы.Результат на ДокументРезультат и всё будет работать...
Конечно, код не идеален, но оттолкнуться от него можно.
20 RomaH
 
naïve
15.08.14
10:30
http://www.dropmocks.com/mGx9Mb
третья картинка
21 RomaH
 
naïve
15.08.14
10:35
http://www.dropmocks.com/mGx9Mb
четвертый скрин
вот и весь код
единственное, он не будет работать на нескольких таблицах
нужны проверки на их наличие, и на наличие диаграмм

но, ИМХО, он более читабельный чем (11) или (12)
вопрос - насколько он достоверные результаты дает
22 Cube
 
15.08.14
10:37
(21) Хз, попробуй так, если косяков не будет - отпишись для истории :)
23 RomaH
 
naïve
15.08.14
11:01
24 RomaH
 
naïve
15.08.14
11:01
"http://www.dropmocks.com/mG0BB-"; - ссылка с дефисом на конце
25 Cube
 
15.08.14
11:10
(23) А почему не вставить код сюда? Тебе надо было скринфош в архив положить и на файлообменник с паролем выложить... :)
26 Cube
 
15.08.14
11:10
(25) Че-то сегодня очепяток много... "скринфош" читать как "скриншот"
27 RomaH
 
naïve
15.08.14
11:18
(25) делаю через РДП где копипаст запрещен
28 RomaH
 
naïve
15.08.14
11:25
в (24) код не рабочий для таблиц
29 RomaH
 
naïve
18.08.14
08:24
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    КомпановщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    МакетКомпановки = КомпановщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);
    
    //фиксировать шапку можно только для ОДНОЙ таблицы или группировки
    КоличествоТаблиц = 0;
    ВысотаШапки = 0;
    ВерхОбластиДанных = 1;
    
    Для Каждого ЭлементТела из МакетКомпановки.Тело Цикл
        
        ТипЭлементаТела = ТипЗнч(ЭлементТела);
        
        Если ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных")
            ИЛИ ТипЭлементаТела = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда //Тут надо уточнить что значат другие типы в теле макета
            КоличествоТаблиц = КоличествоТаблиц + 1;
        ИначеЕсли ТипЭлементаТела <> Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
            КоличествоТаблиц = 99;
        КонецЕсли;
        
        Если КоличествоТаблиц > 1 Тогда
            Прервать;
        КонецЕсли;
        
        Если ТипЭлементаТела = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
            ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.Макет].Макет.Количество();
            ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;
        ИначеЕсли ТипЭлементаТела = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
            ВысотаШапки = МакетКомпановки.Макеты[ЭлементТела.МакетШапки].Макет.Количество();
            ВерхОбластиДанных = ВерхОбластиДанных + ВысотаШапки;    
        КонецЕсли;
        
    КонецЦикла;
    
    Если КоличествоТаблиц = 1 Тогда
        ДокументРезультат.ПовторятьПриПечатиСтроки = ДокументРезультат.Область(ВерхОбластиДанных - ВысотаШапки,,ВерхОбластиДанных-1,);
    КонецЕсли;
    
КонецПроцедуры