Как известно, у управляемой формы нельзя определить реальные размеры. То есть у нее имеются свойства "Ширина" и "Высота", но при изменении размеров самой формы эти свойства не изменяются.
Если поискать в интернете, то предлагают использовать поле HTML документа. Я применял этот способ несколько раз, поэтому опишу как это делается.
Чтобы рассчитать ширину формы или элемента, необходимо разместить на ней поле HTML документа и установить ему признак "Растягивать по горизонтали". Тогда можно прочитать его "clientWidth" (или "clientHeight" для опреледения высоты). Это делается, например, из подписки "ДокументСформирован". Но как отследить момент, когда размер формы или элемента изменяется?
Можно поставить обработчик ожидания, который будет постоянно опрашивать поле HTML. Но это плохое решение.
Гораздо лучше подписаться на изменение размеров документа. Приведу код страницы, и опишу как это работает.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтотОбъект.полеHTML =
"
|<HTML>
|<BODY onResize='interactionButton.click()' onLoad='interactionButton.click()'>
|
|<button id='interactionButton' style='display: none'>Кнопка взаимодействия</button>
|
|</BODY>
|</HTML>
|";
КонецПроцедуры
Итак, применяем идею, предложенную в статье Javascript и 1С. Кросс-платформенное взаимодействие.
Поместим на HTML страницу невидимую кнопку, а в свойстве документа "onresize" пропишем, чтобы при изменении размера страницы выполнился клик по этой кнопке. У элемента поле HTML сработает событие ПриНажатии(). Вот в этом событии и надо будет считать новые размеры страницы и выполнить необходимые действия при изменении. Кроме того, при загрузке страницы тоже вызывается клик, чтобы обработку изменения размера не дублировать в событии ДокументСформирован().
Вот как это выглядит на примере.
Итак, принцип понятен. Отстался один недостаток, само поле HTML будет видно на форме и это выглядит некрасиво. Необходимо его спрятать.
Если конфигурация имеет режим совместимости 8.3.7 и выше, то можно сделать так. Создаем страницы, на одну страницу помещаем основные элементы, на другую страницу помещаем служебное поле HTML документа. У страницы выставляем "ОтображениеСтраниц"="Нет".
Вот как это выглядит.
Все диаграммы полностью заполняют всю область табличного документа, в котором они выводятся, и при изменении его размера подстраиваются
При изменении размеров формы количество картинок по горизонтали пересчитывается и изменяется, без появления горизонтального скрола
К статье прилагаются прототипы, приведенные в статье для тех, кто собирает полезные приемы или кто хочет поподробнее разобраться и поэкспериментировать.
1. Подстройка размеров текста. - Демонстрирует базовый принцип описанного приема. Работает корректно при режиме совместимости 8.3.7 и выше. Работает почти корректно на платформе 8.3 в режиме совместимости 8.2.13 и выше.
2. Подстройка размеров диаграмм. - Демонстрирует рассчет размеров для элементов формы, созданных из конфигуратора. Работает корректно при режиме совместимости 8.3.7 и выше.
3. Отображение картинок "плиткой" - Демонстрирует перестройку интерфейса, когда элементы формы создаются программно. Работает корректно при режиме совместимости 8.3.7 и выше.