Разработка для мобильной платформы 1С:Предприятие имеет ряд существенных отличий от работы с десктопным приложением. Одна из классических проблем, с которой сталкиваются разработчики — это ситуация, когда код Документы.МойДокумент.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)) прекрасно работает на компьютере, но возвращает «пустое» значение или объект не находится на мобильном устройстве. Проанализируем причины этого поведения и разберем по шагам способы решения проблемы.
Первое и самое важное, что мы должны уяснить: метод ПолучитьСсылку() не обращается к базе данных. Он работает «математически», просто создавая в оперативной памяти объект типа Ссылка с заданным внутренним идентификатором. Это означает, что даже если в вашей мобильной базе физически нет документа с таким GUID, метод все равно вернет ссылку. Однако эта ссылка будет битой.
Рассмотрим ситуацию: если вы попытаетесь прочитать реквизит такой ссылки, например Ссылка.Дата, мобильная платформа может вернуть пустое значение или значение по умолчанию. В обычном приложении на Windows поведение может отличаться (иногда выдается ошибка «Объект не найден»), но на мобильной платформе это часто выглядит как «пустой результат».
Для проверки того, существует ли объект в базе на самом деле, мы должны использовать метод ПолучитьОбъект(). Давайте проанализируем пример кода для проверки:
// Создаем ссылку по GUID
ТекСсылка = Документы.МойДокумент.ПолучитьСсылку(Новый УникальныйИдентификатор(МассивGUID[0]));
// Проверяем, существует ли объект в локальной базе мобильного устройства
ТекОбъект = ТекСсылка.ПолучитьОбъект();
Если ТекОбъект = Неопределено Тогда
Сообщить("Документ в локальной базе мобильного устройства отсутствует!");
Иначе
Сообщить("Документ найден: " + Строка(ТекОбъект));
КонецЕсли;
Если справочники находятся, а документы — нет, это верный признак того, что данные просто не попали в мобильное устройство при обмене. Выясним причину, почему документа может не быть в базе:
GUID, старше этого периода, его не будет в SQLite базе мобильного устройства.Чтобы убедиться, что документ вообще есть в телефоне, воспользуемся советом из обсуждения и попробуем найти его по номеру:
ДокСсылка = Документы.МойДокумент.НайтиПоНомеру("0001", ДатаДокумента);
Если ДокСсылка.Пустая() Тогда
Сообщить("Документ с таким номером не найден в мобильной базе");
Иначе
Сообщить("УИД найденного документа: " + Строка(ДокСсылка.УникальныйИдентификатор()));
КонецЕсли;
Мобильная платформа 1С работает на базе SQLite и крайне чувствительна к чистоте входных данных. Если переменная Массив[0], из которой вы берете строку для GUID, получена через внешние источники (JSON, XML, HTTP-запрос), в ней могут содержаться невидимые символы.
Проанализируем возможные проблемы со строкой:
\r\n, которые часто приходят в конце текстовых данных.GUID, SQLite в некоторых версиях платформы (особенно старых, как 8.3.15) может вести себя некорректно.Рекомендуется всегда обрабатывать строку перед созданием УникальногоИдентификатора:
ЧистаяСтрока = СокрЛП(Строка(Массив[0]));
// Можно также принудительно привести к нижнему или верхнему регистру
ЧистаяСтрока = НРег(ЧистаяСтрока);
Попытка
НовыйУИД = Новый УникальныйИдентификатор(ЧистаяСтрока);
ТекСсылка = Документы.МойДокумент.ПолучитьСсылку(НовыйУИД);
Исключение
Сообщить("Ошибка формата GUID: " + ЧистаяСтрока);
КонецПопытки;
В версии платформы 8.3.15.59, упомянутой в теме, встречались ошибки, связанные с кэшированием метаданных и индексов. Если структура конфигурации менялась, а данные обновлялись «на лету», индексы SQLite могли работать некорректно.
Разберем способы лечения таких «багов»:
.1cd или база SQLite в зависимости от режима сборки) и открыть его на компьютере, чтобы физически увидеть, есть ли там нужная запись в таблице документов.Подводя итог, если поиск по GUID не работает на мобильной платформе, придерживайтесь следующего алгоритма:
ПолучитьОбъект(), что проблема не в пустой ссылке, а в отсутствии данных.СокрЛП() и явное приведение к Строке при создании УникальныйИдентификатор.8.3.15, попробуйте обновить версию мобильной платформы, так как многие ошибки работы с SQLite были исправлены в более поздних релизах (8.3.18+).Помните, что мобильная платформа — это не «урезанная 1С», а самостоятельная среда со своими правилами работы с памятью и хранением данных. Внимательное отношение к типам данных и чистоте строк поможет избежать большинства проблем с поиском объектов.