При разработке сложных интерфейсов в системе 1С:Предприятие 8.3 программисты часто сталкиваются с жестким поведением управляемых форм (УФ). Одной из наиболее раздражающих проблем является невозможность «схлопнуть» или максимально сузить таблицу, расположенную в горизонтальной группе. Платформа автоматически резервирует место под заголовки, кнопки командной панели и поисковые строки, что мешает созданию компактных рабочих областей. В этой статье мы подробно разберем, как обойти эти ограничения и сделать интерфейс по-настоящему гибким.
Для начала давайте разберем ситуацию, когда на форме расположены три или четыре связанные таблицы (Master-Detail). Например, при выборе строки в первой таблице, во второй отображаются связанные данные, в третьей — уточнения к ним и так далее. Если расположить их горизонтально, мы часто обнаруживаем, что одну таблицу можно сузить почти до нуля, а другую — только до определенного предела. Проанализируем, что именно «держит» ширину:
Ширина и МинимальнаяШирина напрямую влияют на поведение контейнера. Опытные разработчики применяют различные методы доработки динамических списков для решения таких задач.Рассмотрим по шагам, как устранить каждое из этих препятствий.
Как показывает практика, заголовок таблицы — это главный ограничитель. Даже если вы уберете все колонки, текст заголовка самой таблицы не даст ей стать меньше определенного размера. Выясним причину: механизм компоновки УФ всегда стремится сделать текст читаемым.
Интересный лайфхак заключается в использовании специальных символов. Если мы установим в качестве заголовка или в названиях колонок символ Символы.НПП (неразрывный пробел), платформа перестает корректно вычислять визуальную длину строки и позволяет сжимать элемент практически вплотную к границе. Посмотрим на пример программной установки такого заголовка:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Убираем визуальное ограничение ширины заголовка
Элементы.СписокНоменклатуры.Заголовок = Символы.НПП + Символы.НПП;
// Если нужно скрыть заголовки колонок для максимального сжатия
Для Каждого Колонка Из Элементы.СписокНоменклатуры.ПодчиненныеЭлементы Цикл
Колонка.ТекстШапки = "";
КонецЦикла;
КонецПроцедуры
Это позволяет «натягивать» одну таблицу на другую, оставляя от ненужной в данный момент таблицы лишь тонкую полоску.
Проанализируем свойства самой таблицы. По умолчанию ПоложениеКоманднойПанели установлено в значение Авто, что часто размещает кнопки прямо над данными. Это удобно, но губительно для компактности.
Разберем алгоритм действий для обеспечения гибкости:
Нет. Сами команды лучше вынести в отдельную группу «Командная панель» над всеми таблицами, используя качественные иконки, значки для 1С.Нет, если компактность важнее быстрого поиска.Чтобы пользователь мог интерактивно менять границы между таблицами (как в проводнике Windows), таблицы должны находиться в одной группе. Выясним, какие настройки группы критичны:
Во-первых, свойство Группировка должно быть установлено в значение Горизонтальная. Во-вторых, крайне важно проверить свойство Вариант управления шириной у родительской группы. Для того чтобы появились «разделители» (сплиттеры), которые можно перетаскивать мышкой, у элементов внутри группы не должно быть жестко заданных ограничений по максимальной ширине.
Рассмотрим пример настройки свойств для трех таблиц (Левая, Средняя, Правая):
РастягиватьПоГоризонтали — Да.Ширина — 0 (автоматически).Отображение — Нет (чтобы не забирать лишние пиксели под рамку).Если таблиц много (например, 4 или более), даже самая гибкая настройка ширины не спасет от перегруженности интерфейса на небольших мониторах. Рассмотрим альтернативный подход — свертываемые группы.
В современных версиях платформы (интерфейс «Такси») у групп появилось свойство Поведение. Если установить его в значение Свертываемая, рядом с заголовком группы появится иконка, позволяющая пользователю мгновенно скрыть всю таблицу. Это гораздо эффективнее, чем ручное перетаскивание границ. Проанализируем ситуацию программного переключения:
&НаКлиенте
Процедура СкрытьЛевуюПанель(Команда)
// Динамически меняем видимость для пересчета ширины формы
Элементы.ГруппаЛеваяТаблица.Видимость = Не Элементы.ГруппаЛеваяТаблица.Видимость;
КонецПроцедуры
Когда свойство Видимость устанавливается в Ложь, платформа полностью исключает элемент из расчета ширины, и оставшиеся таблицы мгновенно растягиваются на все свободное пространство. Это «феншуйный» метод для связанных таблиц, так как он позволяет сосредоточиться на редактировании конкретных данных без визуального шума.
Посмотрим на проблему с точки зрения пользователя. Если таблицы связаны по принципу «Главная — Подчиненная», постоянное кручение скроллом вверх-вниз при вертикальном расположении крайне неудобно. Однако и горизонтальное нагромождение может запутать. Мы рекомендуем совмещать подходы:
Во-первых, используйте горизонтальное расположение для Master-Detail связей, но применяйте хак с Символы.НПП для заголовков, чтобы обеспечить возможность сильного сжатия. Во-вторых, выносите в подчиненные таблицы только действительно необходимые колонки, устанавливая для остальных Видимость = Ложь. В-третьих, используйте программную фиксацию текущей строки (метод АктивизироватьПоле или ТекущаяСтрока), чтобы при переходе между таблицами фокус не терялся и пользователю не приходилось совершать лишних движений мышью.
Таким образом, комбинируя правильные настройки свойств элементов формы и небольшие хитрости с текстом заголовков, мы можем создать профессиональный интерфейс.