При работе с распределенными базами данных и мобильными приложениями 1С администраторы и разработчики иногда сталкиваются с аварийными ситуациями. Представим сценарий: в результате вирусной атаки или технического сбоя центральная база данных была восстановлена из резервной копии недельной давности. Бухгалтеры и операторы вручную перепровели документы в основной базе за утерянный период, однако часть документов, созданных на мобильных устройствах (например, в мобильном приложении для официантов, курьеров или торговых представителей) за период сбоя, не перенеслись в центральную базу.
На стороне мобильного приложения эти документы уже отмечены как отправленные, их повторная автоматическая выгрузка не происходит, а повторное проведение документов на планшете заблокировано из-за статуса «Только для чтения». Разработчик приложения недоступен, а рутировать рабочее устройство крайне нежелательно из-за риска потери данных.
В этой статье мы подробно разберем, как решить эту проблему несколькими профессиональными способами: от выполнения кода на мобильном устройстве через стандартный механизм отладки до извлечения базы данных без прав суперпользователя (Root).
Для того чтобы мобильное приложение снова «захотело» отправить документы в центральную базу, нам необходимо зарегистрировать изменения этих документов на соответствующем узле плана обмена. В платформе 1С для этого используется метод ПланыОбмена.ЗарегистрироватьИзменения().
Посмотрим на пример кода, который решает эту задачу. Нам необходимо отобрать документы определенного типа за нужный период (например, с 1 по 5 октября) и зарегистрировать их для узла обмена, отвечающего за связь с центральным сервером.
// Определяем узел обмена, соответствующий центральной базе (например, "Офис")
УзелОфис = ПланыОбмена.ПланОбменаМобильногоПриложения.НайтиПоКоду("Офис");
Если Не УзелОфис.Пустая() Тогда
// Создаем запрос для выборки документов за аварийный период
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка ИЗ Документ.РасходнаяНакладная
|ГДЕ
| Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня('20231001'));
Запрос.УстановитьПараметр("КонецПериода", КонецДня('20231005'));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Регистрируем изменения каждого документа для передачи на сервер
ПланыОбмена.ЗарегистрироватьИзменения(УзелОфис, Выборка.Ссылка);
КонецЦикла;
Сообщить("Регистрация изменений успешно выполнена!");КонецЕсли;
Этот код должен быть выполнен непосредственно в контексте мобильного приложения на планшете. Но как это сделать, если конфигурация закрыта для изменения, а у нас на руках только скомпилированное приложение на рабочем устройстве?
Выполнить произвольный код на мобильном устройстве без изменения конфигурации и сборки нового пакета можно с помощью штатного механизма отладки платформы 1С. Разберем этот процесс по шагам:
ПриОткрытии формы списка любого справочника или документа. Поставьте точку останова (клавиша F9) на первой строке этой процедуры.Если настроить отладку не удается или требуется провести комплексный анализ данных мобильного приложения на компьютере, мы можем извлечь файл базы данных 1Cv8.1CD с Android-устройства. Многие считают, что для доступа к системным папкам приложений обязательно требуются Root-права, однако обойти это ограничение можно с помощью утилиты командной строки ADB (Android Debug Bridge).
Проанализируем пошагово, как скопировать базу данных на ПК и вернуть её обратно:
adb devices
В списке должно отобразиться ваше подключенное устройство.
adb backup -f backup.ab -noapk com.e1c.mobile
Обратите внимание: вместо com.e1c.mobile укажите точное имя пакета вашего мобильного приложения 1С. Если это стандартная мобильная платформа, имя пакета обычно совпадает со стандартным. Если это собранный дистрибутив приложения, имя пакета можно посмотреть в свойствах приложения на планшете.
backup.ab.android-backup-extractor (abe.jar), которая преобразует формат .ab в привычный архив .tar:
java -jar abe.jar unpack backup.ab backup.tar
backup.tar любым архиватором (например, 7-Zip).apps/[Имя_Пакета]/f/. Именно там будет находиться стандартный файл базы данных 1С — 1Cv8.1CD.1Cv8.1CD в каталоге распакованного архива, запакуйте всё обратно в .tar, конвертируйте в .ab и выполните восстановление на планшете с помощью команды:
adb restore backup.ab
Если документы на планшете заблокированы для изменения и проведения, это может происходить по двум причинам: сработал запрет редактирования проведенных документов в интерфейсе мобильного клиента или документы зафиксированы в статусе отправленных. Рассмотрим способы снятия этой блокировки:
Вариант А (Интерфейсный): Попробуйте выделить необходимые документы в списке на планшете, вызвать контекстное меню длительным нажатием (или нажать кнопку «Еще») и выбрать команду «Отменить проведение». В состоянии «Не проведен» документы станут доступны для редактирования и последующего перепроведения, что автоматически зарегистрирует их в плане обмена.
Вариант Б (Через отладку): Если интерфейс не позволяет отменить проведение, мы можем программно перевести документы в режим отмены проведения через окно отладки на ПК (как описано в Методе 2), выполнив следующий код:
Выборка = Документы.РасходнаяНакладная.Выбрать(НачалоДня('20231001'), КонецДня('20231005'));
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
// Снимаем проведение для открытия доступа к редактированию
Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЦикла;
Выясним причину, почему после восстановления центральной базы из резервной копии обмен может блокироваться даже при наличии новых данных на планшете. При восстановлении бэкапа в центральной базе откатились назад счетчики номеров отправленных и принятых сообщений обмена в плане обмена.
Если планшет отправил пакет данных под номером 150, а восстановленная база ожидает пакет с номером 140, то сервер отвергнет пакет из-за несовпадения номеров сообщений. Аналогично, планшет проигнорирует пакеты от сервера, если посчитает их устаревшими.
Решение проблемы на стороне сервера: Нам не нужно трогать планшет. Достаточно скорректировать номера сообщений в плане обмена в центральной базе данных:
Как только номера сообщений на стороне сервера совпадут с ожидаемыми на мобильном устройстве, первый же сеанс обмена пройдет успешно, и планшет автоматически выгрузит все документы за пропущенный период.