Почему не растягиваются программно созданные элементы на управляемой форме 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в 1С мы часто сталкиваемся с необходимостью динамического формирования элементов. Классический сценарий: в обработчике ПриСозданииНаСервере мы программно добавляем на форму группу с видом страницы, подчиненные страницы и помещаем туда динамические списки. Однако при первом открытии формы нас ждет неприятный сюрприз — элементы сжимаются, не занимают отведенное пространство, а форма выглядит криво. При этом, если закрыть и открыть форму заново — все чудесным образом растягивается и отображается корректно.

Давайте разберем по шагам, почему возникает эта проблема и рассмотрим несколько проверенных способов ее решения.

Проанализируем причину проблемы

Сбой растягивания при первом открытии чаще всего связан с внутренним механизмом кэширования компоновки элементов платформы 1С. Когда мы программно добавляем сложные элементы (особенно динамические списки) на сервере, платформа пытается рассчитать их ширину и высоту до момента окончательного связывания с данными и формирования полного контекста интерфейса на клиенте. Ей просто не хватает исходных данных для правильного расчета геометрии. При повторном открытии платформа использует уже закэшированную ранее структуру или успевает корректно вычислить габариты.

Посмотрим на практические методы, которые помогут нам победить эту архитектурную особенность платформы.

Способ 1: Явное указание свойств растягивания и отключение автоширины

Платформе нужно прямо "указать", как вести себя с новыми элементами. Для этого при программном создании элементов (групп, страниц, таблиц) мы должны принудительно задать параметры растягивания.

Разберем необходимые настройки для программно создаваемых элементов:

  1. Устанавливаем свойство РастягиватьПоВертикали в значение Истина.
  2. Устанавливаем свойство РастягиватьПоГоризонтали в значение Истина.
  3. Обязательно отключаем автоширину: АвтоШирина = Ложь.
  4. Для группирующих элементов иногда помогает явное задание небольшого начального размера, например, Высота = 3, что дает платформе точку отсчета для расчета пропорций.

Посмотрим на пример кода, как это может выглядеть при создании таблицы:


НовыйЭлемент = Элементы.Добавить("ДинамическийСписокПрограммно", Тип("ТаблицаФормы"), Элементы.ГруппаСтраницаНоминалы);
НовыйЭлемент.ПутьКДанным = "РеквизитСписок";
НовыйЭлемент.РастягиватьПоВертикали = Истина;
НовыйЭлемент.РастягиватьПоГоризонтали = Истина;
НовыйЭлемент.АвтоШирина = Ложь;

Способ 2: Принудительное обновление отображения на клиенте

Если серверный расчет геометрии дал сбой, мы можем инициировать пересчет размеров уже на стороне клиента, когда форма полностью сформирована.

Для этого в клиентском обработчике ПриОткрытии (или в некоторых случаях в ПриЧитанииНаСервере) вызовем методы обновления. Это заставит платформу перерисовать контейнеры.


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Принудительное обновление отображения всей формы
    ЭтаФорма.ОбновитьОтображениеДанных();
    
    // Или точечное обновление программно созданного элемента
    Элементы.ДинамическийСписокПрограммно.Обновить();
    
КонецПроцедуры

Способ 3: Использование невидимых декораций ("Распорок")

Рассмотрим популярный среди разработчиков неочевидный обходной маневр. Мы заставим контейнер растянуться за счет добавления в него фиктивного элемента.

В программно созданную страницу добавляется пустая декорация (надпись без текста), для которой жестко задаются свойства максимального растягивания по вертикали и горизонтали. Эта декорация берет на себя роль "распорки" контейнера. Платформа сразу выделяет максимальное пространство для страницы, в которое затем без проблем вписывается наш динамический список.

Способ 4: Игры с видимостью (Отложенная отрисовка)

Проанализируем еще один действенный вариант обхода бага компоновщика. Идея заключается в том, чтобы скрыть элемент в момент первичного серверного рендеринга и показать его уже на клиенте.

Мы программно создаем страницу или список на сервере, но устанавливаем свойство Видимость = Ложь. Затем, в клиентском обработчике ПриОткрытии, мы программно переключаем видимость в Истина. Изменение видимости уже сформированной формы на клиенте часто заставляет ядро 1С заново и абсолютно корректно пересчитать геометрию элементов на лету.

Способ 5: Управление фокусом

Выясним еще одну интересную деталь. На изначальное масштабирование при первом открытии сильно влияет настройка порядка обхода элементов платформой.

Если мы сделаем так, чтобы фокус при открытии явно передавался на добавленный программно динамический список, интерфейс сможет корректно подогнать размеры страницы под этот активный элемент.


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Явно передаем фокус на наш созданный список
    ЭтаФорма.ТекущийЭлемент = Элементы.ДинамическийСписокПрограммно;
КонецПроцедуры

Заключение

Мы подробно разобрали, почему программно созданные группы и таблицы могут некорректно отображаться в управляемом приложении. Эта проблема носит платформенный характер и связана с кэшированием компоновки. Комбинируя описанные методы — явное указание параметров растягивания, управление видимостью, использование "распорок" и передачу фокуса — вы сможете добиться идеального и предсказуемого отображения ваших динамических интерфейсов прямо с первого открытия формы.

← На главную