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