Волшебный форум

Привет, Petr128 | Личные настройки | Выход

Все сообщения    »
1С:Предприятие ::
Документы


vote   
v8: Табличный документ. Разная высота строк в разных колонках.  Я
   selenat
16.07.09 - 16:54
Задача такая. Имеем 6 колонок. В 3 из них строки должны иметь свою высоту (которая определяется автоматически по содержимому ячеек), в других 3 строки имеют свою высоту (тоже определяется независимо по содержимому своих ячеек). Кто-нибудь делал такое?
Попробовал формировать разные наборы колонок в разных табличных документах, а потом выводить в итоговый табл. док. сначала готовый вариант из первого таб. дока, потом присоединять к нему готовый вариант из второго таб дока. Ничего хорошего не вышло - 1С выравнивает всю строку по содержимому ячеек во всех 6 колонках. Вот код:

    Ном1 = 0;
    Пока Выборка.Следующий() Цикл
        Ном1 = Ном1+1;
        ОбластьСтрока1.Параметры.НомерГТД = Выборка.НомерГТД;        
        ОбластьСтрока1.Параметры.Получатель = Покупатель;        
        ОбластьСтрока1.Параметры.Отправитель = ОписаниеОрганизации(СведенияОЮрФизЛице(Выборка.Поставщик,Дата));
        ТабДокумент1.Вывести(ОбластьСтрока1);
    КонецЦикла;    
...
    Ном2 = 0;
    Пока Выборка.Следующий() Цикл
        Ном2 = Ном2+1;
        ОбластьСтрока2.Параметры.Наименование = Выборка.Наименование;        
        ОбластьСтрока2.Параметры.КоличествоНеттоБрутто = ""+Выборка.Нетто+" / "+Выборка.ВесБрутто;        
        ОбластьСтрока2.Параметры.Стоимость = "";
        ТабДокумент2.Вывести(ОбластьСтрока2);
        ОбластьСтрока2.Области.Строка1.АвтоВысотаСтроки = Ложь;
    КонецЦикла;    

    Область1 = ТабДокумент1.ПолучитьОбласть("R1C1:R"+Ном1+"C10");
    Область2 = ТабДокумент2.ПолучитьОбласть("R1C1:R"+Ном2+"C10");
    ТабДокумент.Вывести(Область1);
    ТабДокумент.Присоединить(Область2);

Что можно доработать в этом коде для получения результата? Или какой есть еще вариант?
15
   selenat
1 - 16.07.09 - 17:14
апп
   Mitriy
2 - 16.07.09 - 17:15
Объединяй
3
   selenat
3 - 16.07.09 - 17:18
(2) если можно, чуть подробнее. Чем мне может помочь объединение ячеек?
   Mitriy
4 - 16.07.09 - 17:18
я делал этикетку, где надо было выводить в разных местах разными шрифтами разные вещи, да чтобы еще и красиво было... разбиваешь табдок на мелкие строки и стобцы, из расчета, например, 10 на обычную строку и объединяешь как хочешь...
6
   Mitriy
5 - 16.07.09 - 17:21
в твоем случае столбцы разбивать не нужно...
   selenat
6 - 16.07.09 - 17:25
(4) насколько я понимаю, так ты можешь получать области неправильной формы. Но чем это поможет мне? Мне нужно, чтобы в зависимости от количества инфы в ячейках срабатывала автовысота строк (у ячеек свойство "размещение" ставлю "переносить"). Но нужно, чтобы эта автовысота работала только в пределах определенных колонок. По другим колонкам тоже работает автовысота, но в пределах этого другого набора колонок. Т.е. подчеркивание строк в разных колонках идет на разном уровне...
7
   Mitriy
7 - 16.07.09 - 17:34
(6) ну не могут быть строки в табдоке быть разной высоты в разных колонках... поэтому только извращаться... еще можно попробовать выводить горизонтально ))
8
   selenat
8 - 16.07.09 - 17:57
(7) в смысле развернуть текст на 90 градусов и заменить колонки на строки?
9
   Mitriy
9 - 16.07.09 - 18:00
(8) ну да... только мне кажется, что это еще муторнее, чем мой вариант...
10
   selenat
10 - 16.07.09 - 18:03
(9) тогда скажи еще раз про свой вариант. Он пока до меня не дошел. Как в твоем случае можно регулировать высоту строк по каждой колонке?
11
   Mitriy
11 - 16.07.09 - 18:10
(10) это только идея... реализации в динамике я не делал, у меня был готовый макет    с разными областями, в крайнем случае я что-то объединял, но тоже в определенных пределах и все области были поименованы, поэтому проще. А вот как выводить динамически, рассчитывая, что объединять и как будет себя вести Присоединить и вывести, это надо пытать...
14
   Mitriy
