Как очистить память и удалить ненужные файлы в мобильном приложении 1С

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

При разработке мобильных приложений на платформе 1С:Предприятие одной из самых острых проблем становится быстрое переполнение внутренней памяти устройства. Это происходит из-за того, что изображения товаров, файлы документов и другие медиаданные при обычном обмене сохраняются непосредственно в базу данных мобильного приложения (SQLite) или во внутреннее хранилище. Со временем объем данных растет, что приводит к замедлению работы интерфейса и нехватке места. Разберем подробно, как эффективно управлять файлами, удалять ненужные справочники и оптимизировать хранение картинок.

Программное удаление файлов с мобильного устройства

Рассмотрим ситуацию, когда изображения хранятся не в самой базе данных мобильного приложения в виде двоичных данных, а в виде отдельных файлов во внутренней директории приложения. Это более правильный архитектурный подход, так как база .1cdt остается легкой. Однако при удалении номенклатуры в центральной базе файлы на мобильном устройстве могут остаться "сиротами".

Для решения этой задачи проанализируем возможности метода УдалитьФайлы(). На мобильной платформе мы можем программно обращаться к файловой системе. Выясним, как составить алгоритм очистки:

  1. При получении данных об удалении объекта (например, через веб-сервис или план обмена) необходимо получить путь к связанному файлу.
  2. Проверить существование файла с помощью метода Файл.Существует().
  3. Вызвать процедуру удаления.

Пример реализации логики удаления:


// Определяем путь к каталогу документов приложения
ПутьКФайлу = ДокументыПанели.ПутьККартинке; 
ФайлНаДиске = Новый Файл(ПутьКФайлу);

Если ФайлНаДиске.Существует() Тогда
    Попытка
        УдалитьФайлы(ПутьКФайлу);
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка удаления файла", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

Использование временного хранилища для отображения картинок без сохранения

Если наша цель — показывать картинку пользователю, но при этом не "засорять" постоянную память мобильного устройства, разберем метод работы через Временное хранилище. Этот способ позволяет подгружать данные из центральной базы в момент открытия формы и автоматически очищать их при закрытии сеанса.

Посмотрим на пример кода, который запрашивает двоичные данные картинки по требованию:


// В обработчике при чтении на сервере или при открытии формы
// Запрашиваем данные через веб-сервис из центральной базы
ДвоичныеДанныеКартинки = ВебСервисы.ОбменДанными.ПолучитьФайл(ИдентификаторНоменклатуры);

Если ДвоичныеДанныеКартинки <> Неопределено Тогда
    // Помещаем данные во временное хранилище текущей формы
    АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
    // Привязываем адрес к реквизиту формы, который отображается в "Поле картинки"
    Объект.ПутьКФото = АдресКартинки;
КонецЕсли;

Важно понимать, что при таком подходе данные не записываются в справочник мобильной базы. Как только форма будет закрыта или сеанс завершен, 1С сама очистит временное хранилище. Это идеальный вариант для работы в режиме "онлайн".

Каскадное удаление через подписки на события

Проанализируем ситуацию, когда удаление номенклатуры в мобильной базе не влечет за собой удаление картинки, так как файлы хранятся в отдельном справочнике (например, ПрисоединенныеФайлы). Чтобы избежать накопления ненужных данных, внедрим механизм Подписки на события.

Настроим подписку на событие ПередУдалением для справочника Номенклатура. В обработчике подписки пропишем поиск всех связанных элементов в справочнике файлов. Рассмотрим пример логики:


Процедура ПередУдалениемНоменклатуры(Источник, Отказ) Экспорт
    // Источник - это удаляемая ссылка на Номенклатуру
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Файлы.Ссылка КАК Ссылка
        |ИЗ
        |   Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы
        |ГДЕ
        |   Файлы.ВладелецФайла = &Владелец";
    
    Запрос.УстановитьПараметр("Владелец", Источник.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ОбъектФайл = Выборка.Ссылка.ПолучитьОбъект();
        // При удалении объекта сработает стандартный механизм, 
        // который также должен удалить физический файл, если это прописано в логике
        ОбъектФайл.Удалить(); 
    КонецЦикла;
КонецПроцедуры

Оптимизация изображений на стороне сервера (Resize)

Часто мобильное приложение тормозит не из-за количества картинок, а из-за их физического размера. Если камера современного смартфона делает фото весом в 5-10 Мб, передавать и хранить такие данные в мобильной 1С — критическая ошибка. Разберем, как подготовить данные перед отправкой.

Перед тем как веб-сервис передаст двоичные данные на мобильное устройство, выполним программное сжатие в центральной базе. Мы можем использовать встроенные средства платформы для работы с изображениями:

  1. Проанализируем разрешение исходного фото.
  2. Если оно превышает, например, 1024x768, применим метод ОбработкаКартинок (если используется БСП) или внешние компоненты.
  3. Снизим качество JPEG до 70-80%, что визуально незаметно на экране телефона, но уменьшает объем файла в 10 раз.

Технология «ленивой загрузки» (Lazy Loading) через HTTP-сервисы

Современным стандартом является использование HTTP-сервисов вместо SOAP. Выясним преимущества этого метода для мобильной платформы. В реквизите номенклатуры мы храним не саму картинку, а просто текстовую ссылку (URL) на нее.

В мобильном приложении в элементе формы Поле картинки можно указать этот URL. Платформа 1С самостоятельно скачает изображение для отображения. При этом мы можем управлять кэшированием:

Использование внешних облачных хранилищ

Рассмотрим вариант интеграции с внешними сервисами, такими как Яндекс.Диск или S3-совместимые хранилища. Это позволяет полностью вынести хранение тяжелых файлов за пределы инфраструктуры 1С.

Алгоритм работы следующий: 1. При загрузке фото с мобильного устройства оно отправляется прямым HTTP-запросом в облако. 2. В базе 1С сохраняется только ссылка на файл. 3. При необходимости просмотра мобильное приложение получает временную ссылку для доступа к файлу и отображает его.

Это исключает нагрузку на веб-сервисы 1С и позволяет избежать проблем с местом на диске сервера базы данных и на самом мобильном устройстве, так как облачные клиенты умеют эффективно управлять локальным пространством.

Механизм очистки в планах обмена

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

В узле обмена для мобильного устройства должна быть включена регистрация изменений для справочников файлов. Если вы просто удаляете номенклатуру, а файл остается в системе (пусть и без владельца), он никогда не будет удален с мобильного устройства. Обязательно реализуйте каскадное удаление на стороне центральной базы, чтобы "удаление" файла также попало в пакет обмена для мобильного клиента.

Выясним причину, по которой данные могут оставаться: если объект помечен на удаление, но не удален физически, в мобильное приложение придет только признак ПометкаУдаления = Истина. Чтобы реально освободить место, необходимо либо физически удалять объекты, либо настроить логику мобильного приложения так, чтобы при получении пометки удаления оно программно вызывало УдалитьФайлы() для связанных ресурсов.

← На главную