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