При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с особенностью «потокового» расположения элементов. В отличие от обычных форм, где каждый элемент имел жестко заданные координаты, управляемая форма автоматически пересчитывает положение полей. Если мы устанавливаем свойству Видимость значение Ложь, элемент полностью исключается из компоновки, и соседние поля «схлопываются», занимая освободившееся пространство. Это часто портит визуальный облик формы, особенно если пользователь привык к определенному расположению данных.
В этой статье мы подробно разберем несколько стратегий, которые позволят нам скрыть данные от пользователя, но при этом сохранить «дырку» в интерфейсе, чтобы остальные элементы управления оставались на своих местах.
Проанализируем самый популярный способ, предложенный участниками сообщества. Суть его заключается в подмене одного элемента другим. Когда нам нужно скрыть основное поле, мы одновременно выключаем его видимость и включаем видимость специальной декорации, которая не несет никакой смысловой нагрузки, но занимает то же самое пространство.
Рассмотрим пошагово, как это реализовать:
Декорация — Надпись.Текст декорации не указываем ничего или вставляем неразрывный пробел (символ с кодом 160), чтобы платформа не «схлопнула» пустую строку.Теперь разберем программную часть. Чтобы управление было бесшовным, нам необходимо синхронизировать видимость. Посмотрим на пример кода:
&НаКлиенте
Процедура УправлениеВидимостью(ПоказыватьПоле)
// Скрываем или показываем основное поле
Элементы.НомерТелефона.Видимость = ПоказыватьПоле;
// Инвертируем видимость для декорации-пустышки
Элементы.ДекорацияПустышка.Видимость = НЕ ПоказыватьПоле;
КонецПроцедуры
Важно помнить, что если элементы находятся внутри группы с горизонтальной или вертикальной компоновкой, декорация должна иметь те же настройки растяжения, что и исходное поле, иначе интерфейс все равно может немного «поплыть».
Выясним причину, по которой этот метод считается наиболее изящным. Если мы не трогаем свойство Видимость, элемент физически остается на форме, участвует в расчете размеров, но становится невидимым для глаза. Достичь этого можно через динамическое изменение цветов оформления.
Проанализируем ситуацию: нам нужно сделать так, чтобы текст, фон и рамка поля слились с фоном самой формы. Для этого лучше всего использовать механизм УсловноеОформление.
ЦветТекста — выберите цвет фона формы (обычно «Белый» или системный цвет «Фон формы»).ЦветФона — аналогично фону формы.ЦветРамки — аналогично фону формы.Преимущество этого метода в том, что нам не нужно создавать лишние элементы-пустышки. Поле Реквизит1 будет занимать место, его можно будет даже выделить мышкой (если оно доступно), но визуально оно пропадет.
Рассмотрим более сложный, но надежный способ резервирования места — использование элементов типа Группа — Страницы. Этот метод идеально подходит, если вам нужно скрыть целый блок полей.
Разберем алгоритм действий:
Страницы. Устанавливаем ей режим ОтображениеЗакладок — Не отображать.СтраницаСДанными и ПустаяСтраница.Высота), если это критично.Для программного переключения «скрытия» используем следующий код:
&НаКлиенте
Процедура СкрытьБлокДанных()
// Переключаемся на пустую страницу
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ПустаяСтраница;
КонецПроцедуры
Так как ГруппаСтраницы сама по себе не исчезает с формы, место под ней остается зарезервированным, и нижние элементы формы не прыгают вверх.
Иногда задача «скрыть, чтобы никто не занимал место» может быть решена через изменение состояния поля, а не его полную невидимость. Рассмотрим вариант, когда поле остается видимым, но выглядит «пустым».
Если мы установим Элементы.ИмяПоля.Доступность = Ложь, поле станет серым, но сохранит свои размеры. Если же нам нужно, чтобы оно выглядело именно как пустое пространство, мы можем комбинировать очистку значения и блокировку:
&НаСервере
Процедура СкрытьПолеНаСервере()
Объект.НужныйРеквизит = ""; // Очищаем данные
Элементы.НужныйРеквизит.ТолькоПросмотр = Истина;
Элементы.НужныйРеквизит.ЦветТекстаШапки = ЦветаСтиля.ФонФормы; // Скрываем заголовок, если нужно
КонецПроцедуры
Посмотрим на пример использования жестких ограничений платформы. Хотя управляемые формы стремятся к динамике, мы можем попытаться «заставить» группу сохранять размер. Если поместить элемент в группу с видом Обычная группа — Без отображения и выключить у этой группы свойство РастягиватьПоВертикали, задав при этом строгую Высота, то при скрытии внутреннего элемента группа может сохранить свой габарит.
Важное примечание: Этот метод работает нестабильно в разных версиях платформы 1С v8.3, так как алгоритм компоновки Managed Form приоритетнее пользовательских установок высоты. Поэтому рекомендуется всегда использовать комбинированный подход с декорацией-заглушкой как наиболее гарантированный результат.
Подводя итог, можно сказать, что самого простого «флажка» в свойствах для решения этой задачи не существует. Платформа 1С проектировалась с расчетом на адаптивность интерфейса. Однако, используя декорации для точечных полей или группы страниц для блоков данных, мы можем добиться стабильности интерфейса.
Выберем наиболее подходящий путь:
Помните, что избыточное количество невидимых элементов или сложных правил условного оформления может замедлить отрисовку формы на слабых клиентах, поэтому старайтесь соблюдать баланс между красотой интерфейса и производительностью системы.