Разработка и Конфигурация · 10 мин
Как удалить файлы из каталога в 1С
Как удалить файлы из каталога в 1С: методы УдалитьФайлы и НайтиФайлы, работа с маской, удаление подкаталогов, обработка ошибок и примеры кода на встроенном языке.
Задача удаления файлов из каталога возникает в 1С регулярно: очистка временных файлов после обмена данными, удаление устаревших выгрузок, чистка папок обмена с сайтом или FTP. Во встроенном языке платформы для этого предусмотрены методы УдалитьФайлы() и НайтиФайлы(), а также объект Файл для проверки существования путей. Важно понимать, где именно выполняется код — на клиенте или на сервере, — потому что от этого зависит, к какой файловой системе будет обращение.
Удаление файлов — необратимая операция: платформа 1С не перемещает файлы в корзину, они удаляются напрямую. Поэтому перед запуском массовой очистки стоит проверить путь, маску и права доступа, а для ответственных каталогов — предусмотреть протоколирование удаляемых файлов.
Метод УдалитьФайлы: удаление по пути и маске
Основной инструмент — глобальный метод УдалитьФайлы(Путь, Маска). Первый параметр задаёт каталог или конкретный файл, второй (необязательный) — маску отбора. Маска поддерживает символы * (любая последовательность символов) и ? (один произвольный символ). Если маска не указана, удаляется сам указанный файл или все файлы в каталоге.
Типовой пример удаления всех XML-файлов из каталога обмена:
УдалитьФайлы("D:\Обмен\", "*.xml");Обратите внимание: метод удаляет файлы, но не сам каталог и не вложенные подкаталоги. Если в папке есть подкаталоги, они останутся на месте вместе со своим содержимым — это частая причина «неполной» очистки. Чтобы удалить каталог целиком вместе со всем содержимым, укажите путь к нему без маски, но убедитесь, что путь заведомо верный.
Если файл не существует или занят другим процессом, платформа вызывает исключение. Поэтому в промышленном коде вызов оборачивают в конструкцию Попытка ... Исключение ... КонецПопытки с записью ошибки в журнал регистрации.
Выборочное удаление через НайтиФайлы
Когда нужно удалить не всё подряд, а только файлы, удовлетворяющие условию (по дате изменения, размеру, части имени), сначала получают массив файлов методом НайтиФайлы(Путь, Маска, ИскатьВПодкаталогах). Третий параметр — булево: при значении Истина поиск идёт рекурсивно по всем вложенным папкам.
Пример: удаление файлов выгрузки старше определённой даты.
МассивФайлов = НайтиФайлы("D:\Обмен\", "<em>.xml", Истина);
Граница = ТекущаяДатаСеанса() - 30 </em> 86400;
Для Каждого Файл Из МассивФайлов Цикл
Если НЕ Файл.ЭтоКаталог() И Файл.ПолучитьВремяИзменения() < Граница Тогда
УдалитьФайлы(Файл.ПолноеИмя);
КонецЕсли;
КонецЦикла;Объект Файл даёт полезные свойства для отбора: ПолноеИмя, Имя, Расширение, Размер(), ПолучитьВремяИзменения(), ЭтоКаталог(). Комбинируя их, можно строить гибкие правила очистки — например, удалять только пустые файлы или только файлы с определённым префиксом.
Такой подход удобен ещё и тем, что перед удалением можно записать имя каждого файла в журнал регистрации или вывести пользователю список для подтверждения. Это заметно снижает риск случайной потери данных.
Проверка существования каталога и файлов перед удалением
Перед любыми операциями с файловой системой полезно убедиться, что путь существует и это именно каталог, а не файл. Для этого создаётся объект Файл и вызывается метод Существует().
Каталог = Новый Файл("D:\Обмен\");
Если Каталог.Существует() И Каталог.ЭтоКаталог() Тогда
УдалитьФайлы("D:\Обмен\", "*.tmp");
КонецЕсли;Дополнительная защита — проверка, что путь не пустой и не указывает на корень диска или системный каталог. Одна опечатка в переменной пути может привести к попытке удалить файлы не из рабочей папки обмена, а из критичного расположения. В регламентных заданиях, где путь берётся из настроек или констант, такая проверка обязательна.
Клиент и сервер: где выполняется удаление
В управляемом приложении код с директивой &НаСервере работает с файловой системой сервера 1С, а код &НаКлиенте — с дисками компьютера пользователя. Это принципиально: путь D:\Обмен на сервере и на клиенте — разные папки. Перед написанием процедуры определите, где физически лежат файлы.
Дополнительные ограничения на клиенте:
- в тонком и веб-клиенте работа с файловой системой требует расширения работы с файлами;
- в веб-клиенте действуют ограничения браузера, и прямой доступ к произвольным каталогам может быть недоступен;
- методы работы с файлами на клиенте часто требуют асинхронных аналогов (
НачатьУдалениеФайловс описанием оповещения).
На сервере критичны права учётной записи, под которой работает агент сервера 1С (обычно USR1CV8). Если у этой учётной записи нет прав на запись в каталог, удаление завершится ошибкой, даже если администратор вручную удаляет те же файлы без проблем.
Обработка ошибок и занятых файлов
Самая частая причина сбоя удаления — файл открыт другим процессом: антивирусом, службой обмена, другим сеансом 1С или проводником Windows. Второе место занимают недостаточные права доступа. Оба случая приводят к исключению, и без обработки регламентное задание завершится с ошибкой.
Рекомендуемый шаблон обработки:
Попытка
УдалитьФайлы(ПолноеИмя);
Исключение
ЗаписьЖурналаРегистрации("Очистка каталога",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось удалить " + ПолноеИмя + ": " + ОписаниеОшибки());
КонецПопытки;Если файл систематически занят, имеет смысл не удалять его, а пропускать и повторять попытку при следующем запуске регламентного задания. Файлы, заблокированные длительно, — повод проверить, не «зависла» ли обработка, которая их создала, и не держит ли путь открытым сторонний процесс.
- 1Определите, где лежат файлы — на сервере или на клиенте
- 2Проверьте существование каталога через объект Файл
- 3Получите список файлов через НайтиФайлы с нужной маской
- 4Отберите файлы по условиям (дата, размер, имя)
- 5Удаляйте в цикле с обработкой исключений и записью в журнал
- 6Проверьте результат: каталог очищен, ошибок в журнале нет
Удаление каталога целиком и подкаталогов
Чтобы удалить папку со всем содержимым, включая вложенные каталоги, передайте в УдалитьФайлы путь к самой папке без маски. Платформа удалит каталог рекурсивно. Это удобно для очистки временных рабочих папок, которые обработка создаёт перед обменом и удаляет после.
Для временных файлов есть более безопасный путь — использовать каталог временных файлов, который предоставляет сама платформа: КаталогВременныхФайлов() и ПолучитьИмяВременногоФайла(). Такие файлы не засоряют рабочие каталоги, и их очистка не несёт риска для данных обмена.
Проверка результата и типичные ошибки
После очистки полезно убедиться, что результат соответствует ожиданию. Простейший способ — повторно вызвать НайтиФайлы с той же маской и проверить, что массив пуст. Если файлы остались, смотрите журнал регистрации: там будут записи о пропущенных из-за блокировки или прав элементах.
Ещё один контроль — сравнение количества найденных и успешно удалённых файлов. Счётчик удалений в цикле позволяет вывести в протокол строку вида «Найдено: 120, удалено: 118, пропущено: 2» и сразу увидеть расхождение.
Как проверить результат
Массив пуст — каталог очищен
Файлы остались — смотрите журнал ошибок
Нет ошибок удаления или только ожидаемые пропуски занятых файлов
Массовые ошибки доступа — проблема с правами учётной записи
Значения совпадают
Расхождение — часть файлов заблокирована или недоступна
FAQ
Можно ли восстановить файлы после УдалитьФайлы в 1С?
Нет, метод удаляет файлы напрямую, минуя корзину. Восстановление возможно только средствами резервного копирования или специальными утилитами восстановления данных, и гарантии нет. Поэтому для важных каталогов перед очисткой делают архивную копию.
Как удалить только вложенные файлы, оставив сам каталог?
Используйте УдалитьФайлы с путём к каталогу и маской, например УдалитьФайлы("D:\Обмен\", "."). Файлы в папке будут удалены, сам каталог останется. Вложенные подкаталоги при этом также сохранятся — их при необходимости удаляют отдельно.
Почему УдалитьФайлы выдаёт ошибку «Файл занят другим процессом»?
Файл открыт другой программой или сеансом: антивирусом, службой обмена, другим пользователем 1С. Обработайте исключение, пропустите файл и повторите попытку позже. Если блокировка постоянная — найдите процесс, который держит файл, например через монитор ресурсов Windows.
Как удалять файлы в регламентном задании без вмешательства пользователя?
Создайте регламентное задание, выполняемое на сервере, с процедурой очистки: проверка пути, НайтиФайлы, цикл удаления с обработкой исключений и записью в журнал регистрации. Убедитесь, что у учётной записи агента сервера есть права на каталог.
Можно ли удалять файлы на клиенте в веб-клиенте?
Только через расширение работы с файлами и асинхронные методы вида НачатьУдалениеФайлов. Произвольный доступ к диску пользователя из браузера ограничен, поэтому серверная очистка предпочтительнее, если файлы можно разместить на сервере.
Как удалить файлы старше определённого количества дней?
Получите список через НайтиФайлы, в цикле сравнивайте ПолучитьВремяИзменения() с граничной датой (ТекущаяДатаСеанса минус нужное число секунд) и удаляйте только подходящие файлы. Такой подход безопаснее полной очистки каталога.
Что важно запомнить
Быстрое удаление — УдалитьФайлы с маской, управляемое — НайтиФайлы с отбором в цикле. Всегда проверяйте путь, учитывайте контекст клиент/сервер, обрабатывайте исключения и записывайте удалённые файлы в журнал: операция необратима.