Разработка и Конфигурация · 7 мин
Как удалить файл программно в 1С
Как удалить файл в 1С программно: метод УдалитьФайлы, работа с масками, проверка существования, обработка ошибок и права доступа. Примеры кода для 8.3.
Удаление файлов из кода 1С — типовая задача при обмене данными, очистке временных каталогов, ротации архивов выгрузок и обслуживании файловых хранилищ. Во встроенном языке для этого предусмотрен метод УдалитьФайлы(), который работает как на клиенте, так и на сервере, но с важными различиями в контексте файловой системы.
Главный подводный камень — понимание того, на чьей стороне выполняется код. Серверный вызов удаляет файл на сервере 1С под учётной записью агента, клиентский — на машине пользователя. Ошибка в выборе контекста приводит либо к «тихому» отсутствию результата, либо к удалению не того файла.
Ниже разобраны синтаксис метода, удаление по маске, проверка существования файла, обработка ошибок, безопасные сценарии и типичные ошибки разработчиков.
Метод УдалитьФайлы: синтаксис и поведение
Метод УдалитьФайлы() имеет два варианта вызова. Первый — с одним параметром, полным путём к конкретному файлу: УдалитьФайлы("C:\Temp\export.xml"). Второй — с двумя параметрами: путь к каталогу и маска поиска, например УдалитьФайлы("C:\Temp\", "*.tmp") удалит все временные файлы в каталоге.
Метод не возвращает значения. Если файл не найден, исключения не возникает — операция просто ничего не делает. Это удобно для массовой очистки, но опасно при логировании: без дополнительной проверки нельзя понять, был ли файл удалён реально.
Если файл заблокирован другим процессом (открыт в Excel, занят антивирусом, используется сеансом 1С), будет вызвано исключение. Поэтому вызов практически всегда следует оборачивать в конструкцию Попытка...Исключение.
Попытка
УдалитьФайлы("D:\Exchange\output.xml");
Исключение
ЗаписьЖурналаРегистрации("Удаление файла", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;Проверка существования файла перед удалением
Хотя УдалитьФайлы() не падает при отсутствии файла, явная проверка нужна для корректной логики обработки: например, чтобы отличить «файл удалён» от «файла не было». Стандартный способ — метод НайтиФайлы(), который возвращает массив найденных файлов.
Альтернатива — объект Файл с методом Существует(). Оба подхода равнозначны; НайтиФайлы удобнее, когда дальше нужны свойства файла (размер, дата изменения), а объект Файл — когда проверяется один конкретный путь.
ФайлНаДиске = Новый Файл("D:\Exchange\output.xml");
Если ФайлНаДиске.Существует() Тогда
УдалитьФайлы(ФайлНаДиске.ПолноеИмя);
КонецЕсли;
Удаление по маске и очистка каталогов
Маски поддерживают символы (любая последовательность) и ? (один символ). Типовой сценарий — очистка каталога обмена от устаревших файлов выгрузки: УдалитьФайлы(КаталогОбмена, ".xml"). Учтите, что маска действует только на указанный каталог, без рекурсивного обхода вложенных папок.
Для селективной очистки по дате (например, удалять файлы старше 7 дней) маски недостаточно — нужен перебор через НайтиФайлы с проверкой свойства ПолучитьВремяИзменения() у каждого элемента и удалением отобранных файлов по одному.
- 1Получите массив файлов: НайтиФайлы(Каталог, "<em>.</em>")
- 2В цикле сравните ПолучитьВремяИзменения() с граничной датой
- 3Для устаревших файлов вызовите УдалитьФайлы(Файл.ПолноеИмя) внутри Попытка/Исключение
- 4Зафиксируйте количество удалённых и пропущенных файлов в журнале регистрации
Клиент и сервер: где удаляется файл
В тонком и веб-клиенте директива компиляции определяет файловую систему, с которой работает код. Директива &НаСервере означает, что путь интерпретируется относительно сервера 1С, а операция выполняется под учётной записью агента сервера (обычно USR1CV8). Директива &НаКлиенте — работа с диском пользователя.
Частая ошибка — передать на сервер путь вида C:\Users\..., скопированный с клиентской машины. Сервер либо не найдёт такой путь, либо обратится к собственному диску C:. Для обмена файлами между клиентом и сервером используйте временное хранилище (ПоместитьВоВременноеХранилище), а не прямые пути.
Права доступа и типичные ошибки
На сервере операция выполняется от имени учётной записи службы агента 1С. Если у этой учётной записи нет прав на запись в целевой каталог, удаление завершится исключением «Отказано в доступе». Решение — выдать права учётной записи службы на каталог, а не запускать сервер под администратором.
В файловой базе, открытой несколькими пользователями, файл может быть заблокирован другим сеансом. Также блокировку создают антивирусные сканеры и индексирующие службы — в этом случае помогает повторная попытка с паузой или исключение каталога обмена из сканирования.
Асинхронное удаление и безопасные сценарии
В тонком и веб-клиенте при включённом режиме использования модальности синхронные файловые операции могут быть недоступны. Для таких случаев предусмотрены асинхронные аналоги: НачатьУдалениеФайлов() с описанием оповещения о завершении. Логика та же, но результат обрабатывается в отдельной процедуре-обработчике.
Безопасный паттерн для продуктивных обменов — не удалять файл сразу, а перемещать его в подкаталог архива (ПереместитьФайл) и очищать архив отдельной регламентной операцией по расписанию. Так сохраняется возможность восстановить данные при сбое обмена.
Как проверить результат
НайтиФайлы возвращает пустой массив
Файл на месте — проверьте контекст выполнения и права
Нет ошибок по событию обработки
Записи об ошибках доступа или блокировки файла
Выполняется без исключений
Исключение на том же файле — он заблокирован сторонним процессом
FAQ
УдалитьФайлы не выдаёт ошибку, но файл остаётся на месте. Почему?
Чаще всего код выполняется не в том контексте: серверная процедура ищет файл на сервере, а файл лежит на клиентской машине. Проверьте директиву компиляции и добавьте проверку НайтиФайлы до и после удаления, чтобы увидеть реальную картину.
Можно ли удалить каталог целиком вместе с содержимым?
Да, УдалитьФайлы с путём к каталогу удаляет его рекурсивно вместе со всем содержимым. Это опасная операция: убедитесь, что путь сформирован корректно и не указывает на корень диска или рабочий каталог базы.
Как удалить файл, если он занят другим процессом?
Напрямую — никак, операционная система запрещает удаление заблокированного файла. Освободите файл (закройте объект записи, завершите сторонний процесс) или реализуйте повторные попытки с паузой и ограничением числа итераций.
Чем УдалитьФайлы отличается от ПереместитьФайл в корзину?
УдалитьФайлы удаляет файл безвозвратно, минуя корзину. Если нужна возможность восстановления, перемещайте файл в архивный каталог средствами ПереместитьФайл и очищайте архив отдельно по расписанию.
Работает ли УдалитьФайлы в веб-клиенте?
Да, но с ограничениями: доступна только асинхронная модель через НачатьУдалениеФайлов, а работа с файловой системой требует расширения работы с файлами или выполняется на сервере.
Что важно запомнить
Удаление выполняется методом УдалитьФайлы с полным путём или парой «каталог + маска». Всегда проверяйте контекст выполнения (клиент/сервер), оборачивайте вызов в Попытка/Исключение и для продуктивных обменов предпочитайте перемещение в архив прямому удалению.