При формировании печатных форм в 1С часто возникает задача, когда содержимое ячеек имеет разный объем текста. Использование стандартного свойства АвтоВысотаСтроки не всегда позволяет привести все строки таблицы к единому визуальному стандарту, если мы хотим, чтобы все строки документа имели высоту по самой «высокой» из них. Рассмотрим, как эффективно решить эту задачу программными методами.
Основная сложность заключается в том, что до момента вывода области в ТабличныйДокумент платформа не выполняет точный расчет размеров текста. Попытки вычислить высоту через дополнительные объекты Рисунок часто приводят к неверным результатам, так как системы координат рисунка и ячеек таблицы работают независимо друг от друга. Давайте разберем более надежные подходы.
Рассмотрим самый надежный способ — использование «буферного» или технического табличного документа. Суть метода заключается в том, чтобы сначала вывести данные в скрытый документ, позволить платформе рассчитать размеры, а затем считать полученные значения.
Разберем алгоритм по шагам:
ТабличныйДокумент.АвтоВысотаСтроки = Истина.ВысотаСтроки определяем реальный размер каждой строки.
// Пример логики расчета максимальной высоты
ВремТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ПФ_MXL_МойМакет");
Область = Макет.ПолучитьОбласть("ОБластьСтрока");
// Заполняем данными
Область.Параметры.Текст = ДанныеДляВывода;
ВремТабДок.Вывести(Область);
// После вывода строки 1 в ВремТабДок, она уже имеет рассчитанную высоту
МаксВысота = ВремТабДок.Область(1, 1, 1, 1).ВысотаСтроки;
// Устанавливаем эту высоту в основном документе
ОсновнойТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).ВысотаСтроки = МаксВысота;
Если по каким-то причинам использование технического документа не подходит, можно попробовать отключить АвтоВысотаСтроки и управлять параметром ВысотаСтроки напрямую. Это требует эмпирического подхода.
Рассмотрим вариант расчета на основе количества символов:
// Установка высоты строки программно
ОбластьСтроки = ТабДок.Область(НомерСтроки, , НомерСтроки, );
ОбластьСтроки.АвтоВысотаСтроки = Ложь;
ОбластьСтроки.ВысотаСтроки = 30; // Устанавливаем фиксированную высоту
Проанализируем ситуацию: попытки манипулировать объектами Рисунки внутри области до её вывода в ТабличныйДокумент практически всегда приводят к нулевым значениям высоты. Это происходит потому, что платформа рассчитывает геометрию ячеек только в момент их фактического размещения в результирующем документе.
Совет: если печатная форма содержит очень сложную верстку, лучше всего выводить каждую строку в технический документ, запоминать её высоту, а затем формировать итоговую таблицу. Такой подход исключает ошибки округления и различия в единицах измерения (миллиметры и пункты), с которыми часто сталкиваются разработчики при работе с ТабличныйДокумент.
Всегда помните, что свойство ВысотаСтроки измеряется в пунктах, и при выполнении расчетов старайтесь приводить все данные к единой системе координат. Если вы планируете масштабировать решение, метод с использованием «чернового» вывода является наиболее профессиональным и устойчивым к изменениям настроек шрифтов и размеров полей макета.