Как настроить перенос текста в заголовке колонки таблицы на управляемых формах 1С

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

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

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

Причины нежелательного растягивания колонок

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


НоваяКолонка.Ширина = 8;
НоваяКолонка.РастягиватьПоГоризонтали = Ложь;

Казалось бы, платформа должна ужать колонку до 8 символов и разбить текст заголовка на несколько строк (особенно если у самой таблицы свойство ВысотаШапки установлено в значение 3 или 4). Однако колонка все равно остается широкой и отображается в одну строку.

Выясним причину такого поведения движка управляемых форм:

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

Основное решение: переключение режима растягивания

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

Посмотрим на рабочий вариант настройки колонки:


// 1. Указываем высоту шапки у таблицы формы (число строк для текста)
Элементы.ТаблицаПартнеров.ВысотаШапки = 4;

// 2. Настраиваем созданную колонку
НоваяКолонка.Ширина = 8;
НоваяКолонка.РастягиватьПоГоризонтали = Истина;

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

Жесткая фиксация максимальной ширины

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


НоваяКолонка.Ширина = 8;
НоваяКолонка.АвтоМаксимальнаяШирина = Ложь;
НоваяКолонка.МаксимальнаяШирина = 8;
НоваяКолонка.РастягиватьПоГоризонтали = Истина;

Отключение автоопределения максимального размера через свойство АвтоМаксимальнаяШирина = Ложь не позволит алгоритму компоновки раздвинуть колонку шире заданного значения МаксимальнаяШирина.

Принудительный перенос строк в коде

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

Разберем программный способ формирования многострочного заголовка с помощью символа перевода строки Символы.ПС:


// Разбиение длинного текста заголовка на строки
ЗаголовокСПереносами = СтрЗаменить(НаименованиеПартнера, " ", Символы.ПС);
НоваяКолонка.Заголовок = ЗаголовокСПереносами;

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

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

Альтернативные архитектурные решения для матричных таблиц

Создание большого количества динамических колонок в стандартной табличной части или таблице формы (паттерн «шахматка» или «кросс-таблица») имеет существенные ограничения: форма становится тяжелой для отрисовки сервером и медленно работает при горизонтальной прокрутке.

Если задача заключается в отображении матрицы вида «Номенклатура — Партнеры — Количество», проанализируем более эффективные альтернативы:

  1. Поле табличного документа (ПолеТабличногоДокумента):

    Идеально подходит для шахматных ведомостей. В ячейках шапки табличного документа можно использовать свойство ОриентацияТекста = 90 (вертикальный текст). Это позволяет вывести заголовки партнеров вертикально, сократив ширину колонок до минимума и уместив на одном экране десятки контрагентов. Кроме того, табличный документ поддерживает закрепление строк и колонок.

  2. Отчет на Системе компоновки данных (СКД):

    Стандартная таблица СКД с группировкой строк по номенклатуре и колонок по партнерам рассчитывает заголовки автоматически, поддерживает стандартные механизмы агрегации итогов и легко масштабируется под любые объемы данных.

← На главную