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

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

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

Разбор проблемы пролистывания

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

Решение через использование служебных страниц

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

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

Рассмотрим пример реализации на Клиенте:


&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
    НомерПослСтр = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.Количество() - 1;
    
    // Проверка, что мы достигли крайней «служебной» страницы
    Если Элементы.ГруппаСтраницы.ТекущаяСтраница.Имя = "СтраницаКартыСлужебнаяКонец" Тогда
        Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.Найти("СтраницаКарты0");
    ИначеЕсли Элементы.ГруппаСтраницы.ТекущаяСтраница.Имя = "СтраницаКартыСлужебнаяНачало" Тогда
        Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.Получить(НомерПослСтр - 1);
    КонецЕсли;
КонецПроцедуры

Важные рекомендации по реализации

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

Посмотрим на пример правильной инициализации текущей страницы при создании формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Инициализация рабочих страниц...
    
    // Установка начальной страницы после отрисовки
    #Если МобильноеПриложениеКлиент Тогда
        Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаКарты1;
    #КонецЕсли
КонецПроцедуры

Альтернативный подход: Паттерн «Три страницы»

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

В этом случае при любом перелистывании:

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

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

← На главную