Как зафиксировать ширину колонок в таблице на управляемой форме и убрать растягивание последней колонки?

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

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

Проблема заключается в особенностях механизма компоновки управляемых форм. Когда для элемента-таблицы установлено свойство растягивания по горизонтали, платформа стремится заполнить всё доступное ей место. Эту задачу она решает самым простым способом — увеличивая ширину последней видимой колонки. Стандартные свойства колонки, такие как РастягиватьПоГоризонтали = Ложь или установка фиксированной Ширины, на последнюю колонку не действуют, так как приоритет растягивания всей таблицы выше.

Проанализируем наиболее эффективные способы решения этой задачи.

Решение 1: Добавление технической колонки-распорки

Самый распространенный и надежный способ обойти это поведение платформы — добавить в конец таблицы еще одну, техническую колонку. Эта колонка будет последней и, следовательно, именно она "примет на себя" всё растяжение. А наши колонки с реальными данными останутся в неизменном виде.

Разберем по шагам, как это реализовать.

  1. Добавить реквизит. Необходимо добавить в табличную часть объекта (или в реквизит формы типа ТаблицаЗначений) новый реквизит — для подобных задач оформления есть инструмент визуальной индикации вложений в таблицах документов. Он не будет нести смысловой нагрузки. Часто для этих целей используют уже существующий реквизит, например, НомерСтроки, так как он есть по умолчанию у любой табличной части.
  2. Вывести колонку на форму. В редакторе формы нужно добавить новую колонку и разместить её в самом конце таблицы. В качестве данных (свойство ПутьКДанным) для этой колонки укажите созданный или выбранный технический реквизит.
  3. Настроить видимость и поведение. Чтобы эта колонка не мешала пользователю, её нужно сделать максимально незаметной (поможет расширение для динамической настройки элементов управляемых форм):
    • Установить свойство ТолькоПросмотр = Истина, чтобы в неё нельзя было ничего ввести.
    • Установить свойство ОтображатьВШапке = Ложь, чтобы скрыть её заголовок.
    • Можно задать минимальную Ширину, например, 1.

Таким образом, для пользователя таблица будет выглядеть как обычно, но последней "видимой" для механизма компоновки будет наша невидимая колонка-распорка, которая и будет растягиваться.

Решение 2: Программное добавление колонки

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

Предположим, у нас есть форма с таблицей Запасы, и мы хотим добавить техническую колонку в её конец.

Шаг 1. В модуле формы создадим процедуру, которая будет добавлять и настраивать наш элемент-распорку.


Процедура ДобавитьКолонкуРаспорку(Форма, ГруппаТаблицы, ПутьКДанным) Экспорт
    // Добавляем новый элемент формы (колонку) в указанную группу (таблицу)
    Элемент = Форма.Элементы.Добавить("ТехническаяКолонкаРаспорка", Тип("ПолеФормы"), ГруппаТаблицы);

    // Настраиваем свойства элемента
    Элемент.Вид = ВидПоляФормы.ПолеВвода;
    Элемент.ПутьКДанным = ПутьКДанным; // Связываем с данными, например, с номером строки

    // Делаем колонку незаметной для пользователя
    Элемент.ОтображатьВШапке = Ложь; // Скрываем заголовок
    Элемент.ТолькоПросмотр = Истина; // Запрещаем редактирование
    Элемент.АвтоМаксимальнаяШирина = Ложь; // Отключаем автоподбор ширины по содержимому

    // Хитрость, чтобы сделать содержимое невидимым
    // Устанавливаем формат, который выводит пустое значение для числовых полей
    Элемент.Формат = "ЧФ=' '"; 
КонецПроцедуры

Шаг 2. Вызовем эту процедуру в обработчике события ПриСозданииНаСервере.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Вызываем нашу процедуру
    // ЭтаФорма - текущая форма
    // Элементы.Запасы - группа-таблица, куда добавляем колонку
    // "Объект.Запасы.НомерСтроки" - путь к данным. Используем стандартный реквизит "НомерСтроки"
    ДобавитьКолонкуРаспорку(ЭтаФорма, Элементы.Запасы, "Объект.Запасы.НомерСтроки");
КонецПроцедуры

Проанализируем ключевые моменты этого кода:

Этот программный метод позволяет гибко управлять интерфейсом, не внося изменений в структуру самих объектов конфигурации — для этих целей подойдёт инструмент глубокой настройки интерфейса и таблиц.

Решение 3: Отказ от растягивания всей таблицы

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

Для этого нужно в редакторе формы выделить сам элемент Таблица и в палитре свойств найти свойство РастягиватьПоГоризонтали и установить его в значение Ложь.

Плюсы этого метода:

Минусы:

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

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

← На главную