Как программно изменить свойства ячейки табличного документа, чтобы текст переносился и строка расширялась

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

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

Анализ проблемы: почему свойство «РазмещениеТекста» не всегда работает

Часто разработчики пытаются изменить только свойство РазмещениеТекста, устанавливая его в значение Переносить. Однако, если в самом макете для строки жестко задана высота, или не включена опция автоматического подбора высоты, текст в результирующем документе останется визуально «обрезанным», хотя программно свойство будет установлено верно. Разберем по шагам, как решить эту проблему комплексно.

Шаг 1. Правильное обращение к области табличного документа

Для начала проанализируем, где именно нужно менять свойства. Автор темы пытался менять их в ОбластиМакета. Это не всегда эффективно, так как при выводе области в итоговый табличный документ свойства могут переопределяться или игнорироваться движком печати, если не соблюдена последовательность действий.

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


// 1. Получаем область из макета
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");

// 2. Заполняем параметры области
ОбластьСтроки.Параметры.НоменклатураНаименование = "Очень длинное наименование товара, которое не помещается в одну строку";

// 3. Выводим область в результирующий табличный документ
ТабДок.Вывести(ОбластьСтроки);

// 4. Получаем доступ к только что выведенной области в итоговом документе
// Определяем границы выведенной области
НомерПоследнейСтроки = ТабДок.ВысотаТаблицы;
ОбластьРезультата = ТабДок.Область(НомерПоследнейСтроки, 2, НомерПоследнейСтроки, 2); // Например, вторая колонка

Обратите внимание, что мы работаем с ТабДок — это наш итоговый документ. После метода Вывести() строка уже находится в нем, и мы можем точечно менять её оформление.

Шаг 2. Установка свойств «РазмещениеТекста» и «АвтоВысотаСтроки»

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

  1. РазмещениеТекста — определяет, что делать с текстом, если он не влезает (обрезать, забивать или переносить).
  2. АвтоВысотаСтроки — указывает платформе, что высота строки должна рассчитываться автоматически в зависимости от контента.

Посмотрим на пример программной установки этих свойств:


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

// Устанавливаем автоматическую высоту для всей строки, где находится ячейка
СтрокаВДокументе = ТабДок.Область(НомерПоследнейСтроки, 1, НомерПоследнейСтроки, ТабДок.ШиринаТаблицы);
СтрокаВДокументе.АвтоВысотаСтроки = Истина;

Если пропустить установку АвтоВысотаСтроки = Истина, платформа сохранит ту высоту, которая была задана в макете (например, 15 пунктов), и даже если текст «внутри» ячейки перенесется на вторую строку, визуально вы увидите только первую, так как ячейка не раздвинется.

Шаг 3. Нюансы работы с объединенными ячейками

Выясним причину, по которой автоматическая высота может не работать. В 1С существует известная особенность: если ячейка является частью горизонтального объединения (например, колонки со 2-й по 5-ю объединены в одну), стандартное свойство АвтоВысотаСтроки может игнорироваться платформой. Это ограничение движка ТабличныйДокумент.

Если вы столкнулись с такой ситуацией, у вас есть три пути решения:

Шаг 4. Использование расширений для изменения макета

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

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

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

При таком подходе система будет использовать макет из расширения вместо типового. Это не считается изменением типовой конфигурации, не мешает обновлениям и избавляет от необходимости писать лишний код в процедуре СформироватьПФ.

Шаг 5. Альтернативный метод — ручная вставка переносов строк

Рассмотрим решение, к которому пришел автор темы в финальном сообщении. Если по каким-то причинам свойства области не применяются, можно принудительно вставить в строку текста символы переноса. В 1С это делается с помощью константы Символы.ПС (перенос строки).


МойТекст = "Первая часть длинного текста" + Символы.ПС + "Вторая часть текста";
ОбластьСтроки.Параметры.ТекстЯчейки = МойТекст;

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

Дополнительный вариант: Свойство «Забивать»

Иногда увеличение высоты строки портит дизайн документа (например, когда важно, чтобы документ умещался ровно на одну страницу А4). В этом случае проанализируем возможность использования свойства ТипРазмещенияТекстаТабличногоДокумента.Забивать.

При использовании этого режима платформа не переносит текст на новую строку и не обрезает его, а автоматически уменьшает размер шрифта так, чтобы вся фраза поместилась в текущие границы ячейки. Программно это выглядит так:


ОбластьРезультата.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Забивать;

Это отличное решение для случаев, когда текст лишь немного превышает ширину колонки.

Резюме

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

← На главную