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