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