Столкнулся давеча с проблемой:
У коллеги возникла необходимость узнать высоту строки табличного документа, при выставленном флаге автовысоты. Платформа сие не позволяет сделать непосредственно. Если АвтоВысотаСтроки = Истина, то ВысотаСтроки в таком случае будет равна нулю. Раз нельзя сделать непосредственно, значит сделаем посредством имеющихся средств, но коллегу в беде не бросим =). Ниже приведён код реализации. В качестве файла приложена обработка с наглядной демонстрацией решения (нужно открыть её в предприятии и нажать «Выполнить»).
Откуда возникла задача (немного упрощаю пример):
Рассмотрим первую строку табличного документа. Необходимо, чтобы высота строки устанавливалась по высоте первой ячейки. В первой ячейке может быть разный текст и задать её высоту фиксировано нельзя. АвтоВысотаСтроки тоже не спасает положение, т.к. в качестве неё возьмётся максимальная из высот всех ячеек строки, а нам позарез надо ориентироваться на первую. Поэтому было принято решение найти высоту первой ячейки с выставленным АвтоВысотаСтроки = Истина, после чего установить найденную высоту для строки.
З.Ы. также для увеличения производительности поиска высоты строки пришлось применить метод половинного деления.
//Описание: назначение очевидно из названия
//Для областей табличного документа с признаком автовысоты строки платформа не позволяет вычислить высоту строки.
//Поэтому можно воспользоваться этой функцией.
//
//Описание реализации:
//Существенно повысило скорость измерение строками не единичной высоты, а наиболее подходящей
//Но как ни печально, практический опыт показал, например,
//что одна строка высотой 512, равна примерно пятиста строкам высотой 1
//т.е. слегка понижается точность измерения.
//
//Пример вызова:
//ВысотаПервойЯчейки = ВысотаОбластиТабДока(ЭлементыФормы.ПолеТабличногоДокумента1.ПолучитьОбласть(,,1,1));
//
//Автор: Патриот
Функция ВысотаОбластиТабДока(ИзмеряемыйТабДок)
МассивТабДоков = Новый Массив;
МассивТабДоков.Добавить(ИзмеряемыйТабДок);
ТабДок = Новый ТабличныйДокумент;
ТекВысота = 512;
ДобавВысота = 0;
Пока Истина Цикл
СтрТабДока = ТабДок.ПолучитьОбласть(,,1);
СтрТабДока.ТекущаяОбласть.ВысотаСтроки = ТекВысота;
МассивТабДоков.Добавить(СтрТабДока);
Если ТабДок.ПроверитьВывод(МассивТабДоков) Тогда
ДобавВысота = ДобавВысота + ТекВысота;
Иначе
Если ТекВысота > 1 Тогда
МассивТабДоков.Удалить(МассивТабДоков.ВГраница());
ТекВысота = ТекВысота / 2;
Иначе
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ОбщВысота = 785;//вычислена ранее этой же функцией: ВысотаОбластиТабДока(Новый ТабличныйДокумент)
Возврат ОбщВысота - ДобавВысота;
КонецФункции
————————————
ИНТЕРЕСНЫХ ВАМ ЗАДАЧ, ПЛОДОТВОРНОЙ РАБОТЫ И ОРИГИНАЛЬНЫХ/ОПТИМАЛЬНЫХ РЕШЕНИЙ!!
Плюс за еще один способ.
Поместится ли текст в ячейке? (с примерами использования: авторазмер шрифта, перенос строк) работает на порядок быстрее
Но способ с рисунком из публикации
Если в цикле не вызывать, то в общем-то без разницы
(1) yurii_host, за ссыль спасибо, когда искал решение в интернете, то предложенную вами статью не видел, ибо искал про «высоту строки», а тут про «поместится ли текст в ячейке» поэтому поисковик её не выдал.
Данный способ пытался воплотить в жизнь и я, ибо когда пришло осознание, что платформа не даёт узнать высоту строки/ячейки/любой другой области, первое что я придумал — если нельзя замерить строку, может можно узнать высоту какого-нибудь объекта, помещённого в ячейку? Но этого сделать не удалось, потому я реализовал решение, представленное в данной статье.
На всякий пожарный протестил функцию из указанной вами статьи. На последних версиях платформы она не работает.
Пробовал добавлять «Надпись.АвтоРазмер = Истина» — не помогает. Вот код:
Я использую упрощенный вариант этой функции
Показать
Значения с вашей функцией не совпадут, т.к. результат она выдает в миллиметрах, а ваша функция в «не знаю точно как называется эта единица».
Зависимость прямо пропорциональная:
Результат = РезультатВММ * НекоторыйКоэффициент;
Проверял на платформе 8.3.7.1917.
Должна работать и на более ранних и более поздних.
(3) yurii_host, спасибо, ваш код работает. Он отличается от кода из предложенной вами статьи тем, что создаётся НОВЫЙ табличный документ и в него уже вставляется и измеряемая область и используемый для измерения рисунок. Способ, очевидно, д.б. эффективней, чем предложенный в моей статье, о чём при случае допишу. Самое главное, что я сам сразу же хотел решить проблему именно так, но не догадался копировать область в НОВЫЙ ТабДок из-за чего зря отбросил незаконченное решение и после некоторых раздумий сделал так, как написал в данной статье.
(3) Вы тестировали свою функцию? Просто мне для некоторого задания было необходимо узнать высоту строк. И так вот, тестировала на разных шрифтах с различными начертаниями. И на многих тестах ответ даёт не верный, где-то прямо на целую строку высота больше, где-то текст не полностью влазит. Вывод, функция автора и ваша не корректны, либо я что-то упускаю. Буду благодарна за обратную связь!
(5) Милая моя, для моих задач функция работала корректно. И дело тут не в тестировании. Похоже она не работает для твоих задач, потому что ты используешь нестандартные шрифты.
Поэтому ты можешь быть благодарна за те наработки, которые выложили другие и адаптировать их под себя.
А если у тебя недостаточно опыта, чтобы сделать это самостоятельно, то можно обратиться за помощью. При этом подобная манера общения не располагает к тому, чтобы кто-то потратил время на помощь тебе.
(6) Милый мой, Я никого ни в чем не обвиняю. Естественно, я благодарна за наработки. Но даже для интереса, со стандартными шрифтами тоже плохо работает. На это есть пример. Прежде чем выкладывать и говорить, что вы правы, надо проверять свои программы