Как правильно очищать временные файлы, созданные во время сеанса 1С?

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

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

Стандартный механизм платформы: функция ПолучитьИмяВременногоФайла

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

  1. Если при вызове функции не указывать расширение, платформа генерирует уникальное имя с расширением .tmp и префиксом v8_.
  2. Согласно документации (Синтаксис-Помощник), если такой файл не был удален программно с помощью УдалитьФайлы(), платформа предпримет попытку удалить его автоматически при следующем запуске клиентского приложения.
  3. Важный нюанс: автоматическое удаление гарантированно работает только для файлов, чьи имена соответствуют внутренним алгоритмам генерации платформы.

Важное ограничение: если файл занят другим процессом (например, открыт в текстовом редакторе или Word), 1С не сможет его удалить «на лету». Файл останется в папке до тех пор, пока внешнее приложение не освободит его, и не произойдет новый запуск 1С.

Использование механизмов БСП (Библиотеки стандартных подсистем)

Если ваша конфигурация построена на базе БСП, мы рекомендуем отказаться от велосипедов и использовать проверенные методы модуля ФайловаяСистемаКлиент. Разберем основные преимущества этого подхода:

В БСП существует метод УдалитьВременныйФайл(), который работает гораздо «умнее» стандартной команды удаления. Он позволяет:

Также рассмотрим метод ФайловаяСистемаКлиент.ОткрытьФайл(). Он не просто открывает документ во внешнем приложении, но и в ряде реализаций позволяет отследить момент закрытия этого приложения, чтобы сразу после этого предложить или автоматически выполнить очистку временного объекта.

Стратегия очистки через параметры сеанса

Иногда требуется более строгий контроль, особенно если файлы имеют большой объем (сотни мегабайт). Рассмотрим алгоритм, предложенный в обсуждении:

  1. Создадим Параметр сеанса с типом ФиксированныйМассив или используем временную переменную в модуле управляемого приложения.
  2. При каждом создании временного файла будем добавлять полный путь к нему в этот массив.
  3. В процедуре ПриЗавершенииРаботыСистемы (в модуле управляемого приложения) проанализируем накопленный список и попытаемся удалить файлы.

Пример реализации добавления пути:


// На стороне клиента
ПутьКФайлу = ПолучитьИмяВременногоФайла("txt");
ДанныеФайла.Записать(ПутьКФайлу);

// Добавляем в массив для последующей очистки
МассивФайловДляУдаления.Добавить(ПутьКФайлу);

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

Очистка при старте системы: наиболее надежный метод

Для обеспечения максимальной чистоты системы разберем метод «очистки при старте». Это позволяет удалить файлы, оставшиеся от предыдущих аварийно завершенных сеансов.

Алгоритм действий следующий:

  1. В процедуре ПриНачалеРаботыСистемы вызываем процедуру фоновой очистки.
  2. Программа сканирует каталог временных файлов. Чтобы не удалить лишнего (файлы других активных пользователей), рекомендуется добавлять в имена ваших файлов уникальный идентификатор (УИД) текущего пользователя или сеанса.
  3. Удаляем только те файлы, дата изменения которых меньше текущей даты (например, старше 24 часов).

Посмотрим на пример кода для удаления по маске:


Процедура ОчиститьСтарыеВременныеФайлы() Экспорт
    КаталогВременныхФайлов = КаталогВременныхФайлов();
    Маска = "v8_*.tmp"; // Или ваша специфическая маска
    НайденныеФайлы = НайтиФайлы(КаталогВременныхФайлов, Маска);
    
    Для Каждого ТекущийФайл Из НайденныеФайлы Цикл
        // Проверяем, что файл создан более суток назад
        Если ТекущийФайл.ПолучитьВремяИзменения() < ТекущаяДата() - 86400 Тогда
            Попытка
                УдалитьФайлы(ТекущийФайл.ПолноеИмя);
            Исключение
                // Файл может быть заблокирован, просто идем дальше
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Особенности работы в облачных сервисах (1С:Фреш)

Проанализируем ситуацию при работе в модели сервиса. В «облаках» (например, 1С:Fresh) действуют строгие политики безопасности. Использование функции ПолучитьИмяВременногоФайла() разрешено, однако разработчик обязан самостоятельно заботиться об очистке. Оставлять файлы на произвол платформы считается плохим тоном и может привести к замечаниям при прохождении аудита конфигурации.

Работа в веб-клиенте

Нужно учитывать, что в веб-клиенте работа с файловой системой ограничена «песочницей» браузера. Прямое использование НайтиФайлы или УдалитьФайлы по произвольным путям без расширения работы с файлами будет невозможно. В этом случае мы должны полагаться на механизмы платформы или методы БСП, которые абстрагируют работу с клиентом (Тонкий клиент vs Веб-клиент).

Резюме

Для эффективного управления временными файлами в 1С:

← На главную