При разработке интерфейсов на управляемых формах программисты часто сталкиваются с требованиями заказчиков сделать форму максимально «втиснутой» в экран, чтобы пользователю не приходилось использовать прокрутку. В классическом табличном документе 1С для этих целей существует замечательный и надежный метод ПроверитьВывод(). Однако, когда дело доходит до самой управляемой формы, готового решения «из коробки» платформа не предоставляет. Выясним, почему так происходит, и разберем практические способы решения этой задачи.
Давайте проанализируем, как устроен управляемый интерфейс 1С. В отличие от обычных форм (где координаты элементов задавались жестко в пикселях) или табличного документа с фиксированной сеткой, управляемая форма строится на декларативном принципе. Платформа сама решает, как именно расположить элементы, основываясь на их свойствах, настройках операционной системы, разрешении монитора и системном масштабе (DPI). Более того, прокрутка на форме может появиться динамически в любой момент по множеству причин:
Именно поэтому прямого метода проверки «влезаемости» элементов формы без прокрутки не существует. Тем не менее, мы можем использовать обходные пути и лучшие практики верстки, чтобы добиться идеального поведения интерфейса.
Начиная с версии платформы 8.3.10, разработчикам доступно программное управление масштабом формы. Если мы хотим гарантировать, что форма поместится на экранах с низким разрешением, мы можем уменьшить ее масштаб целиком, не пытаясь выборочно менять шрифты у отдельных таблиц (что неизбежно ломает общую верстку интерфейса).
Рассмотрим, как программно управлять свойством Масштаб у управляемой формы. Масштаб задается в процентах (например, 85, 90, 100):
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Установим более компактный масштаб для формы по умолчанию
ЭтаФорма.Масштаб = 90;
КонецПроцедуры
Такой подход позволяет платформе самостоятельно, красиво и пропорционально уменьшить все шрифты, отступы, поля ввода и кнопки, минимизируя риск появления нежелательного скроллбара.
Для того чтобы подстраивать интерфейс индивидуально под каждого пользователя (например, открывать компактную версию формы только на маленьких мониторах), мы можем использовать штатную функцию ПолучитьИнформациюЭкрановКлиента(). Она возвращает массив структур с параметрами всех подключенных мониторов клиента.
Разберем по шагам пример, в котором при открытии формы мы анализируем разрешение экрана и принудительно включаем компактный режим отображения, если рабочая область слишком мала:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
МассивЭкранов = ПолучитьИнформациюЭкрановКлиента();
Если МассивЭкранов.Количество() > 0 Тогда
// Берем характеристики основного экрана
ПараметрыЭкрана = МассивЭкранов[0];
ШиринаЭкрана = ПараметрыЭкрана.Ширина;
ВысотаЭкрана = ПараметрыЭкрана.Высота;
// Если высота экрана менее 800 пикселей, оптимизируем форму
Если ВысотаЭкрана < 800 Тогда
ЭтаФорма.Масштаб = 85;
// Дополнительно можем скрыть необязательные декоративные элементы или панели
Элементы.ГруппаДекоративныеЭлементы.Видимость = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Также рекомендуется использовать обработчик события управляемой формы ПриИзмененииПараметровЭкрана(). Это позволит среагировать на ситуацию, когда пользователь перетащил окно 1С с большого UltraHD монитора на небольшой экран ноутбука.
Если вам критически важно знать точные физические размеры клиентской области формы «здесь и сейчас», можно применить продвинутый трюк, который часто используют опытные разработчики. На форму помещается невидимый или минимальный по размеру элемент типа Поле HTML документа, растянутый по всей ширине и высоте формы.
В это поле загружается простейшая страница с JavaScript, которая отслеживает событие изменения размера окна браузера (внутри которого и рендерится управляемая форма 1С):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Подготовим простейший HTML с JS-обработчиком изменения размеров
ТекстHTML =
"<html>
|<body onresize=""window.external.Notification(document.body.clientWidth + 'x' + document.body.clientHeight)"" style=""margin:0; padding:0; overflow:hidden;"">
|</body>
|</html>";
Объект.ТекстHTMLПоля = ТекстHTML;
КонецПроцедуры
При изменении размеров окна JavaScript вызовет событие оповещения в 1С и передаст точные физические размеры клиентской области в пикселях. В обработчике события ПриНажатии или ОнаПовещении поля HTML документа мы сможем перехватить эти данные и принять решение об изменении состава колонок или уменьшении шрифтов.
Очень часто общая вертикальная прокрутка всей управляемой формы появляется не из-за физической нехватки места, а по причине некорректной настройки растягивания элементов. Если на вашей форме расположена большая табличная часть (или динамический список), платформа по умолчанию пытается показать как можно больше строк, растягивая таблицу вниз и заставляя всю форму «уезжать» за границы экрана.
Чтобы избежать этой проблемы, используйте следующие правила верстки:
ВысотаВСтроках (например, значением 5 или 7). В таком случае прокрутка появится локально внутри самой таблицы, а общая форма сохранит свои границы и не получит вертикальный скроллбар.РастягиватьПоВертикали в значении Да.Применяя данные методики в комплексе, вы сможете создавать действительно адаптивные, красивые интерфейсы в 1С:Предприятии 8.3, которые будут автоматически подстраиваться под любые мониторы ваших пользователей без появления раздражающих полос прокрутки.