12 - 16.07.09 - 18:14
могу предложить собирать сначала первую колонку, выводить ее, а потом последовательно присоединять следующие колонки... целиком...
15
   Mitriy
13 - 16.07.09 - 18:16
но с таким расчетом, что высота строк во всех колонках будет одинаковой, а уж по сколько ты их будешь объединять, тебе решать :)
   selenat
14 - 16.07.09 - 18:16
(11) херово. У меня именно динамический вариант. И количество строк, и объем инфы в каждой ячейки может быть каким угодно. Разбивать содержимое ячейки на строки вручную (чтоб переносы целых слов были правильными), чтобы для каждой ячейки расчитать необходимую высоту - это закат солнца вручную...
16
   selenat
15 - 16.07.09 - 18:18
(12) так я ж так и делаю в (0). Это была первая же идея, которая в голову пришла. Но одинесина автоматически перевыравнивает высоты строк...
   Mitriy
16 - 16.07.09 - 18:19
(14) можно предварительно выводить в область с автовысотой и переносом и измерять высоту строки, которую потом использовать...
18
   Mitriy
17 - 16.07.09 - 18:22
кстати, измерение высоты я сегодня уже где-то предлагал, может пригодится:

Область = ТабДок.Вывести(Область);
Надпись = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
//измерим высоту в миллиметрах  
Надпись.Расположить(Область); 
ВысотаОбластиМиллиметры = Надпись.Высота;
ТабДок.Рисунки.Удалить(Надпись);
19
20
42
   selenat
18 - 16.07.09 - 18:22
(16) Тут два момента. Во-первых, я не нашел свойств,  из которых можно считать получившуюся высоту строки. Второе - 1С все равно перевыравнивает высоту, несмотря на попытки запрета этого:

ОбластьСтрока2.Области.Строка1.АвтоВысотаСтроки = Ложь;
22
   Mitriy
19 - 16.07.09 - 18:23
(17) кстати, если заменить Высота на Ширина, то ширина тоже будет в миллиметрах, что иногда дюже радует ))
21
   selenat
20 - 16.07.09 - 18:23
(17) класс. Спасибо!
   selenat
21 - 16.07.09 - 18:23
(19) Афигеть!
   Mitriy
22 - 16.07.09 - 18:25
(18) строки используй одинаковой высоты, заданной в макете... или приводи их к такой высоте перед выводом... будешь всегда знать, на какую высоту сколько строк надо...
23
   selenat
23 - 16.07.09 - 18:29
(22) т.е. получается, что зная высоты всех строк в двух разных таб доках (каждый таб. док со своим набором колонок), я могу конструировать строку с единой высотой в результирующем документе, выводя где нужно пустые места и т.д.
Так?
24
   Mitriy
24 - 16.07.09 - 18:37
(23) в идеале можно иметь одну область в виде ячейки с высотой строки в один миллиметр и шириной в одну колонку, и с помощью нее лепить все, что угодно ))
25
   selenat
25 - 16.07.09 - 18:38
И все равно пока не догоняю. Если мне нужно провести подчеркивание строки в одной колонке выше, чем в другой. В этом случае мне видимо придется выводить 2 строки, искусственно разбив содержимое колонки с бОльшей высотой на 2 строки. Как в этом случае текст разбивать?
(24) фигасе О-0. А с текстом динамическим что делать?
26
   Mitriy
26 - 16.07.09 - 18:44
(25) можно собирать область каждой ячейки столбца из мелких областей, в количестве, рассчитанном по нужной высоте, которую можно рассчитать предварительным выводом в обычную строку с автовысотой, а потом объединять и туда вставлять текст... где-то так ))
28
   Mitriy
27 - 16.07.09 - 18:46
в общем, конструктор покруче лего... все я ушел, если что, можно завтра по экспериментировать...
29
   selenat
28 - 16.07.09 - 18:53
(26) Из каких бы кусочков мы ни собирали ячейки, вывод всегда происходит с единой высотой строки. Давай на примере. Вот предположим, у нас высота строки по одному набору столбцов равна 15. По другому - 25. Какой высоты строку мы будем собирать для вывода в результирующем таб доке? Поскольку мне нужно отчеркнуть строку меньшей высоты, то наверное придется выводить 2 строки, одну высотой 15, другую - 10. Как в этом случае разбивать текст по этим строкам?
30
   selenat
29 - 16.07.09 - 18:54
(27) ок. Подниму еще завтра веточку...
   Mitriy
30 - 17.07.09 - 09:18
(28) пока теория и вкратце:
1. Берем чистый макет - табдок. Чтобы не париться с границами, в первом столбце выделяем подряд сверху n ячеек и указываем границу везде.
2. Когда узнаем, какой высоты h должна быть ячейка, получаем Область(1, 1, h/К, 1), где К - коэффициент = стандартной высоте строки (если стандарт выбираем = 1мм, тогда и К = 1 мм) объединяем, присваиваем нужный текст, устанавливаем стандартную высоту строки и выводим в формируемую колонку...
то бишь, строки всегда будут иметь одинаковую высоту, просто количество объединенных по вертикали ячеек будет отличаться...

