Имя: Пароль:
1C
 
СКД Как закрепить шапку в отчете?
0 zag2art
 
09.10.08
10:27
сабж
1 zag2art
 
09.10.08
10:45
Вопрос снимается
2 Иа58
 
09.10.08
12:14
Почему?
3 zag2art
 
14.10.08
12:24
(2) Разобрался
4 Гаркин
 
14.10.08
12:38
(3) разобрался сам, поделись с общественностью, не будь жлобом.
5 MoneG
 
14.10.08
12:50
Ну руками если, то так:

   ТабДок = ЭлементыФормы.Результат;
   
   Область = ТабДок.НайтиТекст("НазваниеСамойНижнейКолонки");
   Если Область = Неопределено Тогда
       Возврат;
   КонецЕсли;
   
   ТабДок.ФиксацияСверху = Область.Низ+1;
6 zag2art
 
14.10.08
12:52
Процедура ПриОткрытии()
   ЭлементыФормы.Результат.ФиксацияСверху = 10;
КонецПроцедуры
7 MoneG
 
14.10.08
12:54
(6) а если юзер добавил еще одну группировку? или установил отбор (уже после ПриОткрытии()) ?
8 MoneG
 
14.10.08
13:01
В продолжение темы: как грамотно повторять шапку таблицы при печати?
9 Maxus43
 
14.10.08
13:02
всмысле грамотно?
10 MoneG
 
14.10.08
13:04
(9) в смысле "в плюсах" СКД: "отчет без программирования". Иными словами, без дополнительного исхищрения кодом.
11 MoneG
 
14.10.08
13:09
Суть в том, что "глобальный" принцип СКД исключает автоматическую фиксацию шапки таблицы (или ее повторение при печати), поскольку в один ТабДок может быть выведено N таблиц, K диаграмм, а в таблицах еще и M вложенных отчетов... Хотелось бы, чтобы в дальнейшей появилась некая галочка типа
\/ "Фиксировать шапку таблиц".
12 Гаркин
 
14.10.08
13:10
(5) тоже выход так себе.
"НазваниеСамойНижнейКолонки" - как определить это название?
(Анализировать структуру не предлагать. :) )
13 Maxus43
 
14.10.08
13:11
(11) точно не скажу, но ИМХО, всё делается через ФиксацияСверху, ибо если глянуть в типовые (ЗУП 2.5 например), то в общем модуле типовых отчётов можно найти например:
Результат.ФиксацияСверху = Результат.ВысотаТаблицы;
СКД не делает это сама...
14 MoneG
 
14.10.08
13:13
(12) согласен полностью. такой код работает только в надежде на "праворукость" пользователя. Если ж он где-то интерактивно задал свое название - усё.. фиксация поплыла. Однако - как еще "выкрутиться" ?
15 Гаркин
 
14.10.08
13:17
Подозреваю что крутить надо процесор вывода, вот только руки не доходят.
16 MoneG
 
14.10.08
13:18
(15) щас покручу..
(13) Результат.ФиксацияСверху = Результат.ВысотаТаблицы;
не знаю, в каком это контексте.. однако, самый низ таблицы зачем фиксировать?
17 Maxus43
 
14.10.08
13:21
(16) надо покопать типовую, ИМХО - находит певую секцию выводимую, которая = шапке...
18 MoneG
 
14.10.08
13:23
(17) ВысотаТаблицы (хоть ИМХО, хоть нет) есть кол-во строк в ТабДоке, то есть ну никак не "=шапке".
19 Maxus43
 
