При разработке в среде 1С:Предприятие часто возникает необходимость создания временных файлов на стороне клиента. Это могут быть печатные формы в формате PDF, выгрузки в Excel или текстовые файлы, полученные из временного хранилища сервера. Однако бесконтрольное накопление таких файлов в системных каталогах (%TEMP%) со временем может привести к нехватке свободного места на диске и замедлению работы системы. Рассмотрим подробно, как организовать эффективную очистку временных данных.
Прежде всего, разберем наиболее простой и встроенный метод работы. Платформа 1С предоставляет функцию ПолучитьИмяВременногоФайла(). Проанализируем особенности её работы:
.tmp и префиксом v8_.УдалитьФайлы(), платформа предпримет попытку удалить его автоматически при следующем запуске клиентского приложения.Важное ограничение: если файл занят другим процессом (например, открыт в текстовом редакторе или Word), 1С не сможет его удалить «на лету». Файл останется в папке до тех пор, пока внешнее приложение не освободит его, и не произойдет новый запуск 1С.
Если ваша конфигурация построена на базе БСП, мы рекомендуем отказаться от велосипедов и использовать проверенные методы модуля ФайловаяСистемаКлиент. Разберем основные преимущества этого подхода:
В БСП существует метод УдалитьВременныйФайл(), который работает гораздо «умнее» стандартной команды удаления. Он позволяет:
Также рассмотрим метод ФайловаяСистемаКлиент.ОткрытьФайл(). Он не просто открывает документ во внешнем приложении, но и в ряде реализаций позволяет отследить момент закрытия этого приложения, чтобы сразу после этого предложить или автоматически выполнить очистку временного объекта.
Иногда требуется более строгий контроль, особенно если файлы имеют большой объем (сотни мегабайт). Рассмотрим алгоритм, предложенный в обсуждении:
ФиксированныйМассив или используем временную переменную в модуле управляемого приложения.ПриЗавершенииРаботыСистемы (в модуле управляемого приложения) проанализируем накопленный список и попытаемся удалить файлы.Пример реализации добавления пути:
// На стороне клиента
ПутьКФайлу = ПолучитьИмяВременногоФайла("txt");
ДанныеФайла.Записать(ПутьКФайлу);
// Добавляем в массив для последующей очистки
МассивФайловДляУдаления.Добавить(ПутьКФайлу);
Однако выясним причину, почему этот метод не является идеальным: если сеанс пользователя завершится аварийно (например, «вылет» платформы, отключение электроэнергии или завершение процесса через диспетчер задач), код в ПриЗавершенииРаботыСистемы не выполнится, и файлы останутся «мусором» на диске.
Для обеспечения максимальной чистоты системы разберем метод «очистки при старте». Это позволяет удалить файлы, оставшиеся от предыдущих аварийно завершенных сеансов.
Алгоритм действий следующий:
ПриНачалеРаботыСистемы вызываем процедуру фоновой очистки.Посмотрим на пример кода для удаления по маске:
Процедура ОчиститьСтарыеВременныеФайлы() Экспорт
КаталогВременныхФайлов = КаталогВременныхФайлов();
Маска = "v8_*.tmp"; // Или ваша специфическая маска
НайденныеФайлы = НайтиФайлы(КаталогВременныхФайлов, Маска);
Для Каждого ТекущийФайл Из НайденныеФайлы Цикл
// Проверяем, что файл создан более суток назад
Если ТекущийФайл.ПолучитьВремяИзменения() < ТекущаяДата() - 86400 Тогда
Попытка
УдалитьФайлы(ТекущийФайл.ПолноеИмя);
Исключение
// Файл может быть заблокирован, просто идем дальше
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию при работе в модели сервиса. В «облаках» (например, 1С:Fresh) действуют строгие политики безопасности. Использование функции ПолучитьИмяВременногоФайла() разрешено, однако разработчик обязан самостоятельно заботиться об очистке. Оставлять файлы на произвол платформы считается плохим тоном и может привести к замечаниям при прохождении аудита конфигурации.
Нужно учитывать, что в веб-клиенте работа с файловой системой ограничена «песочницей» браузера. Прямое использование НайтиФайлы или УдалитьФайлы по произвольным путям без расширения работы с файлами будет невозможно. В этом случае мы должны полагаться на механизмы платформы или методы БСП, которые абстрагируют работу с клиентом (Тонкий клиент vs Веб-клиент).
Для эффективного управления временными файлами в 1С:
ПолучитьИмяВременногоФайла() для генерации путей.ФайловаяСистемаКлиент.ПриЗавершенииРаботыСистемы.ПриНачалеРаботыСистемы.