Как корректно получить данные выделенной строки в табличной части мобильного клиента 1С?

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

При разработке под мобильный клиент программисты часто сталкиваются с ситуацией, когда стандартный код, успешно работающий в тонком клиенте, начинает выдавать ошибки. Одной из самых распространенных проблем является обращение к свойству ТекущиеДанные таблицы формы. В мобильной среде это свойство ведет себя нестабильно, что приводит к ошибке "Значение не является значением объектного типа". В этой статье мы подробно разберем, почему это происходит и как реализовать получение данных строки максимально надежно.

Проанализируем причину возникновения ошибки

Рассмотрим стандартный фрагмент кода, который вызывает затруднения:


СтрокаТабличнойЧасти = Элементы.Запасы.ТекущиеДанные; 
СтрКоличество = СтрокаТабличнойЧасти.Количество;

В мобильном клиенте этот код часто «валится» на второй строке. Выясним причину: свойство ТекущиеДанные возвращает Неопределено. Это происходит по нескольким причинам, специфичным для мобильной платформы:

  1. Потеря фокуса: На мобильных устройствах фокус с таблицы может пропадать при случайном нажатии на область экрана вне строк, при переходе между полями ввода или из-за особенностей тач-интерфейса.
  2. Асинхронность работы: Мобильный клиент оптимизирует передачу данных между сервером и устройством. В момент выполнения кода состояние формы на клиенте может еще не обновиться.
  3. Особенности отрисовки: Свойство ТекущиеДанные сильно завязано на визуальное отображение. Если строка визуально не выделена (например, после обновления списка), свойство обнуляется.

Чтобы избежать подобных проблем, нам необходимо использовать более стабильные механизмы связи интерфейса и данных.

Решение №1: Использование идентификатора через ТекущуюСтроку

Самый надежный способ получить данные — использовать свойство ТекущаяСтрока, которое содержит внутренний идентификатор строки (число), а не саму строку. Этот идентификатор гораздо стабильнее хранится в памяти мобильного клиента.

Рассмотрим правильный алгоритм получения данных:


// 1. Получаем идентификатор выделенной строки
ИдентификаторСтроки = Элементы.Запасы.ТекущаяСтрока;

// 2. Обязательно проверяем, выделена ли вообще строка
Если ИдентификаторСтроки <> Неопределено Тогда
    
    // 3. Находим строку в коллекции данных объекта по идентификатору
    СтрокаТабличнойЧасти = Объект.Запасы.НайтиПоИдентификатору(ИдентификаторСтроки);
    
    // 4. Теперь можно безопасно обращаться к реквизитам
    НужноеКоличество = СтрокаТабличнойЧасти.Количество;
    НужнаяНоменклатура = СтрокаТабличнойЧасти.Номенклатура;
    
КонецЕсли;

Важный нюанс: Данный метод работает как на стороне клиента, так и на стороне сервера. Однако, если вам нужно выполнить сложную логику, лучше передать идентификатор на сервер и уже там вызвать НайтиПоИдентификатору. Это обеспечит лучшую производительность мобильного приложения.

Решение №2: Обработка множественного выделения

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


Для Каждого ТекущийИдентификатор Из Элементы.Запасы.ВыделенныеСтроки Цикл
    
    СтрокаДанных = Объект.Запасы.НайтиПоИдентификатору(ТекущийИдентификатор);
    
    Если СтрокаДанных <> Неопределено Тогда
        // Выполняем действия с данными строки
        Сообщить("Выбрана номенклатура: " + СтрокаДанных.Номенклатура);
    КонецЕсли;
    
КонецЦикла;

Обратите внимание, что коллекция ВыделенныеСтроки содержит массив идентификаторов. Работа через НайтиПоИдентификатору гарантирует, что мы получим актуальные данные из Объект, даже если визуальное состояние таблицы изменилось.

Особенности отладки в мобильном клиенте

Выясним, как проверить значения переменных, если стандартная отладка не подключается. В мобильном клиенте это частая проблема из-за настроек брандмауэра или портов.

Если отладчик не работает, воспользуемся альтернативными методами контроля состояния кода:

  1. Логирование через Журнал регистрации: Используйте функцию ЗаписьЖурналаРегистрации. Это позволит вам увидеть значения переменных на сервере после выполнения кода на мобильном устройстве.
  2. Всплывающие оповещения: Вместо Сообщить(), которое может перекрыть интерфейс, используйте ПоказатьОповещениеПользователя().
  3. Проверка типов: Перед обращением к свойствам всегда проверяйте тип переменной функцией ТипЗнч() или простым сравнением с Неопределено.

Для настройки полноценной отладки необходимо:

Рекомендации по написанию отказоустойчивого кода

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

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

2. Всегда делайте проверку на Неопределено. В мобильном интерфейсе пользователь может тапнуть мимо строки в любой момент.

3. Разделяйте контексты. Если данные строки нужны для расчета на сервере, передавайте на сервер только Идентификатор, а не всю структуру строки.

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

← На главную