При разработке мобильных приложений на платформе 1С:Предприятие одной из самых острых проблем становится быстрое переполнение внутренней памяти устройства. Это происходит из-за того, что изображения товаров, файлы документов и другие медиаданные при обычном обмене сохраняются непосредственно в базу данных мобильного приложения (SQLite) или во внутреннее хранилище. Со временем объем данных растет, что приводит к замедлению работы интерфейса и нехватке места. Разберем подробно, как эффективно управлять файлами, удалять ненужные справочники и оптимизировать хранение картинок.
Рассмотрим ситуацию, когда изображения хранятся не в самой базе данных мобильного приложения в виде двоичных данных, а в виде отдельных файлов во внутренней директории приложения. Это более правильный архитектурный подход, так как база .1cdt остается легкой. Однако при удалении номенклатуры в центральной базе файлы на мобильном устройстве могут остаться "сиротами".
Для решения этой задачи проанализируем возможности метода УдалитьФайлы(). На мобильной платформе мы можем программно обращаться к файловой системе. Выясним, как составить алгоритм очистки:
Файл.Существует().Пример реализации логики удаления:
// Определяем путь к каталогу документов приложения
ПутьКФайлу = ДокументыПанели.ПутьККартинке;
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
Попытка
УдалитьФайлы(ПутьКФайлу);
Исключение
ЗаписьЖурналаРегистрации("Ошибка удаления файла", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если наша цель — показывать картинку пользователю, но при этом не "засорять" постоянную память мобильного устройства, разберем метод работы через Временное хранилище. Этот способ позволяет подгружать данные из центральной базы в момент открытия формы и автоматически очищать их при закрытии сеанса.
Посмотрим на пример кода, который запрашивает двоичные данные картинки по требованию:
// В обработчике при чтении на сервере или при открытии формы
// Запрашиваем данные через веб-сервис из центральной базы
ДвоичныеДанныеКартинки = ВебСервисы.ОбменДанными.ПолучитьФайл(ИдентификаторНоменклатуры);
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
// Помещаем данные во временное хранилище текущей формы
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
// Привязываем адрес к реквизиту формы, который отображается в "Поле картинки"
Объект.ПутьКФото = АдресКартинки;
КонецЕсли;
Важно понимать, что при таком подходе данные не записываются в справочник мобильной базы. Как только форма будет закрыта или сеанс завершен, 1С сама очистит временное хранилище. Это идеальный вариант для работы в режиме "онлайн".
Проанализируем ситуацию, когда удаление номенклатуры в мобильной базе не влечет за собой удаление картинки, так как файлы хранятся в отдельном справочнике (например, ПрисоединенныеФайлы). Чтобы избежать накопления ненужных данных, внедрим механизм Подписки на события.
Настроим подписку на событие ПередУдалением для справочника Номенклатура. В обработчике подписки пропишем поиск всех связанных элементов в справочнике файлов. Рассмотрим пример логики:
Процедура ПередУдалениемНоменклатуры(Источник, Отказ) Экспорт
// Источник - это удаляемая ссылка на Номенклатуру
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Файлы.Ссылка КАК Ссылка
|ИЗ
| Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы
|ГДЕ
| Файлы.ВладелецФайла = &Владелец";
Запрос.УстановитьПараметр("Владелец", Источник.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектФайл = Выборка.Ссылка.ПолучитьОбъект();
// При удалении объекта сработает стандартный механизм,
// который также должен удалить физический файл, если это прописано в логике
ОбъектФайл.Удалить();
КонецЦикла;
КонецПроцедуры
Часто мобильное приложение тормозит не из-за количества картинок, а из-за их физического размера. Если камера современного смартфона делает фото весом в 5-10 Мб, передавать и хранить такие данные в мобильной 1С — критическая ошибка. Разберем, как подготовить данные перед отправкой.
Перед тем как веб-сервис передаст двоичные данные на мобильное устройство, выполним программное сжатие в центральной базе. Мы можем использовать встроенные средства платформы для работы с изображениями:
ОбработкаКартинок (если используется БСП) или внешние компоненты.Современным стандартом является использование HTTP-сервисов вместо SOAP. Выясним преимущества этого метода для мобильной платформы. В реквизите номенклатуры мы храним не саму картинку, а просто текстовую ссылку (URL) на нее.
В мобильном приложении в элементе формы Поле картинки можно указать этот URL. Платформа 1С самостоятельно скачает изображение для отображения. При этом мы можем управлять кэшированием:
Рассмотрим вариант интеграции с внешними сервисами, такими как Яндекс.Диск или S3-совместимые хранилища. Это позволяет полностью вынести хранение тяжелых файлов за пределы инфраструктуры 1С.
Алгоритм работы следующий: 1. При загрузке фото с мобильного устройства оно отправляется прямым HTTP-запросом в облако. 2. В базе 1С сохраняется только ссылка на файл. 3. При необходимости просмотра мобильное приложение получает временную ссылку для доступа к файлу и отображает его.
Это исключает нагрузку на веб-сервисы 1С и позволяет избежать проблем с местом на диске сервера базы данных и на самом мобильном устройстве, так как облачные клиенты умеют эффективно управлять локальным пространством.
Если ваше приложение работает через стандартные планы обмена, важно убедиться, что удаление объектов корректно регистрируется. Проанализируем настройки:
В узле обмена для мобильного устройства должна быть включена регистрация изменений для справочников файлов. Если вы просто удаляете номенклатуру, а файл остается в системе (пусть и без владельца), он никогда не будет удален с мобильного устройства. Обязательно реализуйте каскадное удаление на стороне центральной базы, чтобы "удаление" файла также попало в пакет обмена для мобильного клиента.
Выясним причину, по которой данные могут оставаться: если объект помечен на удаление, но не удален физически, в мобильное приложение придет только признак ПометкаУдаления = Истина. Чтобы реально освободить место, необходимо либо физически удалять объекты, либо настроить логику мобильного приложения так, чтобы при получении пометки удаления оно программно вызывало УдалитьФайлы() для связанных ресурсов.