Разработка интерфейсов для мобильной платформы 1С имеет свои уникальные особенности, которые часто сбивают с толку даже опытных разработчиков. Одной из таких проблем является программная активация строки в табличной части. Если в тонком клиенте привычная конструкция Элементы.ИмяТаблицы.ТекущаяСтрока = Идентификатор работает безотказно, то в мобильном приложении курсор может визуально не переместиться. В этой статье мы подробно разберем, как добиться корректного поведения интерфейса.
Проанализируем стандартную ситуацию. Часто разработчики пытаются установить строку, используя ее индекс или номер. Рассмотрим типичную ошибку:
// ОШИБОЧНЫЙ ВАРЬЯНТ
МассивНайденныхСтрок = Объект.Товары.НайтиСтроки(ПараметрыПоиска);
Если МассивНайденныхСтрок.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = МассивНайденныхСтрок[0].НомерСтроки;
КонецЕсли;
Проблема заключается в том, что свойство ТекущаяСтрока ожидает не порядковый номер, а уникальный внутренний идентификатор строки. В тонком клиенте система иногда прощает подмену типов или номера строк случайно совпадают с идентификаторами (если таблица не сортировалась и не редактировалась), но в мобильном приложении это приводит к игнорированию команды.
Для того чтобы мобильное приложение поняло, какую именно строку мы хотим выделить, необходимо использовать метод ПолучитьИдентификатор(). Выясним, как это выглядит на практике при поиске строки по какому-либо реквизиту (например, по штрихкоду):
Отбор = Новый Структура("Штрихкод", СокрЛП(ИскомыйШтрихкод));
Строки = Объект.Товары.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
// Получаем уникальный идентификатор первой найденной строки
ИдентификаторСтроки = Строки[0].ПолучитьИдентификатор();
// Устанавливаем текущую строку в элементе формы
Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
КонецЕсли;
Важно: Никогда не используйте свойство НомерСтроки для позиционирования курсора. Идентификаторы строк в 1С постоянны в рамках сеанса работы с формой, в то время как номера строк меняются при любой сортировке или удалении элементов выше по списку.
Даже если код написан верно, в мобильном приложении строка может остаться визуально не выделенной. Это связано с особенностями отрисовки мобильного интерфейса. По умолчанию таблицы в мобильном приложении могут быть настроены так, чтобы не отображать «фокус» на строке ради экономии места или упрощения вида.
Чтобы активация стала видимой, проанализируем свойства таблицы в конфигураторе или программно. Нам необходимо свойство ИспользованиеТекущейСтроки. Рассмотрим доступные варианты:
Для решения нашей задачи установим свойство в значение Отображение выделения. Это гарантирует, что при программной установке ТекущаяСтрока система подсветит ее цветом.
В мобильных приложениях часто встречается ситуация: строка выделилась (внутренне), но пользователь ее не видит, так как она находится «ниже экрана». Платформа не всегда автоматически прокручивает длинные списки к выделенному элементу.
Посмотрим на профессиональный прием решения этой проблемы — использование обработчика ожидания. Это позволяет дать интерфейсу время на обновление состояния перед тем, как система сфокусируется на объекте:
&НаКлиенте
Процедура ПослеПоискаШтрихкода()
// Код поиска...
ПеременнаяИдентификатор = ИдентификаторНайденнойСтроки;
// Вызываем прокрутку с небольшой задержкой
ПодключитьОбработчикОжидания("УстановитьФокусНаСтроку", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьФокусНаСтроку()
Элементы.Товары.ТекущаяСтрока = ПеременнаяИдентификатор;
КонецПроцедуры
Такой подход заставляет мобильное приложение гарантированно перерисовать таблицу и центрировать экран на выбранном элементе.
Если стандартная подсветка строки кажется вам недостаточно яркой или если режим Отображение выделения конфликтует с логикой выбора, разберем метод через Условное оформление. Это «золотой стандарт» для мобильной разработки 1С.
Суть метода заключается в следующем:
ВыделеннаяСтрокаID (тип: Произвольный).ИдентификаторТекущейСтроки (или другой признак) равен ВыделеннаяСтрокаID, то установить цвет фона (например, светло-зеленый).ТекущаяСтрока просто записываем идентификатор в наш реквизит.Это обеспечит 100% видимость выделения вне зависимости от системных настроек конкретного мобильного устройства (Android или iOS).
Проанализировав все способы, выделим основные правила для работы в мобильном приложении:
ПолучитьИдентификатор() вместо индексов.ИспользованиеТекущейСтроки у элемента формы Таблица.ПодключитьОбработчикОжидания.Эти методы позволят сделать мобильный интерфейс отзывчивым и удобным для пользователя, обеспечивая привычное поведение приложения даже на небольших экранах мобильных устройств.