Как исправить некорректное отображение ширины колонок в мобильном приложении при повороте экрана?

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

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

Причины возникновения проблемы с версткой

Проанализируем ситуацию: мобильная платформа пытается максимально эффективно использовать доступное пространство. Когда мы поворачиваем телефон, происходит событие изменения параметров экрана, и платформа инициирует пересчет Layout (слоя отрисовки). Однако из-за сложности вложенных групп, использования свойств «Автовысота» или наличия большого количества колонок, алгоритм расчета может «зависнуть» на старых значениях или неправильно вычислить минимально допустимую ширину элементов. Выясним, какие инструменты управления интерфейсом у нас есть.

Способ 1: Жесткая фиксация ориентации экрана

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

  1. Откроем конфигуратор и перейдем в свойства корневого объекта «Конфигурация».
  2. Найдем раздел «Разрешенные ориентации экрана».
  3. Снимем флажки с ненужных положений, оставив, например, только «Портретная».

После этого приложение будет всегда отображаться в вертикальном режиме, игнорируя датчики гироскопа, что гарантирует стабильность верстки.

Способ 2: Использование события ПриИзмененииПараметровЭкрана

Если же поворот экрана необходим, нам нужно научиться программно реагировать на это событие. В управляемой форме мобильного приложения существует специализированный обработчик ПриИзмененииПараметровЭкрана. Рассмотрим пример кода, который поможет нам принудительно обновить интерфейс:


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

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


&НаКлиенте
Процедура ПриИзмененииПараметровЭкрана(ПараметрыЭкрана)
    // Устанавливаем ширину в 0, а затем возвращаем Авто (0 в 1С часто инициирует авторасчет)
    Элементы.СписокТоваровНаименование.Ширина = 1; 
    Элементы.СписокТоваровНаименование.Ширина = 0; 
КонецПроцедуры

Способ 3: Оптимизация структуры групп и свойств растягивания

Часто проблема «вылета» колонок за границы экрана связана с тем, что у нескольких колонок одновременно установлено свойство «Растягивать по горизонтали» в значение Истина. Проанализируем настройки элементов формы:

Также эффективно использование объекта «Группа колонок». Если мы установим свойство «Отображение» в значение «Вместе», платформа будет стараться удерживать элементы внутри этой группы как единое целое, что предотвращает их хаотичное расползание.

Способ 4: Решение через обработчик ожидания (Workaround)

Как показывает практика и обсуждения на форумах, иногда стандартные события срабатывают слишком рано, когда параметры экрана еще не до конца применены операционной системой (Android или iOS). В таком случае можно применить метод «отложенного обновления». Разберем алгоритм, предложенный автором темы:

  1. В событии ПриИзмененииПараметровЭкрана мы не меняем данные сразу, а подключаем обработчик ожидания на очень короткий срок (например, 0.1 - 0.5 секунды).
  2. В процедуре обработчика ожидания выполняем действия по обновлению формы.

Пример реализации кода:


&НаКлиенте
Процедура ПриИзмененииПараметровЭкрана(ПараметрыЭкрана)
    // Подключаем однократное выполнение через 0.5 секунды
    ПодключитьОбработчикОжидания("ВыполнитьПересчетВерстки", 0.5, Истина);
КонецПроцедуры

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

Дополнительные рекомендации по работе с мобильной платформой

Важно помнить о влиянии «Автовысоты ячейки». Если в таблице включена автовысота для многострочных полей, это создает огромную нагрузку на графическую подсистему при повороте. Платформа должна сначала вычислить новую ширину, затем понять, сколько строк займет текст, и только потом установить высоту строки. Если устройство недостаточно мощное, этот процесс визуально выглядит как «дерганье» или зависание колонок в неправильном положении.

Рассмотрим еще один важный аспект — системный масштаб шрифта. Если пользователь в настройках Android установил «Крупный шрифт», то 1С попытается отрисовать колонку так, чтобы этот шрифт влез в одну строку (если не задана многострочность). Это часто приводит к выходу элементов за экран. Рекомендуем в свойствах формы устанавливать «Вариант масштабирования» — «Компактный», чтобы минимизировать влияние системных настроек на бизнес-логику интерфейса.

Таким образом, комбинируя программное управление через ОбновитьОтображениеДанных(), правильную настройку свойств растягивания и, в крайних случаях, использование обработчиков ожидания, мы можем добиться стабильного и предсказуемого поведения интерфейса мобильного приложения при любых действиях пользователя.

← На главную