14.10.08
13:34
(18) в типовую глянь сначала хоть... полный код:
       Пока Истина Цикл
           
           ОбработкаПрерыванияПользователя();
           //Получим следующий элемент результата компоновки
           ЭлементРезультата = ПроцессорКомпоновки.Следующий();
           
           Если ЭлементРезультата = Неопределено Тогда
               //Следующий элемент не получен - заканчиваем цикл вывода
               Прервать;
               
           Иначе
               
               // Зафиксируем шапку
               Если Не ОтчетОбъект.РасширеннаяНастройка
                   И Не ТаблицаЗафиксирована
                   И ЭлементРезультата.ЗначенияПараметров.Количество() > 0
                   И ТипЗнч(ОтчетОбъект.КомпоновщикНастроек.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда
                   ТаблицаЗафиксирована = Истина;
                   Результат.ФиксацияСверху = Результат.ВысотаТаблицы;
               КонецЕсли;
               
               //Элемент получен - выведем его при помощи процессора вывода
               ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
               
           КонецЕсли;
           
       КонецЦикла;
20 MoneG
 
14.10.08
13:47
(19) Ага. Только через Количество параметров у элемента результата можно "зацепиться" + вести учет, чтобы Итоги таблицы не зафиксировать (ТаблицаЗафиксирована=Истина). Вопрос про фиксацию закрыт, спасибо!
Что делать с печатью в уже выведенный ТабДок?
21 Maxus43
 
14.10.08
14:11
>> Что делать с печатью в уже выведенный ТабДок?
Всмысле?)
22 MoneG
 
14.10.08
14:15
(21) в смысле (8)
23 Maxus43
 
14.10.08
14:27
(22) СП отменили?
ТабличныйДокумент (SpreadsheetDocument)
ПовторятьПриПечатиСтроки (RepeatOnRowPrint)
Использование:
Чтение и запись.
Описание:
Тип: ОбластьЯчеекТабличногоДокумента. Содержит область строк, которая будет повторяться при печати каждого нового листа табличного документа.
Сериализуется.
24 Maxus43
 
14.10.08
14:27
(23) соответственно можно вписать это в (19), т.к. там границы шапки выявлены
25 MoneG
 
14.10.08
14:30
(24) покажи эти границы, а именно:
ОбластьШапки = Результат.Область(Верх,Лево,Низ,Право);

Лево = 1;
Низ  = Результат.ФиксацияСверху - 1;
Право= Результат.ШиринаТаблицы;

Верх ??
26 Maxus43
 
14.10.08
15:58
(25) думать надо... явно нет, вычисли как нить, или по умолчанию поставь что то типа верх  = Результат.ФиксацияСверху - 4;
ХЗ короче
27 MoneG
 
14.10.08
16:02
(26) :(7) - не надо по умолчанию. Более того, желательно некий метод БЕЗ рук!
28 Maxus43
 
14.10.08
16:05
(27) перед выводом проверь сколько группировок в компановщике, этим вычислиш количество строк.
29 MoneG
 
14.10.08
16:07
(28) не катит. кол-во группировок не всегда равно кол-ву строк в шапке.
P.S. "вычислиш" с мягким знаком.
30 Maxus43
 
14.10.08
16:14
(29) Программно убери "заголовок" отчёта, ибо не нужен он нафиг на практике, Нижняя граница известна, верхняя становится тоже известна.
З.Ы. Думай сам немного, можно найти за что зацепиться.
32 Garkin
 
14.10.08
17:17
Многие проблемы решались бы гораздо проще если бы "ЭлементРезультата" позволял определять что он выводит  (Заголовок, Шапку, Группировку, детальную запись и тд.) Штатных сбособов определить это как я понимаю нет, но сдругой стороны у ЭлементаРезультата есть свойство "Макет", которое при наличии определенной доли смекалки позволяет определить что в данный момент выводится в табличное поле.

Может у кого нибудь есть время и желание войти в историю как автору функции заменяющей "определенную долю смекалки" ?
33 MoneG
 
14.10.08
17:42
(32) Про Макет прекрасная идея, но в макете не за что зацепиться, к сожалению. В коллекции Макетов макеты привязаны к элементам результата, опять же, а не к строкам.

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

перем НачалоШапки;

Процедура ДействияФормыПечать(Кнопка)
   ТабДок = ЭлементыФормы.Результат;
           
   Низ   = ТабДок.ФиксацияСверху;
   Верх  = НачалоШапки+1;
   Право = ТабДок.ШиринаТаблицы;
   ТабДок.ПовторятьПриПечатиСтроки = ТабДок.Область(Верх,1,Низ,Право);
   
   ТабДок.АвтоМасштаб = Истина;
   ТабДок.Напечатать();
КонецПроцедуры

