![]() |
![]() |
![]() |
|
Табличный документ. Разная высота строк в разных колонках. | ☑ | ||
---|---|---|---|---|
0
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); Что можно доработать в этом коде для получения результата? Или какой есть еще вариант? |
|||
1
selenat
16.07.09
✎
17:14
|
апп
|
|||
2
Mitriy
16.07.09
✎
17:15
|
Объединяй
|
|||
3
selenat
16.07.09
✎
17:18
|
(2) если можно, чуть подробнее. Чем мне может помочь объединение ячеек?
|
|||
4
Mitriy
16.07.09
✎
17:18
|
я делал этикетку, где надо было выводить в разных местах разными шрифтами разные вещи, да чтобы еще и красиво было... разбиваешь табдок на мелкие строки и стобцы, из расчета, например, 10 на обычную строку и объединяешь как хочешь...
|
|||
5
Mitriy
16.07.09
✎
17:21
|
в твоем случае столбцы разбивать не нужно...
|
|||
6
selenat
16.07.09
✎
17:25
|
(4) насколько я понимаю, так ты можешь получать области неправильной формы. Но чем это поможет мне? Мне нужно, чтобы в зависимости от количества инфы в ячейках срабатывала автовысота строк (у ячеек свойство "размещение" ставлю "переносить"). Но нужно, чтобы эта автовысота работала только в пределах определенных колонок. По другим колонкам тоже работает автовысота, но в пределах этого другого набора колонок. Т.е. подчеркивание строк в разных колонках идет на разном уровне...
|
|||
7
Mitriy
16.07.09
✎
17:34
|
(6) ну не могут быть строки в табдоке быть разной высоты в разных колонках... поэтому только извращаться... еще можно попробовать выводить горизонтально ))
|
|||
8
selenat
16.07.09
✎
17:57
|
(7) в смысле развернуть текст на 90 градусов и заменить колонки на строки?
|
|||
9
Mitriy
16.07.09
✎
18:00
|
(8) ну да... только мне кажется, что это еще муторнее, чем мой вариант...
|
|||
10
selenat
16.07.09
✎
18:03
|
(9) тогда скажи еще раз про свой вариант. Он пока до меня не дошел. Как в твоем случае можно регулировать высоту строк по каждой колонке?
|
|||
11
Mitriy
16.07.09
✎
18:10
|
(10) это только идея... реализации в динамике я не делал, у меня был готовый макет с разными областями, в крайнем случае я что-то объединял, но тоже в определенных пределах и все области были поименованы, поэтому проще. А вот как выводить динамически, рассчитывая, что объединять и как будет себя вести Присоединить и вывести, это надо пытать...
|
|||
12
Mitriy
16.07.09
✎
18:14
|
могу предложить собирать сначала первую колонку, выводить ее, а потом последовательно присоединять следующие колонки... целиком...
|
|||
13
Mitriy
16.07.09
✎
18:16
|
но с таким расчетом, что высота строк во всех колонках будет одинаковой, а уж по сколько ты их будешь объединять, тебе решать :)
|
|||
14
selenat
16.07.09
✎
18:16
|
(11) херово. У меня именно динамический вариант. И количество строк, и объем инфы в каждой ячейки может быть каким угодно. Разбивать содержимое ячейки на строки вручную (чтоб переносы целых слов были правильными), чтобы для каждой ячейки расчитать необходимую высоту - это закат солнца вручную...
|
|||
15
selenat
16.07.09
✎
18:18
|
(12) так я ж так и делаю в (0). Это была первая же идея, которая в голову пришла. Но одинесина автоматически перевыравнивает высоты строк...
|
|||
16
Mitriy
16.07.09
✎
18:19
|
(14) можно предварительно выводить в область с автовысотой и переносом и измерять высоту строки, которую потом использовать...
|
|||
17
Mitriy
16.07.09
✎
18:22
|
кстати, измерение высоты я сегодня уже где-то предлагал, может пригодится:
Область = ТабДок.Вывести(Область); Надпись = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст); //измерим высоту в миллиметрах Надпись.Расположить(Область); ВысотаОбластиМиллиметры = Надпись.Высота; ТабДок.Рисунки.Удалить(Надпись); |
|||
18
selenat
16.07.09
✎
18:22
|
(16) Тут два момента. Во-первых, я не нашел свойств, из которых можно считать получившуюся высоту строки. Второе - 1С все равно перевыравнивает высоту, несмотря на попытки запрета этого:
ОбластьСтрока2.Области.Строка1.АвтоВысотаСтроки = Ложь; |
|||
19
Mitriy
16.07.09
✎
18:23
|
(17) кстати, если заменить Высота на Ширина, то ширина тоже будет в миллиметрах, что иногда дюже радует ))
|
|||
20
selenat
16.07.09
✎
18:23
|
(17) класс. Спасибо!
|
|||
21
selenat
16.07.09
✎
18:23
|
(19) Афигеть!
|
|||
22
Mitriy
16.07.09
✎
18:25
|
(18) строки используй одинаковой высоты, заданной в макете... или приводи их к такой высоте перед выводом... будешь всегда знать, на какую высоту сколько строк надо...
|
|||
23
selenat
16.07.09
✎
18:29
|
(22) т.е. получается, что зная высоты всех строк в двух разных таб доках (каждый таб. док со своим набором колонок), я могу конструировать строку с единой высотой в результирующем документе, выводя где нужно пустые места и т.д.
Так? |
|||
24
Mitriy
16.07.09
✎
18:37
|
(23) в идеале можно иметь одну область в виде ячейки с высотой строки в один миллиметр и шириной в одну колонку, и с помощью нее лепить все, что угодно ))
|
|||
25
selenat
16.07.09
✎
18:38
|
И все равно пока не догоняю. Если мне нужно провести подчеркивание строки в одной колонке выше, чем в другой. В этом случае мне видимо придется выводить 2 строки, искусственно разбив содержимое колонки с бОльшей высотой на 2 строки. Как в этом случае текст разбивать?
(24) фигасе О-0. А с текстом динамическим что делать? |
|||
26
Mitriy
16.07.09
✎
18:44
|
(25) можно собирать область каждой ячейки столбца из мелких областей, в количестве, рассчитанном по нужной высоте, которую можно рассчитать предварительным выводом в обычную строку с автовысотой, а потом объединять и туда вставлять текст... где-то так ))
|
|||
27
Mitriy
16.07.09
✎
18:46
|
в общем, конструктор покруче лего... все я ушел, если что, можно завтра по экспериментировать...
|
|||
28
selenat
16.07.09
✎
18:53
|
(26) Из каких бы кусочков мы ни собирали ячейки, вывод всегда происходит с единой высотой строки. Давай на примере. Вот предположим, у нас высота строки по одному набору столбцов равна 15. По другому - 25. Какой высоты строку мы будем собирать для вывода в результирующем таб доке? Поскольку мне нужно отчеркнуть строку меньшей высоты, то наверное придется выводить 2 строки, одну высотой 15, другую - 10. Как в этом случае разбивать текст по этим строкам?
|
|||
29
selenat
16.07.09
✎
18:54
|
(27) ок. Подниму еще завтра веточку...
|
|||
30
Mitriy
17.07.09
✎
09:18
|
(28) пока теория и вкратце:
1. Берем чистый макет - табдок. Чтобы не париться с границами, в первом столбце выделяем подряд сверху n ячеек и указываем границу везде. 2. Когда узнаем, какой высоты h должна быть ячейка, получаем Область(1, 1, h/К, 1), где К - коэффициент = стандартной высоте строки (если стандарт выбираем = 1мм, тогда и К = 1 мм) объединяем, присваиваем нужный текст, устанавливаем стандартную высоту строки и выводим в формируемую колонку... то бишь, строки всегда будут иметь одинаковую высоту, просто количество объединенных по вертикали ячеек будет отличаться... примерно так я себе это представляю... |
|||
31
НЕА123
17.07.09
✎
09:48
|
как вариант: исользовать рисунки типа текст.
|
|||
32
Mitriy
17.07.09
✎
09:51
|
(31) можно даже кнопки ))
|
|||
33
selenat
17.07.09
✎
10:45
|
Спасибо, буду пробовать!
|
|||
34
selenat
17.07.09
✎
11:24
|
(30) все равно не понятно. Мы выводим целиком строку или только область в одной колонке, к которой потом присоединяем области в других колонках? Если второй вариант, то что будет если высота присоединяемой секции будет больше высоты в прошлой колонке? Скорее всего в этом случае 1С все равно приведет все области в разных колонках к одной высоте. А если нет, то вообще неясно, как будет осуществляться вывод следующих строк...
|
|||
35
Mitriy
17.07.09
✎
11:27
|
(34) собираем полностью колонку первую, выводим ее, потом полностью собираем колонку вторую, присоединяем, третью присоединяем и т.д.
|
|||
36
selenat
17.07.09
✎
11:30
|
(35) ну дык я ж говорил, что при таком подходе 1С выравнивает все. Вряд ли есть разница - собирали мы ячейки объединением секций или нет...
|
|||
37
selenat
17.07.09
✎
11:31
|
+36 но конечно попробую...
|
|||
38
Mitriy
17.07.09
✎
11:32
|
(36) если все правильно делать, то строки будут одинаковой высоты, что там выравнивать еще?
|
|||
39
Mitriy
17.07.09
✎
11:33
|
(38) млин... может и правда чо не так... надо самому попытать, а то я все на словах тут умничаю...
|
|||
40
selenat
17.07.09
✎
11:35
|
(38) как это одинаковой высоты? Ты ведь собираешь ячейку из строк одинаковой высоты до вывода ее в таб док. А выводишь в таб док уже целиком область с какой-то неизвестной заранее высотой. И какая тогда разница - как ты собирал эту область? Высота выводимой области каждый раз разная...
|
|||
41
selenat
17.07.09
✎
11:51
|
Кстати, код в 17 почему-то возвращает 0 все время... :(
|
|||
42
selenat
17.07.09
✎
12:10
|
(39) ты сам пользовался кодом (17)? У тебя реально высоту определяет?
|
|||
43
Mitriy
17.07.09
✎
12:36
|
вот моя идея в первом приближении:
Перем мВысотаСтроки; Перем мМакет; Процедура КнопкаВыполнитьНажатие(Кнопка) мВысотаСтроки = 5; ТабДок = ЭлементыФормы.ТабДок; ТабДок.Очистить(); Макет = ПолучитьМакет("Макет"); ВывестиКолонку(ТабДок); ВывестиКолонку(ТабДок, Ложь); КонецПроцедуры Процедура ВывестиКолонку(ТабДок, Первая = Истина) МакетКолонки = Новый ТабличныйДокумент; ВысотаКолонки = 0; Если Первая Тогда МакетКолонки.Вывести(СваятьЯчейку(5, ВысотаКолонки)); МакетКолонки.Вывести(СваятьЯчейку(10, ВысотаКолонки)); МакетКолонки.Вывести(СваятьЯчейку(15, ВысотаКолонки)); МакетКолонки.Вывести(СваятьЯчейку(20, ВысотаКолонки)); Иначе МакетКолонки.Вывести(СваятьЯчейку(20, ВысотаКолонки)); МакетКолонки.Вывести(СваятьЯчейку(15, ВысотаКолонки)); МакетКолонки.Вывести(СваятьЯчейку(10, ВысотаКолонки)); МакетКолонки.Вывести(СваятьЯчейку(5, ВысотаКолонки)); КонецЕсли; ОбластьКолонки = МакетКолонки.Область(1, 1, ВысотаКолонки, 1); ОбластьКолонки.ВысотаСтроки = мВысотаСтроки; Если Первая Тогда ТабДок.Вывести(ОбластьКолонки); Иначе ТабДок.Присоединить(ОбластьКолонки); КонецЕсли; КонецПроцедуры Функция СваятьЯчейку(ВысотаЯчейки, ВысотаКолонки) Низ = ВысотаЯчейки/мВысотаСтроки; Область = мМакет.ПолучитьОбласть(1, 1, Низ, 1); Область.Область().Объединить(); ВысотаКолонки = ВысотаКолонки + Низ; Возврат Область; КонецФункции мВысотаСтроки = 5; мМакет = ПолучитьМакет("Макет"); а высоту щас проверю... |
|||
44
selenat
17.07.09
✎
12:56
|
(43) спасибо, буду разбираться...
|
|||
45
Mitriy
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"; ОбластьИзмерения = ТД.Вывести(Ячейка); Надпись = ТД.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст); //измерим высоту в миллиметрах Надпись.Расположить(ОбластьИзмерения); Сообщить(Надпись.Высота); ТД.Рисунки.Удалить(Надпись); |
|||
46
Mitriy
17.07.09
✎
13:02
|
думаю, можно все это упростить как-то, если повозиться...
|
|||
47
selenat
17.07.09
✎
13:03
|
(45) Спасибо! Щас после обеда начну ковырять все это и попытаюсь приспособить...
|
|||
48
selenat
17.07.09
✎
13:51
|
(45) так, с высотой кажется разобрался. Спасибо. Щас дальше пойду...
|
|||
49
selenat
17.07.09
✎
14:23
|
Митрий, спасибо большое! Твой метод действительно работает. Сейчас буду приспосабливать его к своей задаче.
|
|||
50
selenat
18.07.09
✎
15:52
|
Еще раз спасибо! Все получилось прекрасно!
|
|||
51
selenat
23.07.09
✎
11:20
|
Еще вопросик. А почему не работает вот такая конструкция
Область = мМакет.ПолучитьОбласть(1, 1, Низ, 1); Область.Область().Объединить(); для объединения ячеек, в каждой из которых заполнен свой параметр? Вроде как если делаешь то же самое в конфигураторе интерактивно, ячейки объединяются, оставляя в качестве содержимого то, что было в первой (верхней или левой) ячейке области... |
|||
52
НЕА123
23.07.09
✎
11:25
|
> Область.Область().Объединить();
Область.Объединить(); |
|||
53
selenat
23.07.09
✎
11:34
|
(52) не, не то. Область и Область() в данном случае имеют разный тип. Одно - табличный документ, другое - облясть ячеек табличного документа. Тут все правильно, это совершенно рабочая конструкция. Но работает почем-то только объединяя с пустыми ячейками...
|
|||
54
НЕА123
23.07.09
✎
11:41
|
(53) не уверен, но может так
Область = мМакет.Область(1, 1, Низ, 1); Область.Объединить(); Область = мМакет.ПолучитьОбласть(1, 1, Низ, 1); |
|||
55
selenat
23.07.09
✎
11:53
|
(54) хех, кажись помогло. Спасибо!
|
|||
56
selenat
29.07.09
✎
19:32
|
Что-то я не догнал. Вот этот алгоритм из (45)
ОбластьИзмерения = ТД.Вывести(Ячейка); Надпись = ТД.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст); //измерим высоту в миллиметрах Надпись.Расположить(ОбластьИзмерения); Сообщить(Надпись.Высота); ТД.Рисунки.Удалить(Надпись); у меня на копии работает нормально. А на реальной базе выдает для каждой области одинаковую высоту. При том, что объем текста у разных ячеек разный. Соотвтетсвенно на копии высота разная. И структура инфы, и сама инфа одинакова. В чем может быть трабла? |
|||
57
selenat
30.07.09
✎
08:26
|
никто с (56) не сталкивался?
|
|||
58
selenat
30.07.09
✎
11:17
|
апп
|
|||
59
selenat
30.07.09
✎
13:29
|
жаль :((
|
|||
60
НЕА123
31.07.09
✎
09:25
|
(56)
хз. может из-за автовысота = ложь? |
|||
61
selenat
31.07.09
✎
17:50
|
(60) запарка. Даже нет сейчас времени посмотреть. Гляну как только смогу. Спасибо!
|
|||
62
selenat
04.08.09
✎
17:30
|
(60) Дело было в разных релизах платформы. Еще раз спасибо...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |