Как программно установить высоту строк в табличном документе по максимальному значению?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При формировании печатных форм в 1С часто возникает задача, когда содержимое ячеек имеет разный объем текста. Использование стандартного свойства АвтоВысотаСтроки не всегда позволяет привести все строки таблицы к единому визуальному стандарту, если мы хотим, чтобы все строки документа имели высоту по самой «высокой» из них. Рассмотрим, как эффективно решить эту задачу программными методами.

Понимание проблемы

Основная сложность заключается в том, что до момента вывода области в ТабличныйДокумент платформа не выполняет точный расчет размеров текста. Попытки вычислить высоту через дополнительные объекты Рисунок часто приводят к неверным результатам, так как системы координат рисунка и ячеек таблицы работают независимо друг от друга. Давайте разберем более надежные подходы.

Решение через технический табличный документ

Рассмотрим самый надежный способ — использование «буферного» или технического табличного документа. Суть метода заключается в том, чтобы сначала вывести данные в скрытый документ, позволить платформе рассчитать размеры, а затем считать полученные значения.

Разберем алгоритм по шагам:

  1. Создаем в памяти пустой ТабличныйДокумент.
  2. Выводим в него нужные области из макета, применив свойство АвтоВысотаСтроки = Истина.
  3. Проходим в цикле по строкам этого документа и с помощью свойства ВысотаСтроки определяем реальный размер каждой строки.
  4. Находим среди них максимальное значение.
  5. Применяем полученный максимум к строкам основного документа, который будет показан пользователю.

// Пример логики расчета максимальной высоты
ВремТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ПФ_MXL_МойМакет");
Область = Макет.ПолучитьОбласть("ОБластьСтрока");
// Заполняем данными
Область.Параметры.Текст = ДанныеДляВывода;
ВремТабДок.Вывести(Область);

// После вывода строки 1 в ВремТабДок, она уже имеет рассчитанную высоту
МаксВысота = ВремТабДок.Область(1, 1, 1, 1).ВысотаСтроки;

// Устанавливаем эту высоту в основном документе
ОсновнойТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).ВысотаСтроки = МаксВысота;

Программное управление высотой без автовысоты

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

Рассмотрим вариант расчета на основе количества символов:


// Установка высоты строки программно
ОбластьСтроки = ТабДок.Область(НомерСтроки, , НомерСтроки, );
ОбластьСтроки.АвтоВысотаСтроки = Ложь;
ОбластьСтроки.ВысотаСтроки = 30; // Устанавливаем фиксированную высоту

Важные рекомендации по реализации

Проанализируем ситуацию: попытки манипулировать объектами Рисунки внутри области до её вывода в ТабличныйДокумент практически всегда приводят к нулевым значениям высоты. Это происходит потому, что платформа рассчитывает геометрию ячеек только в момент их фактического размещения в результирующем документе.

Совет: если печатная форма содержит очень сложную верстку, лучше всего выводить каждую строку в технический документ, запоминать её высоту, а затем формировать итоговую таблицу. Такой подход исключает ошибки округления и различия в единицах измерения (миллиметры и пункты), с которыми часто сталкиваются разработчики при работе с ТабличныйДокумент.

Всегда помните, что свойство ВысотаСтроки измеряется в пунктах, и при выполнении расчетов старайтесь приводить все данные к единой системе координат. Если вы планируете масштабировать решение, метод с использованием «чернового» вывода является наиболее профессиональным и устойчивым к изменениям настроек шрифтов и размеров полей макета.

← На главную