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

08.04.16

Разработка - Инструментарий разработчика

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

Скачать исходный код

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

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

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

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

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

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

Табличный документ Высота строки табличного документа

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    125073    683    389    

732

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7797    24    6    

42

Infostart УДиФ: Управление данными и формами 1С

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    4297    12    2    

36

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2280 руб.

14.01.2013    178681    1084    0    

862

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99653    239    97    

298

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18410    6    8    

40

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23864    16    15    

33

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28331    3    10    

16
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. json 3306 08.04.16 16:06 Сейчас в теме
Плюс за еще один способ.
Но способ с рисунком из публикации Поместится ли текст в ячейке? (с примерами использования: авторазмер шрифта, перенос строк) работает на порядок быстрее
Если в цикле не вызывать, то в общем-то без разницы
2. Патриот 450 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. json 3306 12.04.16 11:13 Сейчас в теме
Я использую упрощенный вариант этой функции

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

КонецФункции
Показать


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

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

Проверял на платформе 8.3.7.1917.
Должна работать и на более ранних и более поздних.
CaSH_2004; naypak; FreeMan69; Leon75; Olga12; LosevI; Патриот; +7 Ответить
4. Патриот 450 12.04.16 14:25 Сейчас в теме
(3) yurii_host, спасибо, ваш код работает. Он отличается от кода из предложенной вами статьи тем, что создаётся НОВЫЙ табличный документ и в него уже вставляется и измеряемая область и используемый для измерения рисунок. Способ, очевидно, д.б. эффективней, чем предложенный в моей статье, о чём при случае допишу. Самое главное, что я сам сразу же хотел решить проблему именно так, но не догадался копировать область в НОВЫЙ ТабДок из-за чего зря отбросил незаконченное решение и после некоторых раздумий сделал так, как написал в данной статье.
5. user1086697 02.04.19 17:38 Сейчас в теме
(3) Вы тестировали свою функцию? Просто мне для некоторого задания было необходимо узнать высоту строк. И так вот, тестировала на разных шрифтах с различными начертаниями. И на многих тестах ответ даёт не верный, где-то прямо на целую строку высота больше, где-то текст не полностью влазит. Вывод, функция автора и ваша не корректны, либо я что-то упускаю. Буду благодарна за обратную связь!
6. json 3306 03.04.19 06:44 Сейчас в теме
(5) Милая моя, для моих задач функция работала корректно. И дело тут не в тестировании. Похоже она не работает для твоих задач, потому что ты используешь нестандартные шрифты.
Поэтому ты можешь быть благодарна за те наработки, которые выложили другие и адаптировать их под себя.
А если у тебя недостаточно опыта, чтобы сделать это самостоятельно, то можно обратиться за помощью. При этом подобная манера общения не располагает к тому, чтобы кто-то потратил время на помощь тебе.
7. user1086697 03.04.19 08:17 Сейчас в теме
(6) Милый мой, Я никого ни в чем не обвиняю. Естественно, я благодарна за наработки. Но даже для интереса, со стандартными шрифтами тоже плохо работает. На это есть пример. Прежде чем выкладывать и говорить, что вы правы, надо проверять свои программы
8. resonance 81 20.03.20 12:46 Сейчас в теме
9. Патриот 450 20.03.20 15:50 Сейчас в теме
(8) Пожалуйста! От "спасибо" будет приятнее, если выразите его в качестве плюса к статье =)
Оставьте свое сообщение