примерно так я себе это представляю...
34
   НЕА123
31 - 17.07.09 - 09:48
как вариант: исользовать рисунки типа текст.
32
   Mitriy
32 - 17.07.09 - 09:51
(31) можно даже кнопки ))
   selenat
33 - 17.07.09 - 10:45
Спасибо, буду пробовать!
   selenat
34 - 17.07.09 - 11:24
(30) все равно не понятно. Мы выводим целиком строку или только область в одной колонке, к которой потом присоединяем области в других колонках? Если второй вариант, то что будет если высота присоединяемой секции будет больше высоты в прошлой колонке? Скорее всего в этом случае 1С все равно приведет все области в разных колонках к одной высоте. А если нет, то вообще неясно, как будет осуществляться вывод следующих строк...
35
   Mitriy
35 - 17.07.09 - 11:27
(34) собираем полностью колонку первую, выводим ее, потом полностью собираем колонку вторую, присоединяем, третью присоединяем и т.д.
36
   selenat
36 - 17.07.09 - 11:30
(35) ну дык я ж говорил, что при таком подходе 1С выравнивает все. Вряд ли есть разница - собирали мы ячейки объединением секций или нет...
38
   selenat
37 - 17.07.09 - 11:31
+36 но конечно попробую...
   Mitriy
38 - 17.07.09 - 11:32
(36) если все правильно делать, то строки будут одинаковой высоты, что там выравнивать еще?
39
40
   Mitriy
39 - 17.07.09 - 11:33
(38) млин... может и правда чо не так... надо самому попытать, а то я все на словах тут умничаю...
42
   selenat
40 - 17.07.09 - 11:35
(38) как это одинаковой высоты? Ты ведь собираешь ячейку из строк одинаковой высоты до вывода ее в таб док. А выводишь в таб док уже целиком область с какой-то неизвестной заранее высотой. И какая тогда разница - как ты собирал эту область? Высота выводимой области каждый раз разная...
   selenat
