gifts2017

Определение высоты области табличного документа при выставленном флаге автовысоты

Опубликовал Александр Полтава (Патриот) в раздел Программирование - Инструментарий

Платформа сие не позволяет сделать непосредственно. Если АвтоВысотаСтроки = Истина, то ВысотаСтроки в таком случае будет равна нулю. Раз нельзя сделать непосредственно, значит, сделаем посредством имеющихся средств.

Столкнулся давеча с проблемой:
У коллеги возникла необходимость узнать высоту строки табличного документа, при выставленном флаге автовысоты. Платформа сие не позволяет сделать непосредственно. Если АвтоВысотаСтроки = Истина, то ВысотаСтроки в таком случае будет равна нулю. Раз нельзя сделать непосредственно, значит сделаем посредством имеющихся средств, но коллегу в беде не бросим =). Ниже приведён код реализации. В качестве файла приложена обработка с наглядной демонстрацией решения (нужно открыть её в предприятии и нажать "Выполнить").

Откуда возникла задача (немного упрощаю пример):
Рассмотрим первую строку табличного документа. Необходимо, чтобы высота строки устанавливалась по высоте первой ячейки. В первой ячейке может быть разный текст и задать её высоту фиксировано нельзя. АвтоВысотаСтроки тоже не спасает положение, т.к. в качестве неё возьмётся максимальная из высот всех ячеек строки, а нам позарез надо ориентироваться на первую. Поэтому было принято решение найти высоту первой ячейки с выставленным АвтоВысотаСтроки = Истина, после чего установить найденную высоту для строки.

З.Ы. также для увеличения производительности поиска высоты строки пришлось применить метод половинного деления. 

//Описание: назначение очевидно из названия
//Для областей табличного документа с признаком автовысоты строки платформа не позволяет вычислить высоту строки.
//Поэтому можно воспользоваться этой функцией.
//
//Описание реализации:
//Существенно повысило скорость измерение строками не единичной высоты, а наиболее подходящей
//Но как ни печально, практический опыт показал, например,
//что одна строка высотой 512, равна примерно пятиста строкам высотой 1
//т.е. слегка понижается точность измерения.
//
//Пример вызова:
//ВысотаПервойЯчейки = ВысотаОбластиТабДока(ЭлементыФормы.ПолеТабличногоДокумента1.ПолучитьОбласть(,,1,1));
//
//Автор: Патриот
Функция ВысотаОбластиТабДока(ИзмеряемыйТабДок)
	МассивТабДоков = Новый Массив;
	МассивТабДоков.Добавить(ИзмеряемыйТабДок);
	
	ТабДок = Новый ТабличныйДокумент;
	ТекВысота = 512;
	ДобавВысота = 0;
	
	Пока Истина Цикл
		СтрТабДока = ТабДок.ПолучитьОбласть(,,1);
		СтрТабДока.ТекущаяОбласть.ВысотаСтроки = ТекВысота;
		МассивТабДоков.Добавить(СтрТабДока);
		
		Если ТабДок.ПроверитьВывод(МассивТабДоков) Тогда
			ДобавВысота = ДобавВысота + ТекВысота;
		Иначе	
			Если ТекВысота > 1 Тогда
				МассивТабДоков.Удалить(МассивТабДоков.ВГраница());
				ТекВысота = ТекВысота / 2;
			Иначе
				Прервать;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	ОбщВысота = 785;//вычислена ранее этой же функцией: ВысотаОбластиТабДока(Новый ТабличныйДокумент)
	Возврат ОбщВысота - ДобавВысота;
КонецФункции

------------------------------------
ИНТЕРЕСНЫХ ВАМ ЗАДАЧ, ПЛОДОТВОРНОЙ РАБОТЫ И ОРИГИНАЛЬНЫХ/ОПТИМАЛЬНЫХ РЕШЕНИЙ!!

Скачать файлы

Наименование Файл Версия Размер
ВысотаОбластиТабДока.epf 2
.epf 7,72Kb
08.04.16
2
.epf 7,72Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Пишу код как картины (yurii_host) 08.04.16 16:06
Плюс за еще один способ.
Но способ с рисунком из публикации Поместится ли текст в ячейке? (с примерами использования: авторазмер шрифта, перенос строк) работает на порядок быстрее
Если в цикле не вызывать, то в общем-то без разницы
2. Александр Полтава (Патриот) 11.04.16 10:14
(1) yurii_host, за ссыль спасибо, когда искал решение в интернете, то предложенную вами статью не видел, ибо искал про "высоту строки", а тут про "поместится ли текст в ячейке" поэтому поисковик её не выдал.
Данный способ пытался воплотить в жизнь и я, ибо когда пришло осознание, что платформа не даёт узнать высоту строки/ячейки/любой другой области, первое что я придумал - если нельзя замерить строку, может можно узнать высоту какого-нибудь объекта, помещённого в ячейку? Но этого сделать не удалось, потому я реализовал решение, представленное в данной статье.

На всякий пожарный протестил функцию из указанной вами статьи. На последних версиях платформы она не работает.
Пробовал добавлять "Надпись.АвтоРазмер = Истина" - не помогает. Вот код:
	//тестил на 8.2.19.121 и 8.3.7.1993
	ТабДок = Новый ТабличныйДокумент;
	Ячейка1_1 = ТабДок.Область(1,1);
	Ячейка1_2 = ТабДок.Область(1,2);
	Ячейка1_2.Текст = "1" + Символы.ПС + "2" + Символы.ПС + "3";
	Сообщить(ВысотаОбластиВмм(Ячейка1_1,ТабДок) = ВысотаОбластиВмм(Ячейка1_2,ТабДок));//Истина
...Показать Скрыть
3. Пишу код как картины (yurii_host) 12.04.16 11:13
Я использую упрощенный вариант этой функции

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

КонецФункции
...Показать Скрыть


Значения с вашей функцией не совпадут, т.к. результат она выдает в миллиметрах, а ваша функция в "не знаю точно как называется эта единица".

Зависимость прямо пропорциональная:
Результат = РезультатВММ * НекоторыйКоэффициент;

Проверял на платформе 8.3.7.1917.
Должна работать и на более ранних и более поздних.
Патриот; +1 Ответить 1
4. Александр Полтава (Патриот) 12.04.16 14:25
(3) yurii_host, спасибо, ваш код работает. Он отличается от кода из предложенной вами статьи тем, что создаётся НОВЫЙ табличный документ и в него уже вставляется и измеряемая область и используемый для измерения рисунок. Способ, очевидно, д.б. эффективней, чем предложенный в моей статье, о чём при случае допишу. Самое главное, что я сам сразу же хотел решить проблему именно так, но не догадался копировать область в НОВЫЙ ТабДок из-за чего зря отбросил незаконченное решение и после некоторых раздумий сделал так, как написал в данной статье.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа