При разработке приложений на мобильной платформе 1С:Предприятие программисты часто сталкиваются со специфическими ошибками, которые не проявляются в обычном тонком клиенте. Одной из самых коварных является ошибка «Несоответствие свойства и элемента данных XDTO: 'currentRowUse'». Она возникает в ситуациях, когда мы пытаемся взаимодействовать со строками таблицы на форме, например, при получении данных текущей строки для открытия другой формы или выполнения расчетов.
В этой статье мы подробно разберем, почему возникает этот конфликт, проанализируем механизмы работы мобильной платформы и рассмотрим несколько способов решения — от изменения кода до настройки свойств элементов формы.
Для начала проанализируем ситуацию: ошибка явно указывает на XDTO. Это означает, что проблема кроется в процессе сериализации данных при передаче информации между мобильным клиентом и сервером. Мобильная платформа оптимизирует трафик, и свойство currentRowUse (Использование текущей строки) отвечает за то, нужно ли передавать состояние текущей строки на сервер в конкретный момент времени.
Разберем механизм: когда вы нажимаете на строку таблицы, мобильное приложение формирует пакет данных для сервера. Если в метаданных формы или настройках элементов управления указано одно поведение (например, «Использовать»), а программная логика или вложенность элементов заставляет платформу ожидать другое состояние, происходит сбой XDTO-схемы. Чаще всего это является внутренним багом определенных версий платформы (8.3.16.х – 8.3.17.х), где логика оптимизации трафика вступает в противоречие с реальным составом передаваемого объекта.
Рассмотрим пример кода, который чаще всего приводит к ошибке. Как правило, разработчики используют обработчик события Выбор или ПриАктивизацииСтроки, где обращаются к свойству ТекущиеДанные элемента формы.
Пример проблемного кода:
&НаКлиенте
Процедура ТаблицаЗначенийНаФормеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Обращение к ТекущиеДанные через Элементы вызывает ошибку XDTO
ДанныеСтроки = Элементы.ТаблицаЗначенийНаФорме.ТекущиеДанные;
ПараметрыФормы = Новый Структура("Пациент, НомерКарты");
ЗаполнитьЗначенияСвойств(ПараметрыФормы, ДанныеСтроки);
ОткрытьФорму("Обработка.ПостОтделенияСтационара.Форма.ФормаВыбораДействия", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
Для решения проблемы мы предлагаем отказаться от прямого обращения к Элементы.ИмяТаблицы.ТекущиеДанные. Вместо этого воспользуемся идентификатором строки, который передается непосредственно в процедуру выбора, и методом поиска в самом объекте данных (коллекции).
Проанализируем исправленный вариант:
&НаКлиенте
Процедура ТаблицаЗначенийНаФормеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Получаем данные напрямую из коллекции данных (Объекта),
// используя идентификатор строки, минуя обращение к визуальному элементу
ДанныеСтроки = Объект.ТаблицаЗначенийНаФорме.НайтиПоИдентификатору(ВыбраннаяСтрока);
Если ДанныеСтроки <> Неопределено Тогда
ПараметрыФормы = Новый Структура("Пациент, НомерКарты");
ЗаполнитьЗначенияСвойств(ПараметрыФормы, ДанныеСтроки);
ОткрытьФорму("Обработка.ПостОтделенияСтационара.Форма.ФормаВыбораДействия", ПараметрыФормы, ЭтаФорма);
КонецЕсли;
КонецПроцедуры
Этот метод более надежен для мобильной платформы, так как он не инициирует сложную проверку состояния визуального элемента формы, которая и провоцирует ошибку currentRowUse.
Если программный обход не помогает или ошибка возникает при простом открытии формы, разберем настройки свойств в конфигураторе. Нам необходимо явно указать платформе, как обрабатывать текущую строку.
Выполним следующие шаги:
Таблица.currentRowUse).Важный момент: после изменения этих свойств на мобильном устройстве может остаться старый кэш формы. Рекомендуется полностью удалить приложение с телефона и установить его заново для чистоты эксперимента.
Проанализируем структуру вашей формы. Замечено, что мобильная платформа некорректно обрабатывает сериализацию, если таблица глубоко вложена в обычные группы (Группа - Группа - Таблица). Рассмотрим возможность упрощения иерархии:
Поскольку данная проблема часто связана с внутренними ошибками движка 1С, наиболее радикальным и эффективным методом будет переход на более свежую версию мобильной платформы. Ошибка currentRowUse была официально исправлена в версиях, начиная с 8.3.17.х и выше. Если вы используете версию 8.3.16.1063, как автор вопроса, переход на 8.3.18 или 8.3.20, скорее всего, решит проблему без необходимости переписывать код.
Мы разобрали основные причины возникновения ошибки currentRowUse и методы её устранения. Подведем итог нашим действиям:
Элементы.Таблица.ТекущиеДанные на поиск по идентификатору через Объект.Таблица.НайтиПоИдентификатору().