При разработке под мобильный клиент программисты часто сталкиваются с ситуацией, когда стандартный код, успешно работающий в тонком клиенте, начинает выдавать ошибки. Одной из самых распространенных проблем является обращение к свойству ТекущиеДанные таблицы формы. В мобильной среде это свойство ведет себя нестабильно, что приводит к ошибке "Значение не является значением объектного типа". В этой статье мы подробно разберем, почему это происходит и как реализовать получение данных строки максимально надежно.
Рассмотрим стандартный фрагмент кода, который вызывает затруднения:
СтрокаТабличнойЧасти = Элементы.Запасы.ТекущиеДанные;
СтрКоличество = СтрокаТабличнойЧасти.Количество;
В мобильном клиенте этот код часто «валится» на второй строке. Выясним причину: свойство ТекущиеДанные возвращает Неопределено. Это происходит по нескольким причинам, специфичным для мобильной платформы:
ТекущиеДанные сильно завязано на визуальное отображение. Если строка визуально не выделена (например, после обновления списка), свойство обнуляется.Чтобы избежать подобных проблем, нам необходимо использовать более стабильные механизмы связи интерфейса и данных.
Самый надежный способ получить данные — использовать свойство ТекущаяСтрока, которое содержит внутренний идентификатор строки (число), а не саму строку. Этот идентификатор гораздо стабильнее хранится в памяти мобильного клиента.
Рассмотрим правильный алгоритм получения данных:
// 1. Получаем идентификатор выделенной строки
ИдентификаторСтроки = Элементы.Запасы.ТекущаяСтрока;
// 2. Обязательно проверяем, выделена ли вообще строка
Если ИдентификаторСтроки <> Неопределено Тогда
// 3. Находим строку в коллекции данных объекта по идентификатору
СтрокаТабличнойЧасти = Объект.Запасы.НайтиПоИдентификатору(ИдентификаторСтроки);
// 4. Теперь можно безопасно обращаться к реквизитам
НужноеКоличество = СтрокаТабличнойЧасти.Количество;
НужнаяНоменклатура = СтрокаТабличнойЧасти.Номенклатура;
КонецЕсли;
Важный нюанс: Данный метод работает как на стороне клиента, так и на стороне сервера. Однако, если вам нужно выполнить сложную логику, лучше передать идентификатор на сервер и уже там вызвать НайтиПоИдентификатору. Это обеспечит лучшую производительность мобильного приложения.
Иногда в мобильном клиенте включен режим выделения нескольких строк. В этом случае свойство ТекущаяСтрока вернет только последнюю активную строку. Если нам нужно обработать все выделенные пользователем позиции, проанализируем следующий пример:
Для Каждого ТекущийИдентификатор Из Элементы.Запасы.ВыделенныеСтроки Цикл
СтрокаДанных = Объект.Запасы.НайтиПоИдентификатору(ТекущийИдентификатор);
Если СтрокаДанных <> Неопределено Тогда
// Выполняем действия с данными строки
Сообщить("Выбрана номенклатура: " + СтрокаДанных.Номенклатура);
КонецЕсли;
КонецЦикла;
Обратите внимание, что коллекция ВыделенныеСтроки содержит массив идентификаторов. Работа через НайтиПоИдентификатору гарантирует, что мы получим актуальные данные из Объект, даже если визуальное состояние таблицы изменилось.
Выясним, как проверить значения переменных, если стандартная отладка не подключается. В мобильном клиенте это частая проблема из-за настроек брандмауэра или портов.
Если отладчик не работает, воспользуемся альтернативными методами контроля состояния кода:
ЗаписьЖурналаРегистрации. Это позволит вам увидеть значения переменных на сервере после выполнения кода на мобильном устройстве.Сообщить(), которое может перекрыть интерфейс, используйте ПоказатьОповещениеПользователя().ТипЗнч() или простым сравнением с Неопределено.Для настройки полноценной отладки необходимо:
Подведем итог. Чтобы ваш код в мобильном клиенте работал без сбоев, придерживайтесь следующих правил:
1. Никогда не полагайтесь на ТекущиеДанные как на единственный источник информации в мобильном клиенте. Используйте связку ТекущаяСтрока + НайтиПоИдентификатору.
2. Всегда делайте проверку на Неопределено. В мобильном интерфейсе пользователь может тапнуть мимо строки в любой момент.
3. Разделяйте контексты. Если данные строки нужны для расчета на сервере, передавайте на сервер только Идентификатор, а не всю структуру строки.
Соблюдение этих простых правил позволит создавать стабильные мобильные решения, которые не будут пугать пользователей неожиданными ошибками при каждом нажатии на экран.