41 - 17.07.09 - 11:51
Кстати, код в 17 почему-то возвращает 0 все время... :(
   selenat
42 - 17.07.09 - 12:10
(39) ты сам пользовался кодом (17)? У тебя реально высоту определяет?
   Mitriy
43 - 17.07.09 - 12:36
вот моя идея в первом приближении:

Перем мВысотаСтроки;
Перем мМакет;

Процедура КнопкаВыполнитьНажатие(Кнопка)
    мВысотаСтроки = 5;
    ТабДок = ЭлементыФормы.ТабДок;
    ТабДок.Очистить();
    Макет = ПолучитьМакет("Макет");
    ВывестиКолонку(ТабДок);
    ВывестиКолонку(ТабДок, Ложь);
КонецПроцедуры

Процедура ВывестиКолонку(ТабДок, Первая = Истина)
    МакетКолонки = Новый ТабличныйДокумент;
    ВысотаКолонки = 0;
    Если Первая Тогда
        МакетКолонки.Вывести(СваятьЯчейку(5, ВысотаКолонки));
        МакетКолонки.Вывести(СваятьЯчейку(10, ВысотаКолонки));
        МакетКолонки.Вывести(СваятьЯчейку(15, ВысотаКолонки));
        МакетКолонки.Вывести(СваятьЯчейку(20, ВысотаКолонки));
    Иначе
        МакетКолонки.Вывести(СваятьЯчейку(20, ВысотаКолонки));
        МакетКолонки.Вывести(СваятьЯчейку(15, ВысотаКолонки));
        МакетКолонки.Вывести(СваятьЯчейку(10, ВысотаКолонки));
        МакетКолонки.Вывести(СваятьЯчейку(5, ВысотаКолонки));
    КонецЕсли;
    
    ОбластьКолонки = МакетКолонки.Область(1, 1, ВысотаКолонки, 1);
    ОбластьКолонки.ВысотаСтроки = мВысотаСтроки;
    Если Первая Тогда
        ТабДок.Вывести(ОбластьКолонки);
    Иначе
        ТабДок.Присоединить(ОбластьКолонки);
    КонецЕсли;
КонецПроцедуры

Функция СваятьЯчейку(ВысотаЯчейки, ВысотаКолонки)
    Низ = ВысотаЯчейки/мВысотаСтроки;
    Область = мМакет.ПолучитьОбласть(1, 1, Низ, 1);
    Область.Область().Объединить();
    ВысотаКолонки = ВысотаКолонки + Низ;
    Возврат Область;
КонецФункции

мВысотаСтроки = 5;
мМакет = ПолучитьМакет("Макет");
а высоту щас проверю...
44
   selenat
44 - 17.07.09 - 12:56
(43) спасибо, буду разбираться...
45
   Mitriy
45 - 17.07.09 - 13:01
(44) а вот так высота работает:

    Макет = ПолучитьМакет("Макет");
    ТД = Новый ТабличныйДокумент;
    Ячейка = Макет.ПолучитьОбласть("ЯчейкаДляПолученияВысоты");
    Ячейка.Параметры.Текст = "фыафыафыа sadf as as a фывафыа фыа фыва assf a ffaw efqweefojasop а  poasddif paosf poasdjhpo asodf jaspdf ajso asdf jaspodf jasd fasd fasi fjpasodfj apsdf фыав jasdpof iasjdfp oasdif jaspodf jasdp asodfj oasdifj aosf oasdhf oasihfpiasoh вазщшфывра poasdihf poasih";
    ОбластьИзмерения = ТД.Вывести(Ячейка);
    Надпись = ТД.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
    //измерим высоту в миллиметрах   
    Надпись.Расположить(ОбластьИзмерения); 
    Сообщить(Надпись.Высота);
    ТД.Рисунки.Удалить(Надпись);
47
48
56
   Mitriy
46 - 17.07.09 - 13:02
думаю, можно все это упростить как-то, если повозиться...
   selenat
47 - 17.07.09 - 13:03
(45) Спасибо! Щас после обеда начну ковырять все это и попытаюсь приспособить...
   selenat
48 - 17.07.09 - 13:51
(45) так, с высотой кажется разобрался. Спасибо. Щас дальше пойду...
   selenat
49 - 17.07.09 - 14:23
Митрий, спасибо большое! Твой метод действительно работает. Сейчас буду приспосабливать его к своей задаче.
   selenat
50 - 18.07.09 - 15:52
Еще раз спасибо! Все получилось прекрасно!
   selenat
51 - 23.07.09 - 11:20
Еще вопросик. А почему не работает вот такая конструкция

    Область = мМакет.ПолучитьОбласть(1, 1, Низ, 1);
    Область.Область().Объединить();

для объединения ячеек, в каждой из которых заполнен свой параметр? Вроде как если делаешь то же самое в конфигураторе интерактивно, ячейки объединяются, оставляя в качестве содержимого то, что было в первой (верхней или левой) ячейке области...
   НЕА123
52 - 23.07.09 - 11:25
> Область.Область().Объединить();
Область.Объединить();
53
   selenat
53 - 23.07.09 - 11:34
(52) не, не то. Область и Область() в данном случае имеют разный тип. Одно - табличный документ, другое - облясть ячеек табличного документа. Тут все правильно, это совершенно рабочая конструкция. Но работает почем-то только объединяя с пустыми ячейками...
54
   НЕА123
54 - 23.07.09 - 11:41
(53) не уверен, но может так

Область = мМакет.Область(1, 1, Низ, 1);
Область.Объединить();
Область = мМакет.ПолучитьОбласть(1, 1, Низ, 1);
55
   selenat
55 - 23.07.09 - 11:53
(54) хех, кажись помогло. Спасибо!
   selenat
56 - 29.07.09 - 19:32
Что-то я не догнал. Вот этот алгоритм из (45)
    ОбластьИзмерения = ТД.Вывести(Ячейка);
    Надпись = ТД.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
    //измерим высоту в миллиметрах   
 
    Надпись.Расположить(ОбластьИзмерения); 
    Сообщить(Надпись.Высота);
    ТД.Рисунки.Удалить(Надпись);
 
у меня на копии работает нормально. А на реальной базе выдает для каждой области одинаковую высоту. При том, что объем текста у разных ячеек разный. Соотвтетсвенно на копии высота разная. И структура инфы, и сама инфа одинакова. В чем может быть трабла?
57
60
   selenat
57 - 30.07.09 - 08:26
никто с (56) не сталкивался?
   selenat
58 - 30.07.09 - 11:17
апп
   selenat
59 - 30.07.09 - 13:29
жаль :((
   НЕА123
60 - 31.07.09 - 09:25
(56)
хз.
может из-за автовысота = ложь?
61
62
   selenat
61 - 31.07.09 - 17:50
(60) запарка. Даже нет сейчас времени посмотреть. Гляну как только смогу. Спасибо!
   selenat
62 - 04.08.09 - 17:30
(60) Дело было в разных релизах платформы. Еще раз спасибо...

Все сообщения    »

Список тем форума
Изречение: Научись радоваться не только победе, но и поражению - из поражения ты можешь понять свои ошибки.


Добавить сообщение в тему:
(регистрация не нужна)
 
     
Имя*:  
Сообщение*: