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


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

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

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

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

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

ТабДок = Новый ТабличныйДокумент;
ТекВысота = 512;
ДобавВысота = 0;

Пока Истина Цикл
СтрТабДока = ТабДок.ПолучитьОбласть(,,1);
СтрТабДока.ТекущаяОбласть.ВысотаСтроки = ТекВысота;
МассивТабДоков.Добавить(СтрТабДока);

Если ТабДок.ПроверитьВывод(МассивТабДоков) Тогда
ДобавВысота = ДобавВысота + ТекВысота;
Иначе
Если ТекВысота > 1 Тогда
МассивТабДоков.Удалить(МассивТабДоков.ВГраница());
ТекВысота = ТекВысота / 2;
Иначе
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;

ОбщВысота = 785;//вычислена ранее этой же функцией: ВысотаОбластиТабДока(Новый ТабличныйДокумент)
Возврат ОбщВысота - ДобавВысота;
КонецФункции

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

7 Comments

  1. json

    Плюс за еще один способ.

    Но способ с рисунком из публикации Поместится ли текст в ячейке? (с примерами использования: авторазмер шрифта, перенос строк) работает на порядок быстрее

    Если в цикле не вызывать, то в общем-то без разницы

    Reply
  2. Патриот

    (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,ТабДок));//Истина
    Reply
  3. json

    Я использую упрощенный вариант этой функции

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

    Показать

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

    Зависимость прямо пропорциональная:

    Результат = РезультатВММ * НекоторыйКоэффициент;

    Проверял на платформе 8.3.7.1917.

    Должна работать и на более ранних и более поздних.

    Reply
  4. Патриот

    (3) yurii_host, спасибо, ваш код работает. Он отличается от кода из предложенной вами статьи тем, что создаётся НОВЫЙ табличный документ и в него уже вставляется и измеряемая область и используемый для измерения рисунок. Способ, очевидно, д.б. эффективней, чем предложенный в моей статье, о чём при случае допишу. Самое главное, что я сам сразу же хотел решить проблему именно так, но не догадался копировать область в НОВЫЙ ТабДок из-за чего зря отбросил незаконченное решение и после некоторых раздумий сделал так, как написал в данной статье.

    Reply
  5. user1086697

    (3) Вы тестировали свою функцию? Просто мне для некоторого задания было необходимо узнать высоту строк. И так вот, тестировала на разных шрифтах с различными начертаниями. И на многих тестах ответ даёт не верный, где-то прямо на целую строку высота больше, где-то текст не полностью влазит. Вывод, функция автора и ваша не корректны, либо я что-то упускаю. Буду благодарна за обратную связь!

    Reply
  6. json

    (5) Милая моя, для моих задач функция работала корректно. И дело тут не в тестировании. Похоже она не работает для твоих задач, потому что ты используешь нестандартные шрифты.

    Поэтому ты можешь быть благодарна за те наработки, которые выложили другие и адаптировать их под себя.

    А если у тебя недостаточно опыта, чтобы сделать это самостоятельно, то можно обратиться за помощью. При этом подобная манера общения не располагает к тому, чтобы кто-то потратил время на помощь тебе.

    Reply
  7. user1086697

    (6) Милый мой, Я никого ни в чем не обвиняю. Естественно, я благодарна за наработки. Но даже для интереса, со стандартными шрифтами тоже плохо работает. На это есть пример. Прежде чем выкладывать и говорить, что вы правы, надо проверять свои программы

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *