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

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

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

Важно понимать, что прямого метода для запрета изменения ориентации экрана средствами встроенного языка 1С не существует. Функциональность платформы позволяет лишь определить текущую ориентацию и, при необходимости, отреагировать на её изменение. Для полноценной фиксации ориентации нам потребуется вмешательство на более низком уровне — в конфигурационный файл Android-приложения.

Использование встроенных средств 1С для реакции на изменение ориентации

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

Определение текущей ориентации экрана

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

Давайте рассмотрим пример функции, которая определяет, является ли текущая ориентация вертикальной:


&НаКлиенте
Функция ЭтоВертикальнаяОриентация() Экспорт 
    
    МассивИнформаций = ПолучитьИнформациюЭкрановКлиента();
    // Мы предполагаем, что нас интересует первый (основной) экран
    Если МассивИнформаций[0].Ширина > МассивИнформаций[0].Высота Тогда
        Возврат Ложь; // Ширина больше высоты, значит ориентация альбомная
    Иначе
        Возврат Истина; // Высота больше или равна ширине, значит ориентация портретная
    КонецЕсли;
    
КонецФункции

Эта функция, вызываемая в нужный момент, позволит нам узнать текущее положение устройства.

Реакция на изменение ориентации экрана

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

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

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

Вот как это могло бы выглядеть в обработчике события формы:


&НаКлиенте
Процедура ПриИзмененииПараметровЭкрана(Элемент)
    Если Не ЭтоВертикальнаяОриентация() Тогда
        // Экран находится в горизонтальной ориентации, которую мы не хотим
        ПоказатьПредупреждение(,"Пожалуйста, поверните устройство в вертикальное положение для продолжения работы.");
        // Возможно, заблокировать интерфейс или закрыть форму:
        // ЭтаФорма.Заблокировать(); 
        // Или даже: 
        // ЭтаФорма.Закрыть();
    Иначе
        // Экран в вертикальной ориентации
        // Если что-то было заблокировано, можно разблокировать
        // ЭтаФорма.Разблокировать();
    КонецЕсли;
КонецПроцедуры

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

Прямая фиксация ориентации через AndroidManifest.xml

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

Что такое AndroidManifest.xml и зачем его править?

Файл AndroidManifest.xml — это сердце любого Android-приложения. Он содержит важную информацию о пакете приложения, его компонентах (активностях, сервисах, получателях широковещательных сообщений, поставщиках контента), требуемых разрешениях, аппаратных и программных функциях, а также минимальном уровне API. Именно в этом файле мы можем найти тег <activity>, который соответствует каждой форме нашего мобильного приложения. Добавив к этому тегу специальный атрибут, мы сможем зафиксировать ориентацию.

Атрибут android:screenOrientation

Для фиксации ориентации мы используем атрибут android:screenOrientation внутри тега <activity>. Этот атрибут определяет, как активность будет реагировать на изменение ориентации устройства. Давайте рассмотрим наиболее часто используемые значения этого атрибута:

  1. portrait: Это значение фиксирует экран в портретной (вертикальной) ориентации. Приложение всегда будет отображаться вертикально, независимо от поворота устройства. Это именно то, что нам нужно в большинстве случаев.
  2. landscape: Фиксирует экран в альбомной (горизонтальной) ориентации.
  3. sensorPortrait: Устройство будет оставаться в портретной ориентации, но при этом будет использовать датчик для определения естественной ориентации (например, если устройство изначально вверх ногами, оно будет отображаться в портретном режиме, но "вверх ногами").
  4. sensorLandscape: Аналогично sensorPortrait, но для альбомной ориентации.
  5. userPortrait / userLandscape: Работают подобно sensorPortrait / sensorLandscape, но также учитывают пользовательские настройки автоповорота. Если автоповорот отключен, ориентация будет зафиксирована в обычной портретной/альбомной ориентации и не будет меняться. Если автоповорот включен, приложение будет следовать датчику.
  6. fullSensor: Позволяет использовать датчик для определения ориентации во всех четырех направлениях (портрет, перевернутый портрет, альбом, перевернутый альбом). Приложение будет поворачиваться вслед за устройством.
  7. reversePortrait / reverseLandscape: Фиксируют экран в обратной портретной/альбомной ориентации соответственно (т.е. на 180 градусов от обычной).
  8. nosensor: Предотвращает изменение ориентации в ответ на физические повороты устройства. Система выбирает ориентацию на основе настроек устройства и того, как была запущена активность.
  9. unspecified: Это значение по умолчанию. Позволяет системе самостоятельно определять ориентацию на основе настроек устройства, датчиков и доступной ориентации.

