При разработке интерфейсов на управляемых формах 1С:Предприятие 8.3 программисты часто сталкиваются с проблемой «расползания» элементов. Типичная ситуация: форма разделена на две вертикальные колонки (например, сведения о плательщике слева и получателе справа), в каждой из которых расположено множество реквизитов. Как только мы программно скрываем один из верхних элементов (устанавливаем Видимость = Ложь), вся нижележащая цепочка в этой колонке поднимается вверх. В результате логически связанные поля (например, номера счетов) оказываются на разной высоте, что портит внешний вид и затрудняет восприятие данных пользователем.
В этой статье мы подробно разберем, как добиться того, чтобы реквизиты всегда находились друг напротив друга, вне зависимости от видимости элементов над ними. Мы проанализируем несколько подходов — от классических до более продвинутых — и выясним, какой из них лучше подходит для ваших задач. Для оперативной отладки расположения и видимости реквизитов прямо в режиме Предприятия можно использовать инструмент для редактирования свойств элементов формы.
Рассмотрим наиболее надежный и проверенный метод. Вместо того чтобы создавать две большие вертикальные группы (левую и правую колонки), мы построим форму «построчно». Проанализируем, как это работает: для каждой пары реквизитов, которые должны стоять друг напротив друга, мы создаем отдельную группу с группировкой Горизонтальная.
Выполним следующие шаги для реализации этого метода:
ГруппаСостав с вертикальной группировкой.Группа_Строка_Счет.Группировка в значение Горизонтальная всегда.В чем преимущество такого подхода? Если нам нужно скрыть всю строку целиком, мы просто управляем видимостью группы-строки. Если же нужно скрыть только один элемент (например, только левый), мы можем столкнуться с тем, что правый «уедет» влево. Чтобы этого избежать, внутри горизонтальной группы можно использовать декорации-заглушки или фиксированную ширину элементов.
Если мы не хотим менять структуру подчиненности элементов и предпочитаем оставить две вертикальные колонки, нам поможет метод программных «заглушек». Проанализируем ситуацию: когда элемент исчезает, занимаемое им место схлопывается. Чтобы этого не произошло, на место скрытого элемента нужно подставить пустой элемент той же высоты.
Разберем алгоритм действий:
Декорация — Надпись.Рассмотрим пример кода для управления видимостью поля СчетПлательщика:
&НаСервере
Процедура УстановитьВидимостьРеквизита(ИмяРеквизита, ЗначениеВидимости)
// Управляем основным полем
Элементы[ИмяРеквизита].Видимость = ЗначениеВидимости;
// Управляем декорацией-заглушкой, которая держит место
ИмяДекорации = "Декорация_" + ИмяРеквизита;
Если Элементы.Найти(ИмяДекорации) <> Неопределено Тогда
Элементы[ИмяДекорации].Видимость = Не ЗначениеВидимости;
КонецЕсли;
КонецПроцедуры
Этот метод позволяет сохранить визуальный «каркас» формы неизменным, однако он требует создания большого количества вспомогательных элементов (декораций), что может усложнить дерево элементов формы.
Иногда самый простой способ решить проблему выравнивания — это отказаться от изменения свойства Видимость. Выясним причину: свойство Видимость полностью исключает элемент из потока компоновки интерфейса. Если же мы хотим, чтобы элемент остался на месте, но пользователь его не видел или не мог с ним взаимодействовать, можно использовать альтернативные свойства.
Вариант А: Управление доступностью. Если бизнес-логика позволяет, вместо скрытия поля можно установить Доступность = Ложь или ТолькоПросмотр = Истина. Элемент останется на форме, сохранив все отступы и выравнивание.
Вариант Б: «Невидимый» текст. Это более хитрый прием. Мы можем использовать Условное оформление формы, чтобы сделать текст элемента невидимым. Проанализируем настройки:
ЦветТекста равным цвету фона формы.ЦветТекстаЗаголовка равным цвету фона.В этом случае визуально поле исчезнет, но физически оно будет занимать ровно столько же места, сколько и раньше, обеспечивая идеальное сквозное выравнивание для всех нижних строк.
В современных версиях платформы 1С v8.3 у групп появилось свойство ВидГруппы. Если мы выберем вариант, имитирующий таблицу, платформа будет стараться выравнивать элементы во вложенных группах друг относительно друга.
Посмотрим на настройки свойств:
Группировка в значение Горизонтальная.Растягивать по вертикали и Растягивать по горизонтали. Чтобы колонки были симметричны, у обеих вертикальных подгрупп должны стоять одинаковые коэффициенты растяжения.Важный нюанс: чтобы горизонтальное выравнивание «не поплыло», необходимо следить за тем, чтобы содержимое одной колонки не распирало её по ширине. Если в левой колонке появится очень длинная надпись, она может сдвинуть правую колонку. Чтобы этого избежать, установим свойство Ширина для обеих вертикальных групп в фиксированное значение.
Если количество реквизитов велико (как в нашем примере — 15 и более), а требования к выравниванию жесткие, можно рассмотреть использование элемента формы Таблица. Это радикальный шаг, но он дает 100% гарантию сквозного выравнивания.
Разберем, как это реализовать:
ЛевоеЗначение и ПравоеЗначение.Шапка = Ложь).Теперь каждый «ряд» реквизитов будет строкой таблицы. Скрывать элементы в таблице сложнее (придется очищать значения или использовать условное оформление), но горизонтальная связь между левой и правой ячейкой будет неразрывной на уровне движка платформы.
Мы рассмотрели различные подходы к организации интерфейса. Наиболее «чистым» с точки зрения кода и предсказуемости результата является Способ 1 (горизонтальные группы для каждой пары). Если же переделывать структуру формы слишком трудозатратно, рекомендуем обратить внимание на Способ 3 (условное оформление цветом), так как он позволяет сохранить геометрию формы без добавления лишних элементов в дерево формы. Для быстрого получения программного кода таких настроек пригодится инструмент для декомпиляции условного оформления формы.
Выбор метода зависит от конкретной задачи, но помните: в управляемом интерфейсе 1С геометрия всегда первична, и любое изменение видимости — это сигнал системе перерисовать всю компоновку. Используя «заглушки» или строгую группировку, мы помогаем платформе сохранять удобный для пользователя вид формы.