При разработке мобильных приложений на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда стандартные элементы управления ведут себя не так, как в десктопной версии. Одной из таких проблем является некорректное отображение элемента Переключатель. Суть проблемы заключается в следующем: в конфигураторе список выбора заполнен, данные в реквизите есть, на форме появляются характерные "кружочки" выбора, но текст рядом с ними (представление) остается абсолютно пустым. Проблема может проявляться как на эмуляторах, так и на реальных устройствах под управлением Android и iOS.
В этой статье мы подробно разберем причины возникновения данной ошибки и проанализируем пошаговые методы её решения, основываясь на опыте разработчиков и особенностях движка мобильной платформы.
Одной из наиболее вероятных причин возникновения пустых строк является механизм кэширования конфигурации на мобильном устройстве. В отличие от тонкого клиента для ПК, мобильное приложение хранит структуру метаданных и визуальных компонентов более жестко. Если в процессе разработки реквизит или элемент формы претерпел изменения, мобильный клиент может "запомнить" старое состояние связей между данными и их представлением.
Проанализируем ситуацию, описанную в практике: иногда обычная очистка кэша приложения в настройках мобильного устройства не помогает, так как ошибка кроется в индексах внутри самой базы данных мобильного приложения. В таких случаях наиболее эффективным методом решения является пересоздание реквизита.
Разберем этот процесс по шагам:
Переключатель).Строка) и добавим его на форму.Почему это работает? При создании нового реквизита платформа присваивает ему новый внутренний идентификатор (UUID). Для мобильной платформы это служит сигналом к созданию абсолютно нового объекта в локальной базе устройства, что полностью исключает использование битых ссылок из старого кэша.
Рассмотрим специфику работы мобильной платформы с типами данных. В десктопной версии 1С, если в списке выбора заполнено поле "Значение", а поле "Представление" оставлено пустым, система автоматически подставляет значение вместо текста. На мобильной платформе (особенно версий 8.3.13 – 8.3.15) этот механизм может давать сбой.
Выясним причину: мобильный клиент крайне чувствителен к настройкам локализации. Мы рекомендуем всегда заполнять колонку "Представление" явно. Чтобы убедиться в корректности данных, выполните следующие действия:
Проанализируем еще один технический нюанс. Мобильная платформа строго контролирует соответствие типов данных в реквизите и в списке выбора. Если ваш реквизит имеет тип Строка(20), а в списке выбора вы указали значение длиной 25 символов или строку неограниченной длины, связь может нарушиться.
Также критичным фактором являются лишние пробелы (Trailing Spaces). Если в значении реквизита записана строка "Вариант1", а в списке выбора указано "Вариант1 " (с пробелом в конце), мобильный переключатель создаст строку выбора, но не сможет сопоставить её с представлением, из-за чего строка останется пустой. Всегда проверяйте соответствие типов Ограниченная строка и Неограниченная строка.
Иногда проблема кроется не в данных, а в моменте отрисовки формы. Мобильное приложение может начать формировать графические элементы интерфейса до того, как список выбора будет окончательно инициализирован. Опытные разработчики рекомендуют уходить от статического заполнения списка в свойствах элемента формы в пользу программного кода.
Посмотрим на пример правильного заполнения списка выбора в событии ПриСозданииНаСервере. Это гарантирует, что при передаче формы на мобильный клиент данные уже будут находиться в структуре элемента:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Очищаем список выбора перед заполнением
Элементы.ИмяРеквизитаПереключатель.СписокВыбора.Очистить();
// Добавляем значения с явным указанием представления
Элементы.ИмяРеквизитаПереключатель.СписокВыбора.Добавить("Самовывоз", "Заберу сам в магазине");
Элементы.ИмяРеквизитаПереключатель.СписокВыбора.Добавить("Доставка", "Доставить курьером по адресу");
// Если проблема сохраняется, можно попробовать принудительно обновить отображение
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
Если даже после программного заполнения строки остаются пустыми, попробуйте перенести вызов метода ОбновитьОтображениеДанных() в событие ПриОткрытии на клиенте. Это заставит графический движок мобильной платформы пересчитать ширину элементов и отобразить текст.
На мобильной платформе существует режим "Компактный интерфейс". В некоторых случаях, если переключатель находится внутри сложной иерархии групп (например, группа с видом Страницы или Группа колонок), алгоритм расчета ширины текста может ошибочно установить для представления нулевую ширину. Текст фактически присутствует, но он "сжат" до невидимого состояния.
Чтобы проверить эту теорию, попробуйте временно вынести переключатель в корень формы или изменить свойство РастягиватьПоГоризонтали. Если текст появится — значит, проблема в компоновке формы, и необходимо пересмотреть структуру групп.
Подводя итог, можно выделить следующий алгоритм действий при обнаружении пустых строк в переключателе на мобильной платформе:
СписокВыбора.Добавить() в серверном коде.Соблюдение этих правил позволит вам создавать стабильные и визуально корректные мобильные интерфейсы на базе 1С.