При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача создания интерфейса «карусели» — циклического пролистывания контента. Несмотря на то, что стандартный элемент управления Группа с видом Страницы и настройкой Пролистывание не поддерживает бесконечное зацикливание «из коробки», мы можем добиться этого эффекта, используя логику программного переключения страниц.
Основная сложность заключается в том, что событие ПриСменеСтраницы срабатывает только при переходе на уже существующий объект. Если мы попытаемся выполнить свайп за пределы последней страницы в надежде, что 1С сама перебросит нас на первую, мы столкнемся с тем, что платформа просто заблокирует жест. Нам необходимо «обмануть» интерфейс, подставив в нужный момент служебные страницы.
Суть метода заключается в добавлении двух «невидимых» для пользователя, но физически существующих страниц: одной перед первой и одной после последней. Когда пользователь совершает свайп, достигая края, мы программно переключаем его на нужную рабочую страницу.
ПриСменеСтраницы для группы страниц.Рассмотрим пример реализации на Клиенте:
&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
НомерПослСтр = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.Количество() - 1;
// Проверка, что мы достигли крайней «служебной» страницы
Если Элементы.ГруппаСтраницы.ТекущаяСтраница.Имя = "СтраницаКартыСлужебнаяКонец" Тогда
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.Найти("СтраницаКарты0");
ИначеЕсли Элементы.ГруппаСтраницы.ТекущаяСтраница.Имя = "СтраницаКартыСлужебнаяНачало" Тогда
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницы.ПодчиненныеЭлементы.Получить(НомерПослСтр - 1);
КонецЕсли;
КонецПроцедуры
При работе с динамическими страницами важно учитывать несколько технических нюансов, чтобы избежать ошибок типизации и зависаний интерфейса:
Видимость = Ложь) исключаются из механизма пролистывания. Чтобы карусель работала плавно, служебные страницы должны быть видимыми. Скройте их заголовок, чтобы они не отвлекали пользователя.ТекущаяСтраница. Используйте метод Элементы.Найти() или явное обращение к коллекции Элементы.Посмотрим на пример правильной инициализации текущей страницы при создании формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализация рабочих страниц...
// Установка начальной страницы после отрисовки
#Если МобильноеПриложениеКлиент Тогда
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаКарты1;
#КонецЕсли
КонецПроцедуры
Если вы создаете большое количество страниц динамически, создание их всех сразу приведет к перерасходу памяти и «тяжелому» интерфейсу. Профессиональным решением является использование всего трех страниц на форме: Предыдущая, Текущая, Следующая.
В этом случае при любом перелистывании:
Текущую страницу.Этот подход требует более сложной логики управления данными, но обеспечивает максимальную производительность мобильного приложения. Применяйте описанные методы в зависимости от требований к количеству отображаемых данных и сложности структуры вашего приложения.