Имя: Пароль:
1C
 
Табличный документ. Разная высота строк в разных колонках.
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) Дело было в разных релизах платформы. Еще раз спасибо...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.