|
v7: Как лучше высчитать ширину колонки для табличной формы | ☑ | ||
---|---|---|---|---|
0
AlexS1C
06.05.13
✎
19:27
|
Может у кого есть какие идеи по быстрому вычислению ширины колонки для печатной формы! Вычислять в цикле каждую ячейку считаю не производительным, но придумать кроме такого кода пока ни чего не могу:
Процедура Сформировать() Перем ШиринаСтолбца[1000]; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Для ии = 1 По Тз.КоличествоКолонок() Цикл ДлинаТек = СтрДлина(СокрЛП(ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,ии))); ШиринаСтолбца[ии] = Макс(ШиринаСтолбца[ии],ДлинаТек); КонецЦикла; КонецЦикла; КонецПроцедуры Может вычислять ширину несколько случайных ячеек! Типа делать статистическую выборку... Кто какой более быстрый код может предложить??? |
|||
1
vinogradъ
06.05.13
✎
20:22
|
для чего строки перебирать?
|
|||
2
МихаилМ
06.05.13
✎
20:45
|
||||
3
Злопчинский
06.05.13
✎
23:39
|
(2) некузяво. все равно привязка к размерам шрифта идет. Тем более, что описанную в статье задачу правильного расчета переносов/подвалов/висящих строк в большом количестве случаев можно решить и штатными методами
|
|||
4
Cthulhu
07.05.13
✎
01:11
|
(3): сказал "а" - говори "б".
|
|||
5
Злопчинский
07.05.13
✎
01:50
|
(4) ковырять свойства таблицы типа "выводить вместе с..." - при этом надо задействоать одну дополнительную секцию и разные свойства упомянутого вывода на последнюю и непоследние строки подвала. Перепилил на это дело у себя счф и еще некоторые формы - работает!
|
|||
6
Злопчинский
07.05.13
✎
01:52
|
Подробности расписаны здесь Таб.КоличествоСтраниц() - тормозит нещадно
(спасибо учителям!) |
|||
7
Cthulhu
07.05.13
✎
02:55
|
(5): чо?
(6): нету подробностей (или не о том). |
|||
8
AlexS1C
07.05.13
✎
12:57
|
(1) Для того чтобы вычислить ширину каждой ячейки в таблицы. И потом установить ширину столбца по макс. ширине! Чтобы все значения помещались в столбце!
|
|||
9
AlexS1C
07.05.13
✎
13:11
|
(2) Тут вообще по теме ничего не увидел! Может меня не правильно понимают! Хочу найти максимальную ширину колонки по значению строк этой колонки, для этого использую СтрДлина()! после того как найду просто Таб.ШиринаСтолбца(<ЗначенийМакс>)! Не устраивать то что надо проверять в цикле каждую ячейку на размер! Вот подумал может кто может подсказать более гениальный алгоритм!!! А на счет размера шрифта, тут проблем ни каких не вижу для производительности! Вычислить какой коэффициент в зависимости от размера шрифта Таб.ШиринаСтолбца(<ЗначенийМакс>*<Коэф>)! Это не циклом каждую ячейку вычислять!
|
|||
10
Ковычки
07.05.13
✎
13:13
|
(9) а зачем каждую, достаточно по ширине таблицы
в (2) все есть |
|||
11
AlexS1C
07.05.13
✎
13:34
|
(10) Как можно получить ширину в таблице значений? Из таблицы значений (объект "ТаблицаЗначений") заполняется печатная форма (объект "Таблица")! Хочу чтобы форма получилось красивая все значения влазили в ширину колонки! Для этого нужно установить каждому столбцу ширину в зависимости от длины значения по колонке этой ТЗ! Другими словами найти максимально длинное значение в колонки ТЗ и установить ширину! Чтобы определить максимально длинное значение в определенной колонке, кроме как высчитывать каждую строку ТЗ на длину (СтрДлина(СкорЛП(ТЗ.Значение))), придумать не могу! К примеру в Excel есть специальная функция которая автоматом устанавливает ширину по значениям столбца!
|
|||
12
Ковычки
07.05.13
✎
13:45
|
Выставлять ширину при заполнении ТЗ или при заполнении Таблицы
|
|||
13
FN
07.05.13
✎
13:55
|
(0) вычисляй в том же цикле, в котором делаешь вывод в моксель.
уже после вывода всех строк меняй ширину колонок мокселя. |
|||
14
AlexS1C
07.05.13
✎
14:18
|
(12) После заполнения Таблицы!
Процедура Сформировать() Перем ШиринаСтолбца[1000]; Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Для ии = 1 По Тз.КоличествоКолонок() Цикл ЗначениеЯчейки = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,ии); ДлинаТек = СтрДлина(СокрЛП(ЗначениеЯчейки)); ШиринаСтолбца[ии] = Макс(ШиринаСтолбца[ии],ДлинаТек); Если ии = 1 Тогда Таб.ВывестиСекцию("Строка|Колонка"); Иначе Таб.ПрисоединитьСекцию("Строка|Колонка"); КонецЕсли; КонецЦикла; КонецЦикла; //Устанавливаем ширину по колонкам: Для ии = 1 По ТЗ.КоличествоКолонок() Цикл Таб.Область(,ии,,ии).ШиринаСтолбца(ШиринаСтолбца[ии]); КонецЦикла; Таб.Показать("Отчет"); КонецПроцедуры |
|||
15
AlexS1C
07.05.13
✎
14:24
|
(13) Это понятно! Я просто накидал пример коротко в начале темы, конечно будет один обход ТЗ! Глупо делать два обхода ТЗ один для вычисления ширины, второй для вывода! Выше написал (14)другой листинг,чтоб было понятней! Может я в начале непонятной высказывался!Повторюсь может у кого есть более остроумный способ определять ширину!
|
|||
16
Ковычки
07.05.13
✎
14:26
|
(14) выставляй не после, а во время
|
|||
17
AlexS1C
07.05.13
✎
14:32
|
(16) Не понимаю что значит во время выставлять? Ширину? Зачем? мне надо в ТЗ найти самую длинную строку в колонке! И после того как найду выставить ширину!
|
|||
18
Ковычки
07.05.13
✎
16:41
|
Ш=0;
СпХ=СоздатьОбъект("СписокЗначений"); Для Сч=1 По ТЗ.КоличествоКолонок() Цикл ТЗ.Выгрузить(СпХ,,,Сч); ТЗ.УстановитьПараметрыКолонки(Сч,,,,,Шаблон("[Макс(СтрДлина("+СтрЗаменить(СпХ.ВСтрокуСРазделителями(),""",""","""),СтрДлина(""")+"))]")); КонецЦикла; Для Сч=1 По ТЗ.КоличествоКолонок() Цикл Сообщить(ТЗ.ПолучитьПараметрыКолонки(Сч,,,,,Ш)+"=="+Ш); КонецЦикла; |
|||
19
AlexS1C
07.05.13
✎
18:05
|
(18) Способ интересный, но проблемы производительности не решает, а наоборот, на больших объемах, в раз 50 медленей. Функция Шаблон в разы замедляет код - это раз и - СтрДлина - столько же раз выполниться сколько и в моем примере в цикле-это два и ВСтрокуСРазделителями() - не очень то и быстро работает - это три! Замер циклом 1730. способом (18) - 96880
|
|||
20
Ковычки
07.05.13
✎
18:06
|
Размеры не оговорены
|
|||
21
Ковычки
07.05.13
✎
18:54
|
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =" |Период С (ТекущаяДата()-ТЗ.КоличествоСтрок()) По (ТекущаяДата()); |ТекДок=Документ.СчетФактура.ТекущийДокумент; |Функция М=Максимум(СтрДлина(ТЗ.Текст)); |Группировка СтрокаДокумента; |Условие(ТЗ.ПолучитьСтроку()=1); |"; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Сообщить(Запрос.М); |
|||
22
Ковычки
07.05.13
✎
19:26
|
НачатьТранзакцию();
Док=СоздатьОбъект("Документ.Счет"); Док.Новый(); Док.УстановитьНовыйНомер(); Док.ДатаДок = ТекущаяДата(); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Док.НоваяСтрока(); КонецЦикла; //КонецЦикла; НД=Док.НомерДок; Док.Записать(); //Док.НайтиПоНомеру(НД,ТекущаяДата()); ТД=Док.ТекущийДокумент(); ТЗ.ВыбратьСтроки(); Запрос = СоздатьОбъект("Запрос"); Стр=" |Период С (ТекущаяДата()) По (ТекущаяДата()); |ОбрабатыватьДокументы Все; |ТекДок=Документ.Счет.ТекущийДокумент; |Группировка СтрокаДокумента; |Условие(ТекДок=ТД); |Условие(ТЗ.ПолучитьСтроку()=1); |"; Для Сч=1 По ТЗ.КоличествоКолонок() Цикл К=ТЗ.ПолучитьПараметрыКолонки(Сч); Стр=Стр+"Функция "+К+"=Максимум(СтрДлина(ТЗ."+К+"));"; КонецЦикла; Если Запрос.Выполнить(Стр) = 0 Тогда Возврат; КонецЕсли; Для Сч=1 По ТЗ.КоличествоКолонок() Цикл К=ТЗ.ПолучитьПараметрыКолонки(Сч); Сообщить(К+"=="+Запрос.ПолучитьАтрибут(К)); КонецЦикла; ОтменитьТранзакцию(); |
|||
23
AlexS1C
07.05.13
✎
20:44
|
(22) Время 26712! Я думаю что, если уложить ТЗ, и с помощью прямого запроса достать может тогда и будет какой прирост.Только как функция на SQL "СтрДлина" - называется? Правда еще вопрос с типизацией, длина наверное посчитается по внутреннему идентификатору....
|
|||
24
AlexS1C
07.05.13
✎
20:46
|
(22) Спасибо за эксперименты!!!))) Но походы скорость циклом 1730 не побить!
|
|||
25
Ковычки
07.05.13
✎
21:03
|
побидить с установкой ширины при формированиии тз или таблицы
|
|||
26
AlexS1C
07.05.13
✎
21:16
|
(25) Таблицы
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |