К статье
Практический материал

Разработка и Конфигурация · 7 мин

Как удалить файл программно в 1С

Как удалить файл в 1С программно: метод УдалитьФайлы, работа с масками, проверка существования, обработка ошибок и права доступа. Примеры кода для 8.3.

Удаление файлов из кода 1С — типовая задача при обмене данными, очистке временных каталогов, ротации архивов выгрузок и обслуживании файловых хранилищ. Во встроенном языке для этого предусмотрен метод УдалитьФайлы(), который работает как на клиенте, так и на сервере, но с важными различиями в контексте файловой системы.

Главный подводный камень — понимание того, на чьей стороне выполняется код. Серверный вызов удаляет файл на сервере 1С под учётной записью агента, клиентский — на машине пользователя. Ошибка в выборе контекста приводит либо к «тихому» отсутствию результата, либо к удалению не того файла.

Ниже разобраны синтаксис метода, удаление по маске, проверка существования файла, обработка ошибок, безопасные сценарии и типичные ошибки разработчиков.

Метод УдалитьФайлы: синтаксис и поведение

Метод УдалитьФайлы() имеет два варианта вызова. Первый — с одним параметром, полным путём к конкретному файлу: УдалитьФайлы("C:\Temp\export.xml"). Второй — с двумя параметрами: путь к каталогу и маска поиска, например УдалитьФайлы("C:\Temp\", "*.tmp") удалит все временные файлы в каталоге.

Метод не возвращает значения. Если файл не найден, исключения не возникает — операция просто ничего не делает. Это удобно для массовой очистки, но опасно при логировании: без дополнительной проверки нельзя понять, был ли файл удалён реально.

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

bsl
Попытка
    УдалитьФайлы("D:\Exchange\output.xml");
Исключение
    ЗаписьЖурналаРегистрации("Удаление файла", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;

Проверка существования файла перед удалением

Хотя УдалитьФайлы() не падает при отсутствии файла, явная проверка нужна для корректной логики обработки: например, чтобы отличить «файл удалён» от «файла не было». Стандартный способ — метод НайтиФайлы(), который возвращает массив найденных файлов.

Альтернатива — объект Файл с методом Существует(). Оба подхода равнозначны; НайтиФайлы удобнее, когда дальше нужны свойства файла (размер, дата изменения), а объект Файл — когда проверяется один конкретный путь.

ФайлНаДиске = Новый Файл("D:\Exchange\output.xml");

Если ФайлНаДиске.Существует() Тогда

УдалитьФайлы(ФайлНаДиске.ПолноеИмя);

КонецЕсли;

Удаление по маске и очистка каталогов

Маски поддерживают символы (любая последовательность) и ? (один символ). Типовой сценарий — очистка каталога обмена от устаревших файлов выгрузки: УдалитьФайлы(КаталогОбмена, ".xml"). Учтите, что маска действует только на указанный каталог, без рекурсивного обхода вложенных папок.

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

Очистка каталога от старых файлов
  1. 1
    Получите массив файлов: НайтиФайлы(Каталог, "<em>.</em>")
  2. 2
    В цикле сравните ПолучитьВремяИзменения() с граничной датой
  3. 3
    Для устаревших файлов вызовите УдалитьФайлы(Файл.ПолноеИмя) внутри Попытка/Исключение
  4. 4
    Зафиксируйте количество удалённых и пропущенных файлов в журнале регистрации

Клиент и сервер: где удаляется файл

В тонком и веб-клиенте директива компиляции определяет файловую систему, с которой работает код. Директива &НаСервере означает, что путь интерпретируется относительно сервера 1С, а операция выполняется под учётной записью агента сервера (обычно USR1CV8). Директива &НаКлиенте — работа с диском пользователя.

Частая ошибка — передать на сервер путь вида C:\Users\..., скопированный с клиентской машины. Сервер либо не найдёт такой путь, либо обратится к собственному диску C:. Для обмена файлами между клиентом и сервером используйте временное хранилище (ПоместитьВоВременноеХранилище), а не прямые пути.

Права доступа и типичные ошибки

На сервере операция выполняется от имени учётной записи службы агента 1С. Если у этой учётной записи нет прав на запись в целевой каталог, удаление завершится исключением «Отказано в доступе». Решение — выдать права учётной записи службы на каталог, а не запускать сервер под администратором.

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

Типичные ошибки
01
Смешение клиентского и серверного контекста: файл ищется не на той машине, операция «молча» не срабатывает
02
Отсутствие Попытка/Исключение: один заблокированный файл прерывает всю обработку обмена
03
Удаление по маске <em>.</em> в каталоге, где лежат нужные файлы, — потеря данных без возможности восстановления
04
Удаление файла сразу после записи без закрытия объекта ЗаписьТекста/ЗаписьXML — файл занят и не удаляется

Асинхронное удаление и безопасные сценарии

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

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

Контрольные точки

Как проверить результат

Существование файла после операции
Норма

НайтиФайлы возвращает пустой массив

Тревожный признак

Файл на месте — проверьте контекст выполнения и права

Журнал регистрации
Норма

Нет ошибок по событию обработки

Тревожный признак

Записи об ошибках доступа или блокировки файла

Повторный запуск обработки
Норма

Выполняется без исключений

Тревожный признак

Исключение на том же файле — он заблокирован сторонним процессом

FAQ

УдалитьФайлы не выдаёт ошибку, но файл остаётся на месте. Почему?

Чаще всего код выполняется не в том контексте: серверная процедура ищет файл на сервере, а файл лежит на клиентской машине. Проверьте директиву компиляции и добавьте проверку НайтиФайлы до и после удаления, чтобы увидеть реальную картину.

Можно ли удалить каталог целиком вместе с содержимым?

Да, УдалитьФайлы с путём к каталогу удаляет его рекурсивно вместе со всем содержимым. Это опасная операция: убедитесь, что путь сформирован корректно и не указывает на корень диска или рабочий каталог базы.

Как удалить файл, если он занят другим процессом?

Напрямую — никак, операционная система запрещает удаление заблокированного файла. Освободите файл (закройте объект записи, завершите сторонний процесс) или реализуйте повторные попытки с паузой и ограничением числа итераций.

Чем УдалитьФайлы отличается от ПереместитьФайл в корзину?

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

Работает ли УдалитьФайлы в веб-клиенте?

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

Итог

Что важно запомнить

Удаление выполняется методом УдалитьФайлы с полным путём или парой «каталог + маска». Всегда проверяйте контекст выполнения (клиент/сервер), оборачивайте вызов в Попытка/Исключение и для продуктивных обменов предпочитайте перемещение в архив прямому удалению.