Для решения нашей задачи по фиксации экрана в положении портрет, мы будем использовать значение <strong>portrait</strong>.

Способы модификации AndroidManifest.xml для мобильных приложений 1С

Так как 1С генерирует APK-файл приложения, напрямую редактировать AndroidManifest.xml в процессе разработки в конфигураторе нельзя. Однако, существуют два основных подхода для внесения необходимых изменений:

  1. Использование файла ANDROID_MANIFEST_EXTENTIONS.XML

    Платформа 1С предоставляет механизм расширения манифеста через файл <strong>ANDROID_MANIFEST_EXTENTIONS.XML</strong>. Этот файл обычно используется при разработке внешних компонент для мобильной платформы, но его принцип заключается в том, что при сборке мобильного приложения 1С, содержимое этого файла (или его части) может быть инжектировано в основной AndroidManifest.xml.

    Для того чтобы зафиксировать ориентацию, мы должны добавить в ANDROID_MANIFEST_EXTENTIONS.XML следующую структуру (или её часть, в зависимости от того, что уже есть):

    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <application>
            <activity android:name=".MainActivity"
                      android:screenOrientation="portrait">
            </activity>
        </application>
    </manifest>
    

    Пояснения:

    • <manifest> и <application> – это корневые теги, которые должны присутствовать.
    • <activity android:name=".MainActivity">: .MainActivity является именем основной активности (главной формы) 1С-приложения. Если ваше приложение имеет несколько активностей (например, используются внешние компоненты, которые создают свои активности), возможно, потребуется указать атрибут android:screenOrientation для каждой из них. Для большинства простых 1С-приложений достаточно изменить основную активность.
    • android:screenOrientation="portrait": Этот атрибут заставляет главную активность всегда оставаться в портретной ориентации.

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

  2. Декомпиляция и пересборка APK

    Этот метод является более сложным и требует глубоких знаний инструментов Android-разработки, но он предоставляет максимальный контроль над AndroidManifest.xml и другими ресурсами приложения. Если файл ANDROID_MANIFEST_EXTENTIONS.XML по какой-то причине не подходит или его возможностей недостаточно, мы можем выполнить следующие шаги:

    1. Сборка APK-файла 1С: Сначала мы собираем наше мобильное приложение в стандартный .apk файл с помощью конфигуратора 1С.
    2. Декомпиляция APK: Используя инструмент <strong>apktool</strong>, мы декомпилируем полученный .apk файл. Это позволит нам получить доступ к его ресурсам и, что наиболее важно, к редактируемому файлу AndroidManifest.xml.
    3. Редактирование AndroidManifest.xml: В декомпилированной структуре находим файл AndroidManifest.xml и вручную добавляем или изменяем атрибут android:screenOrientation="portrait" для нужной активности (обычно это основная активность приложения).
    4. Пересборка APK: После внесения изменений мы используем apktool для обратной сборки приложения в новый .apk файл.
    5. Подпись APK: Пересобранный .apk файл необходимо заново подписать с помощью ваших ключей разработчика (используя jarsigner из JDK). Это критически важный шаг, так как без корректной подписи приложение не сможет быть установлено на устройства.

    Этот метод требует наличия установленного комплекта разработки Java (JDK) и Android SDK с соответствующими инструментами командной строки.

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

Таким образом, для надежной фиксации ориентации экрана мобильного приложения 1С в положении портрет, нам необходимо модифицировать файл AndroidManifest.xml, добавив атрибут android:screenOrientation="portrait" к тегу <activity>. Выбор метода модификации (через ANDROID_MANIFEST_EXTENTIONS.XML или декомпиляцию/пересборку) будет зависеть от сложности проекта и требуемого уровня контроля.

← На главную