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

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

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

Анализируем причины ограничения ширины

Для начала давайте разберем ситуацию, когда на форме расположены три или четыре связанные таблицы (Master-Detail). Например, при выборе строки в первой таблице, во второй отображаются связанные данные, в третьей — уточнения к ним и так далее. Если расположить их горизонтально, мы часто обнаруживаем, что одну таблицу можно сузить почти до нуля, а другую — только до определенного предела. Проанализируем, что именно «держит» ширину:

  1. Заголовки колонок и самой таблицы. Платформа рассчитывает ширину исходя из длины текста в заголовках.
  2. Автокомандная панель. Если кнопки управления находятся внутри таблицы, они задают минимальный порог отображения.
  3. Строка поиска. Стандартный элемент поиска, появившийся в платформе 8.3.5, имеет фиксированный минимальный размер.
  4. Свойства колонок. Установленные значения Ширина и МинимальнаяШирина напрямую влияют на поведение контейнера. Опытные разработчики применяют различные методы доработки динамических списков для решения таких задач.

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

Решение 1: Манипуляция с заголовками через неразрывные пробелы

Как показывает практика, заголовок таблицы — это главный ограничитель. Даже если вы уберете все колонки, текст заголовка самой таблицы не даст ей стать меньше определенного размера. Выясним причину: механизм компоновки УФ всегда стремится сделать текст читаемым.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Убираем визуальное ограничение ширины заголовка
    Элементы.СписокНоменклатуры.Заголовок = Символы.НПП + Символы.НПП;
    
    // Если нужно скрыть заголовки колонок для максимального сжатия
    Для Каждого Колонка Из Элементы.СписокНоменклатуры.ПодчиненныеЭлементы Цикл
        Колонка.ТекстШапки = ""; 
    КонецЦикла;
КонецПроцедуры

Это позволяет «натягивать» одну таблицу на другую, оставляя от ненужной в данный момент таблицы лишь тонкую полоску.

Решение 2: Настройка командной панели и строки поиска

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

Разберем алгоритм действий для обеспечения гибкости:

  1. Установите свойство Положение командной панели в значение Нет. Сами команды лучше вынести в отдельную группу «Командная панель» над всеми таблицами, используя качественные иконки, значки для 1С.
  2. Обратите внимание на Положение строки поиска. Если она отображается, таблица никогда не сожмется меньше, чем размер этого поля. Установите значение Нет, если компактность важнее быстрого поиска.
  3. Проверьте свойство Состояние просмотра. В некоторых режимах оно также резервирует место справа или снизу таблицы.

Решение 3: Правильная группировка и использование сплиттеров

Чтобы пользователь мог интерактивно менять границы между таблицами (как в проводнике Windows), таблицы должны находиться в одной группе. Выясним, какие настройки группы критичны:

Во-первых, свойство Группировка должно быть установлено в значение Горизонтальная. Во-вторых, крайне важно проверить свойство Вариант управления шириной у родительской группы. Для того чтобы появились «разделители» (сплиттеры), которые можно перетаскивать мышкой, у элементов внутри группы не должно быть жестко заданных ограничений по максимальной ширине.

Рассмотрим пример настройки свойств для трех таблиц (Левая, Средняя, Правая):

Решение 4: Программное управление видимостью и сворачиваемые группы

Если таблиц много (например, 4 или более), даже самая гибкая настройка ширины не спасет от перегруженности интерфейса на небольших мониторах. Рассмотрим альтернативный подход — свертываемые группы.

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


&НаКлиенте
Процедура СкрытьЛевуюПанель(Команда)
    // Динамически меняем видимость для пересчета ширины формы
    Элементы.ГруппаЛеваяТаблица.Видимость = Не Элементы.ГруппаЛеваяТаблица.Видимость;
КонецПроцедуры

Когда свойство Видимость устанавливается в Ложь, платформа полностью исключает элемент из расчета ширины, и оставшиеся таблицы мгновенно растягиваются на все свободное пространство. Это «феншуйный» метод для связанных таблиц, так как он позволяет сосредоточиться на редактировании конкретных данных без визуального шума.

Рекомендации по UX для связанных данных

Посмотрим на проблему с точки зрения пользователя. Если таблицы связаны по принципу «Главная — Подчиненная», постоянное кручение скроллом вверх-вниз при вертикальном расположении крайне неудобно. Однако и горизонтальное нагромождение может запутать. Мы рекомендуем совмещать подходы:

Во-первых, используйте горизонтальное расположение для Master-Detail связей, но применяйте хак с Символы.НПП для заголовков, чтобы обеспечить возможность сильного сжатия. Во-вторых, выносите в подчиненные таблицы только действительно необходимые колонки, устанавливая для остальных Видимость = Ложь. В-третьих, используйте программную фиксацию текущей строки (метод АктивизироватьПоле или ТекущаяСтрока), чтобы при переходе между таблицами фокус не терялся и пользователю не приходилось совершать лишних движений мышью.

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

← На главную