Почему не находится документ по GUID (УИД) на мобильной платформе 1С?

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

Разработка для мобильной платформы 1С:Предприятие имеет ряд существенных отличий от работы с десктопным приложением. Одна из классических проблем, с которой сталкиваются разработчики — это ситуация, когда код Документы.МойДокумент.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)) прекрасно работает на компьютере, но возвращает «пустое» значение или объект не находится на мобильном устройстве. Проанализируем причины этого поведения и разберем по шагам способы решения проблемы.

1. Понимание механики метода ПолучитьСсылку

Первое и самое важное, что мы должны уяснить: метод ПолучитьСсылку() не обращается к базе данных. Он работает «математически», просто создавая в оперативной памяти объект типа Ссылка с заданным внутренним идентификатором. Это означает, что даже если в вашей мобильной базе физически нет документа с таким GUID, метод все равно вернет ссылку. Однако эта ссылка будет битой.

Рассмотрим ситуацию: если вы попытаетесь прочитать реквизит такой ссылки, например Ссылка.Дата, мобильная платформа может вернуть пустое значение или значение по умолчанию. В обычном приложении на Windows поведение может отличаться (иногда выдается ошибка «Объект не найден»), но на мобильной платформе это часто выглядит как «пустой результат».

Для проверки того, существует ли объект в базе на самом деле, мы должны использовать метод ПолучитьОбъект(). Давайте проанализируем пример кода для проверки:


// Создаем ссылку по GUID
ТекСсылка = Документы.МойДокумент.ПолучитьСсылку(Новый УникальныйИдентификатор(МассивGUID[0]));

// Проверяем, существует ли объект в локальной базе мобильного устройства
ТекОбъект = ТекСсылка.ПолучитьОбъект();

Если ТекОбъект = Неопределено Тогда
    Сообщить("Документ в локальной базе мобильного устройства отсутствует!");
Иначе
    Сообщить("Документ найден: " + Строка(ТекОбъект));
КонецЕсли;

2. Проверка наличия данных в мобильном узле

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

  1. Правила регистрации данных: Проверьте состав плана обмена, по которому мобильное приложение получает данные. Документ может быть просто не включен в состав обмена.
  2. Фильтры по дате: Часто в мобильные приложения выгружаются документы только за определенный период (например, за текущий месяц). Если документ, который вы ищете по GUID, старше этого периода, его не будет в SQLite базе мобильного устройства.
  3. Ограничения прав доступа: Убедитесь, что у пользователя мобильного приложения есть права на чтение данного типа документов в мобильной конфигурации.

Чтобы убедиться, что документ вообще есть в телефоне, воспользуемся советом из обсуждения и попробуем найти его по номеру:


ДокСсылка = Документы.МойДокумент.НайтиПоНомеру("0001", ДатаДокумента);
Если ДокСсылка.Пустая() Тогда
    Сообщить("Документ с таким номером не найден в мобильной базе");
Иначе
    Сообщить("УИД найденного документа: " + Строка(ДокСсылка.УникальныйИдентификатор()));
КонецЕсли;

3. Проблемы с форматом строки GUID

Мобильная платформа 1С работает на базе SQLite и крайне чувствительна к чистоте входных данных. Если переменная Массив[0], из которой вы берете строку для GUID, получена через внешние источники (JSON, XML, HTTP-запрос), в ней могут содержаться невидимые символы.

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

Рекомендуется всегда обрабатывать строку перед созданием УникальногоИдентификатора:


ЧистаяСтрока = СокрЛП(Строка(Массив[0]));
// Можно также принудительно привести к нижнему или верхнему регистру
ЧистаяСтрока = НРег(ЧистаяСтрока); 
Попытка
    НовыйУИД = Новый УникальныйИдентификатор(ЧистаяСтрока);
    ТекСсылка = Документы.МойДокумент.ПолучитьСсылку(НовыйУИД);
Исключение
    Сообщить("Ошибка формата GUID: " + ЧистаяСтрока);
КонецПопытки;

4. Особенности платформы 8.3.15 и кэширование

В версии платформы 8.3.15.59, упомянутой в теме, встречались ошибки, связанные с кэшированием метаданных и индексов. Если структура конфигурации менялась, а данные обновлялись «на лету», индексы SQLite могли работать некорректно.

Разберем способы лечения таких «багов»:

5. Итоги и рекомендации

Подводя итог, если поиск по GUID не работает на мобильной платформе, придерживайтесь следующего алгоритма:

  1. Убедитесь с помощью ПолучитьОбъект(), что проблема не в пустой ссылке, а в отсутствии данных.
  2. Проверьте правила обмена — попадает ли этот конкретный документ в выгрузку для мобильного узла.
  3. Используйте СокрЛП() и явное приведение к Строке при создании УникальныйИдентификатор.
  4. Если ничего не помогает на конкретной версии 8.3.15, попробуйте обновить версию мобильной платформы, так как многие ошибки работы с SQLite были исправлены в более поздних релизах (8.3.18+).

Помните, что мобильная платформа — это не «урезанная 1С», а самостоятельная среда со своими правилами работы с памятью и хранением данных. Внимательное отношение к типам данных и чистоте строк поможет избежать большинства проблем с поиском объектов.

← На главную