Процедура ДействияФормыСформировать(Кнопка)
       
   НачалоШапки = 0;
   //    ....    
   ПроцессорВывода.НачатьВывод();
   
   //Сколько чего до шапки
   ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("TitleOutput"));
   ВыводитьЗаголовок = ((ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
   ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Title"));
   Заголовок = ((ЗначениеПараметра.Значение <> "" ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
   ЕстьЗаголовок = (ВыводитьЗаголовок ИЛИ Заголовок);
   
   ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("DataParametersOutput"));
   ЕстьПараметрыДанных = ((ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
   ЕстьПараметрыДанных = (ЕстьПараметрыДанных И КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Количество() > 0);
   
   ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("FilterOutput"));
   ЕстьОтбор = ((ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить ИЛИ ЗначениеПараметра.Значение = ТипВыводаТекстаКомпоновкиДанных.Авто) И ЗначениеПараметра.Использование);
   ЕстьОтбор = (ЕстьОтбор И КомпоновщикНастроек.Настройки.Отбор.Элементы.Количество() > 0);
   
   ТаблицаЗафиксирована = Ложь;
   Пока Истина Цикл
       ЭлементРезультата = ПроцессорКомпоновки.Следующий();
       
       Если ЭлементРезультата = Неопределено Тогда
           Прервать;
       Иначе            
           //Обработка фиксации шапки
           
           ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
           
           //Начало и Вертикально = столько раз, сколько перед шапкой элементов
           Если ЭлементРезультата.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.Начало
               И ЭлементРезультата.РасположениеВложенныхЭлементов = РасположениеВложенныхЭлементовРезультатаКомпоновкиДанных.Вертикально
               И ЭлементРезультата.ЗначенияПараметров.Количество() = 0 Тогда
               Если ЕстьЗаголовок Тогда
                   НачалоШапки = ЭлементыФормы.Результат.ВысотаТаблицы;
                   ЕстьЗаголовок = Ложь;
                   Продолжить;
               КонецЕсли;
               
               Если ЕстьПараметрыДанных Тогда
                   НачалоШапки = ЭлементыФормы.Результат.ВысотаТаблицы;
                   ЕстьПараметрыДанных = Ложь;
                   Продолжить;
               КонецЕсли;
               
               Если ЕстьОтбор Тогда
                   НачалоШапки = ЭлементыФормы.Результат.ВысотаТаблицы;
                   Естьотбор = Ложь;
               КонецЕсли;
           КонецЕсли;    
       КонецЕсли;
   КонецЦикла;
   
   ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
34 MoneG
 
14.10.08
17:51
(30) кстати... а как "программно" убрать Заголовок ?
35 Garkin
 
14.10.08
17:55
(33) в макете не надо ни к чему цепляться. Платформа строит и нумерует макеты исходя из структуры настройки, необходимости выводить заголовок, параметры, отборы и т.д. Надо просто проанализировать тоже самое программно, и мы будем знать какой макет за что отвечает. Что ты в (33) фактически пытаешься делать, осталось направить энергию в нужное русло?
36 Garkin
 
14.10.08
17:56
+(35) "русло?" читать как "русло. :)"
37 MoneG
 
14.10.08
17:59
смотрел программно, что с макетами творится... Для Заголовка, например, ИмяМакета = "Макет2", а для ПараметровДанных - "Макет4","Макет3". Затем уже в Таблице встречается "Макет1". Более того, в одной строке ТабДока может быть несколько сгенеренных макетов в разной последовательности "нумерации" - к конкретной строке не подступиться :( А если вспомнить про иерархию, то уже моск пухнет...
38 Garkin
 
14.10.08
18:11
Не, согласись, маловероятно что имена макетам присваиваются датчиком случайных чисел.:) Алгоритм есть. Да и про "войти в историю" я подумавши писал  :)
39 MoneG
 
14.10.08
18:14
(38) соглашусь. опухоль спадет - поанализирую :) А про историю - пофиг. Мне интересно другое - неужели нельзя было все мучения 2-5 галочками встроенными избежать?!
40 Garkin
 
14.10.08
18:20
(40) СКД есть куда развиваться, будем надеяться что теперешнее ее состояние это не финальная стадия.
41 Garkin
 
14.10.08
18:22
+(40) вот, уже сам с собою разговаривать начал :), (40) естественно к (39).
42 MoneG
 
14.10.08
18:23
(40) Так точно! А пока что... появится решение с макетами - создам новую ветку.
Ошибка? Это не ошибка, это системная функция.