При разработке сложных печатных форм в 1С программисты часто сталкиваются с фундаментальным ограничением объекта ТабличныйДокумент: строка в нем всегда имеет единую высоту по всей своей протяженности. Если в одной колонке текст растягивается из-за свойства Автовысота, то и все остальные ячейки в этой же строке увеличиваются, что зачастую портит верстку, особенно если левая часть документа должна оставаться компактной, а правая содержит объемные данные. В этой статье мы подробно разберем, как обойти это ограничение, используя различные "велосипеды" и профессиональные приемы.
Проанализируем наиболее изящный с визуальной точки зрения способ — вставку одного табличного документа внутрь другого в качестве рисунка. Платформа 1С позволяет размещать на листе не только статические картинки, но и динамические объекты, обладающие собственной сеткой строк и колонок.
Рассмотрим пошагово, как это реализовать:
ТабличныйДокумент.РисунокТабличногоДокумента и установим его тип в значение ТипРисункаТабличногоДокумента.ТабличныйДокумент.Преимущество данного метода заключается в том, что внутренняя таблица живет по своим правилам. Ее строки могут расширяться как угодно, при этом они абсолютно не влияют на высоту строк "родительского" документа. Выясним причину популярности этого метода: он позволяет имитировать сложную верстку без необходимости пересчитывать координаты каждой ячейки.
Разберем ситуацию, когда использование рисунков невозможно (например, из-за требований к поиску текста в документе или специфики экспорта). В этом случае мы можем прибегнуть к методу "микро-сетки". Суть заключается в том, чтобы сделать базовую высоту строки в документе минимальной (например, 2 или 4 пункта).
Посмотрим, как это выглядит на практике:
Вместо того чтобы выводить одну логическую строку текста, мы выводим множество физических узких строк. Для левой части (текста) мы объединяем, скажем, 10 микро-строк по вертикали. Для правой части, если текста много, мы программно рассчитываем, сколько микро-строк нужно объединить, чтобы вместить весь контент.
Для реализации этого алгоритма нам понадобится метод ПроверитьВысоту(). Проанализируем примерный код для расчета необходимого количества строк:
// Создаем временный документ для замера
ВременныйТабДок = Новый ТабличныйДокумент;
ОбластьЗамера = Макет.ПолучитьОбласть("СтрокаТаблицы");
ОбластьЗамера.Параметры.Текст = ДанныеДляВывода;
ВременныйТабДок.Вывести(ОбластьЗамера);
// Проверяем, сколько места занимает текст
// Этот метод помогает косвенно определить реальную высоту
Если НЕ ВременныйТабДок.ПроверитьВысоту(ЖелаемаяВысота) Тогда
// Если не влезло, увеличиваем количество объединяемых микро-строк
КонецЕсли;
Используя этот подход, мы фактически превращаем табличный редактор в систему координат, где минимальный шаг — это высота нашей микро-строки. Это требует сложного программного кода для вывода, но результат будет выглядеть максимально профессионально.
Рассмотрим еще один вариант, упомянутый опытными разработчиками: ручное разбиение и объединение. Если мы заранее знаем, что правая часть документа будет в два раза выше левой, мы можем вывести в левой части одну область, объединяющую две строки, а в правой — две области по одной строке.
Однако здесь кроется главная проблема: как узнать реальную высоту строки при включенной Автовысоте до того, как документ будет окончательно сформирован? Платформа 1С не предоставляет прямого свойства ВысотаСтрокиВПунктах для строк с автоматическим подбором размера.
Выясним, как обойти это ограничение. Мы можем использовать временный табличный документ в качестве "песочницы":
ПроверитьВысоту() в цикле, постепенно увеличивая высоту области, пока метод не вернет Истина.Если задача стоит в отображении данных на форме, а не в строгой подготовке печатной формы для принтера, мы крайне рекомендуем рассмотреть использование Поля HTML-документа. В языке HTML верстка с независимыми высотами ячеек реализуется стандартными средствами table или flexbox.
Проанализируем ситуацию: внутри ячейки основной таблицы HTML можно разместить еще одну таблицу:
<table style="width: 100%;">
<tr>
<td style="vertical-align: top;">Левая часть (Текст)</td>
<td>
<table>
<tr><td>Строка 1 правой части (Автовысота)</td></tr>
<tr><td>Строка 2 правой части (Очень длинный текст)</td></tr>
</table>
</td>
</tr>
</table>
Такой подход полностью снимает ограничения 1С, но требует навыков верстки и формирования HTML-строки в коде 1С. При этом результат можно не только просматривать, но и распечатать, так как 1С неплохо справляется с выводом HTML на печать.
При работе с любым из перечисленных методов, не забывайте про свойство РазмещениеТекста. В левой части, которая должна сохранять фиксированный размер, установите значение Обрезать или Переносить, но с жестко заданным размером шрифта. В правой части, где данные критически важны, используйте Автовысота в сочетании с Переносить.
Также стоит помнить, что при использовании метода Присоединить(), если присоединяемая область имеет свойство Автовысота, платформа все равно попытается подогнать высоту всей строки итогового документа. Поэтому единственным гарантированным способом получить разную высоту строк в рамках одной горизонтальной полосы без использования рисунков является именно вертикальное объединение мелких ячеек (микро-сетка).
Подведем итог: штатного переключателя "независимая высота колонок" в 1С не существует. Однако, используя вложенные табличные документы (рисунки) или программный расчет через микро-сетку, можно добиться профессионального качества отчетов, отвечающих любым требованиям заказчика. Выбор метода зависит от того, насколько важна для вас производительность формирования отчета и возможность последующего редактирования документа пользователем.