Как реализовать адаптивное растягивание табличного документа в мобильном приложении 1С при повороте экрана?

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

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

Анализ проблемы: почему отчет не адаптируется автоматически

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

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

Шаг 1. Отслеживание поворота экрана

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


&НаКлиенте
Процедура ПриИзмененииПараметровЭкрана()
    МассивИнфо = ПолучитьИнформациюЭкрановКлиента();
    
    Если МассивИнфо.Количество() Тогда
        ИнформацияЭкрана = МассивИнфо[0];
        
        Если ИнформацияЭкрана.Высота < ИнформацияЭкрана.Ширина Тогда
            // Экран в горизонтальном положении (Landscape)
            СостояниеЭкрана = "Горизонтально";
        Иначе
            // Экран в вертикальном положении (Portrait)
            СостояниеЭкрана = "Вертикально";
        КонецЕсли;
        
        // Вместо прямого вывода отчета используем обработчик ожидания
        ПодключитьОбработчикОжидания("ВыполнитьАдаптациюОтчета", 0.1, Истина);
    КонецЕсли;
КонецПроцедуры

Важный момент: использование метода ПодключитьОбработчикОжидания с минимальным интервалом (0.1 сек) является критически важным «костылем» для мобильной платформы. Это позволяет завершить текущий цикл отрисовки интерфейса и выполнить обновление отчета в следующем такте, что устраняет ошибку «Невозможно осуществить вывод результата».

Шаг 2. Настройка автоматического масштабирования

Посмотрим на свойства объекта ТабличныйДокумент. Для того чтобы мобильная платформа самостоятельно пыталась вписать отчет в ширину экрана, необходимо использовать свойство АвтоМасштаб. Проанализируем, как это применить программно:


&НаКлиенте
Процедура ВыполнитьАдаптациюОтчета()
    // Обращаемся к реквизиту формы, содержащему табличный документ
    Результат.АвтоМасштаб = Истина;
    Результат.ТолькоПросмотр = Истина; 
    
    // Принудительно обновляем отображение
    ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры

Свойство АвтоМасштаб на мобильном устройстве работает иначе, чем на десктопе: оно ориентируется на установленную область печати. Если вы формируете отчет вручную (не через СКД), убедитесь, что вы явно задали область печати, иначе платформа может не понять, какие границы нужно масштабировать.

Шаг 3. Программное перестроение макета (Метод «Чистой доски»)

Если простое изменение масштаба не помогает и отчет выглядит «сплюснутым», рассмотрим наиболее надежный метод — полное перестроение табличного документа. Это особенно актуально, если для горизонтального и вертикального положений вы хотите использовать разные макеты (например, выводить дополнительные колонки в альбомном режиме).

Разберем по шагам алгоритм в процедуре, вызываемой через обработчик ожидания:

  1. Очистка: Полностью очищаем текущий табличный документ методом Результат.Очистить().
  2. Повторный вывод: Вызываем серверную процедуру формирования отчета, которая заново обходит выборку данных и заполняет области макета.
  3. Фиксация настроек: Устанавливаем параметры печати и просмотра.

&НаСервере
Процедура СформироватьОтчетНаСервере()
    // Очищаем старые данные
    Результат.Очистить();
    
    // Получаем макет и выводим области
    Макет = Отчеты.МойМобильныйОтчет.ПолучитьМакет("Основной");
    // ... логика заполнения документа ...
    
    // Устанавливаем область печати для корректного Автомасштаба
    Результат.ОбластьПечати = Результат.Область(1, 1, НомерПоследнейСтроки, НомерПоследнейКолонки);
КонецПроцедуры

Альтернативные подходы: HTML и СКД

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

Использование Поля HTML-документа

Вывод отчета в формате HTML позволяет использовать всю мощь адаптивной верстки (CSS width: 100%). Если ваш отчет не требует сложного редактирования ячеек пользователем, конвертация табличного документа в HTML перед выводом на форму может решить все проблемы с поворотом экрана автоматически. Платформа сама перерисует HTML-контейнер при изменении размера окна.

Переход на Систему компоновки данных (СКД)

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

Резюме и рекомендации

Для реализации качественного мобильного отчета выполните следующие действия:

  1. Всегда устанавливайте свойства АвтоМасштаб = Истина и ТолькоПросмотр = Истина.
  2. В конфигураторе для элемента формы «Поле табличного документа» установите флаги «Растягивать по горизонтали» и «Растягивать по вертикали».
  3. Используйте ПодключитьОбработчикОжидания для перерисовки отчета после поворота, чтобы избежать блокировок интерфейса.
  4. Если отчет «едет», явно задавайте ОбластьПечати после каждого формирования.

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

← На главную