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

Программист 1С v8.3 (Обычные формы)
← На главную

В процессе разработки печатных форм и журналов в 1С часто возникает задача сделать документ интерактивным. Типичный пример — журнал инструктажа, где пользователь прямо в выведенной форме выбирает темы из справочника. Однако при добавлении длинного текста высота строки не всегда подстраивается автоматически, что приводит к «обрезанию» информации. Разберем подробно, как решить проблему автоматического изменения высоты строки в уже сформированном табличном документе, особенно для конфигураций на обычных формах, таких как УПП 1.2.

Причина проблемы: почему стандартные настройки не работают

Многие разработчики начинают с установки стандартных свойств области в макете или программно. Обычно это следующий набор команд:


Область.АвтоВысотаСтроки = Истина;
Область.РастягиватьПоГоризонтали = Истина;
Область.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;

Проанализируем ситуацию: если эти настройки заданы, но высота не меняется, скорее всего, вы столкнулись с одним из двух ограничений платформы 1С:

  1. Объединенные ячейки. Это самая частая причина. Если ваша ячейка с темой инструктажа получена путем объединения нескольких колонок, стандартный механизм АвтоВысотаСтроки перестает работать корректно. Платформа просто не может вычислить высоту для сложной структуры колонок.
  2. Фиксированная высота в макете. Если в макете для этой строки вручную задана высота (даже если она кажется «автоматической»), платформа может игнорировать программную установку флага АвтоВысотаСтроки.

Решение 1: Правильная программная инициализация высоты

Рассмотрим первый метод, который помогает в простых случаях (без объединения ячеек). Чтобы заставить 1С пересчитать высоту, нужно не только установить флаг, но и сбросить текущее значение высоты в ноль. Это дает платформе сигнал, что размер строки не определен и его нужно рассчитать исходя из содержимого.

В обработчике события ПолеТабличногоДокумента1Выбор (или аналогичном) выполните следующий код:


// Получаем текущую строку, где произошло изменение
НомерСтроки = Элемент.ТекущаяОбласть.Верх;
ОбластьСтроки = Элемент.Область(НомерСтроки, , НомерСтроки, );

// Устанавливаем свойства для переноса и автовысоты
ОбластьСтроки.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
ОбластьСтроки.АвтоВысотаСтроки = Истина;

// КРИТИЧЕСКИ ВАЖНО: устанавливаем высоту в 0 для принудительного пересчета
ОбластьСтроки.ВысотаСтроки = 0;

Решение 2: Метод скрытого расчетного документа (универсальный)

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

Разберем этот процесс по шагам:

  1. Создаем новый объект ТабличныйДокумент в оперативной памяти.
  2. Задаем в нем ширину колонки, равную суммарной ширине всех колонок, которые занимает наша тема инструктажа в основном документе.
  3. Помещаем туда текст и включаем АвтоВысотаСтроки.
  4. Считываем полученное значение и возвращаем его в основной документ.

Пример реализации функции для вычисления высоты:


Функция РассчитатьВысотуСтроки(Текст, ШиринаКолонки)
    
    ВремТабДок = Новый ТабличныйДокумент;
    // Устанавливаем ширину колонки точно как в оригинале
    ВремТабДок.Область("C1").ШиринаКолонки = ШиринаКолонки;
    
    // Заполняем ячейку данными
    Ячейка = ВремТабДок.Область("R1C1");
    Ячейка.Текст = Текст;
    Ячейка.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
    
    // Включаем автовысоту для строки
    ВремТабДок.Область("R1").АвтоВысотаСтроки = Истина;
    ВремТабДок.Область("R1").ВысотаСтроки = 0;
    
    // Платформа рассчитает высоту при попытке обращения к ней
    Возврат ВремТабДок.Область("R1").ВысотаСтроки;
    
КонецФункции

Затем в событии выбора вызовем эту функцию и установим значение:


// Пример вызова
ШиринаОбласти = ТекущаяОбласть.ШиринаКолонки; // Если колонка одна
// Если ячейка объединена, нужно просуммировать ширину всех входящих колонок
НоваяВысота = РассчитатьВысотуСтроки(НоваяТемаИнструктажа, ШиринаОбласти);
ОбластьСтроки.ВысотаСтроки = НоваяВысота;

Решение 3: Подмена областей макета

Проанализируем еще один подход, предложенный в обсуждении: использование заранее подготовленных областей макета. Если мы знаем, что темы инструктажа обычно укладываются в 1, 2 или 3 строки, мы можем создать в макете три варианта одной и той же строки с разной фиксированной высотой.

Выясним причину выбора этого метода: он работает быстрее, чем создание временных документов, и гарантирует предсказуемый визуальный результат. Однако он менее гибкий.

Рассмотрим алгоритм действий:

  1. В макете создаем области Строка_1_линия, Строка_2_линии, Строка_3_линии.
  2. При выборе темы проверяем длину текста функцией СтрДлина() или считаем количество символов ПС (перенос строки).
  3. Используем метод ВставитьОбласть(), чтобы заменить текущую строку на нужную область из макета.

Пример кода для выбора области:


ДлинаТекста = СтрДлина(ВыбраннаяТема);
Если ДлинаТекста > 100 Тогда
    НужнаяОбласть = Макет.ПолучитьОбласть("Строка_3_линии");
ИначеЕсли ДлинаТекста > 50 Тогда
    НужнаяОбласть = Макет.ПолучитьОбласть("Строка_2_линии");
Иначе
    НужнаяОбласть = Макет.ПолучитьОбласть("Строка_1_линия");
КонецЕсли;

// Заполняем область и выводим (или подменяем в уже выведенном ТабДоке)
НужнаяОбласть.Параметры.Тема = ВыбраннаяТема;

Важные нюансы и советы

При работе с динамической высотой в Обычных формах (как в УПП 1.2) стоит учитывать следующие моменты:

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

← На главную