Как исправить ошибку «Несоответствие свойства и элемента данных XDTO: currentRowUse» на мобильной платформе 1С?

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

При разработке приложений на мобильной платформе 1С:Предприятие программисты часто сталкиваются со специфическими ошибками, которые не проявляются в обычном тонком клиенте. Одной из самых коварных является ошибка «Несоответствие свойства и элемента данных XDTO: 'currentRowUse'». Она возникает в ситуациях, когда мы пытаемся взаимодействовать со строками таблицы на форме, например, при получении данных текущей строки для открытия другой формы или выполнения расчетов.

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

Выясним причину возникновения ошибки

Для начала проанализируем ситуацию: ошибка явно указывает на XDTO. Это означает, что проблема кроется в процессе сериализации данных при передаче информации между мобильным клиентом и сервером. Мобильная платформа оптимизирует трафик, и свойство currentRowUse (Использование текущей строки) отвечает за то, нужно ли передавать состояние текущей строки на сервер в конкретный момент времени.

Разберем механизм: когда вы нажимаете на строку таблицы, мобильное приложение формирует пакет данных для сервера. Если в метаданных формы или настройках элементов управления указано одно поведение (например, «Использовать»), а программная логика или вложенность элементов заставляет платформу ожидать другое состояние, происходит сбой XDTO-схемы. Чаще всего это является внутренним багом определенных версий платформы (8.3.16.х – 8.3.17.х), где логика оптимизации трафика вступает в противоречие с реальным составом передаваемого объекта.

Способ 1: Обход обращения к свойству ТекущиеДанные

Рассмотрим пример кода, который чаще всего приводит к ошибке. Как правило, разработчики используют обработчик события Выбор или ПриАктивизацииСтроки, где обращаются к свойству ТекущиеДанные элемента формы.

Пример проблемного кода:


&НаКлиенте
Процедура ТаблицаЗначенийНаФормеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Обращение к ТекущиеДанные через Элементы вызывает ошибку XDTO
    ДанныеСтроки = Элементы.ТаблицаЗначенийНаФорме.ТекущиеДанные; 
    
    ПараметрыФормы = Новый Структура("Пациент, НомерКарты");
    ЗаполнитьЗначенияСвойств(ПараметрыФормы, ДанныеСтроки); 
    ОткрытьФорму("Обработка.ПостОтделенияСтационара.Форма.ФормаВыбораДействия", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

Для решения проблемы мы предлагаем отказаться от прямого обращения к Элементы.ИмяТаблицы.ТекущиеДанные. Вместо этого воспользуемся идентификатором строки, который передается непосредственно в процедуру выбора, и методом поиска в самом объекте данных (коллекции).

Проанализируем исправленный вариант:


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

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

Способ 2: Настройка свойств использования текущей строки

Если программный обход не помогает или ошибка возникает при простом открытии формы, разберем настройки свойств в конфигураторе. Нам необходимо явно указать платформе, как обрабатывать текущую строку.

Выполним следующие шаги:

  1. Откроем форму в конфигураторе и выберем элемент Таблица.
  2. Найдем свойство Использование текущей строки (currentRowUse).
  3. Вместо значения "Авто" установим значение "Использовать" или "Выбор" (в зависимости от вашей логики). Это заставит платформу всегда включать информацию о строке в XDTO-пакет.
  4. Если таблица находится внутри Группы, выберем эту группу и проверим аналогичные свойства. Убедимся, что в поле Используемая таблица выбрана именно ваша таблица значений, а свойство Использование текущей строки совпадает с настройками самой таблицы.

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

Способ 3: Изменение структуры иерархии элементов формы

Проанализируем структуру вашей формы. Замечено, что мобильная платформа некорректно обрабатывает сериализацию, если таблица глубоко вложена в обычные группы (Группа - Группа - Таблица). Рассмотрим возможность упрощения иерархии:

Способ 4: Обновление версии платформы

Поскольку данная проблема часто связана с внутренними ошибками движка 1С, наиболее радикальным и эффективным методом будет переход на более свежую версию мобильной платформы. Ошибка currentRowUse была официально исправлена в версиях, начиная с 8.3.17.х и выше. Если вы используете версию 8.3.16.1063, как автор вопроса, переход на 8.3.18 или 8.3.20, скорее всего, решит проблему без необходимости переписывать код.

Резюме

Мы разобрали основные причины возникновения ошибки currentRowUse и методы её устранения. Подведем итог нашим действиям:

  1. Первым делом попробуйте заменить обращение к Элементы.Таблица.ТекущиеДанные на поиск по идентификатору через Объект.Таблица.НайтиПоИдентификатору().
  2. Явно установите свойства использования текущей строки в конфигураторе для таблицы и всех её родительских групп.
  3. Если ничего не помогает, обновите мобильную платформу до актуальной версии, где баги сериализации XDTO были исправлены разработчиками 1С.
← На главную