Как программно удалить файл .xlsx в 1С 7.7, если он не удаляется стандартными средствами

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Анализ работы штатного объекта ФС

Рассмотрим типичный код, который может приводить к ошибке. Проанализируем пример, где разработчик пытается перенести файлы из одного каталога в другой:


Процедура Сформировать()
    ФС.УстТекКаталог("C:\EXCEL");
    ИмяФайла = ФС.НайтиПервыйФайл("*.xlsx");
    Пока ПустаяСтрока(ИмяФайла) = 0 Цикл
        ФС.КопироватьФайл("C:\EXCEL\" + ИмяФайла, "C:\EXCEL_GOOD\" + ИмяФайла, 0);
        ФС.УдалитьФайл(ИмяФайла); // Ошибка может быть здесь
        ИмяФайла = ФС.НайтиСледующийФайл();
    КонецЦикла;
КонецПроцедуры

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

Важный момент: Команда ФС.УдалитьФайл требует строкового параметра, содержащего полный путь к файлу. Если файл не удаляется, первым делом попробуйте явно указать путь:

ФС.УдалитьФайл("C:\EXCEL\" + ИмяФайла);

Причина №1: Файл занят другим процессом

Как показывает практика и обсуждения опытных разработчиков, основной причиной невозможности удаления файлов Excel является их блокировка. Если файл .xlsx был открыт программно (например, через COM-объект Excel.Application) или пользователем вручную, операционная система накладывает запрет на его удаление.

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

Выясним причину блокировки. Если вы работаете с Excel через код, убедитесь, что вы не только закрыли книгу, но и вышли из самого приложения и обнулили ссылки:


// Пример корректного завершения работы с Excel
Эксель.Workbooks.Close();
Эксель.Quit();
Эксель = 0; // Освобождаем объект, чтобы процесс завершился

Пока процесс EXCEL.EXE висит в диспетчере задач и удерживает файл, ни одна команда удаления внутри 1С не сработает.

Причина №2: Права доступа и атрибуты файла

Если файл закрыт, но все равно не удаляется, проверим права доступа. В операционных системах семейства Windows права на чтение/копирование и права на удаление могут различаться. Также стоит проверить атрибут «Только чтение» (Read-only). Штатный объект ФС в 1С 7.7 иногда пасует перед файлами, имеющими этот флаг.

Кроме того, операции с объектом ФС не генерируют исключений (Попытка ... Исключение здесь бесполезна). Чтобы убедиться в успехе, необходимо проверять существование файла сразу после команды удаления:


ФС.УдалитьФайл(ПолныйПуть);
Если ФС.СуществуетФайл(ПолныйПуть) = 1 Тогда
    Сообщить("Файл не был удален! Проверьте права или блокировки.");
КонецЕсли;

Альтернативный метод: Использование FileSystemObject (FSO)

Если стандартные средства 1С 7.7 не справляются, профессионалы рекомендуют использовать возможности операционной системы через COM-объект Scripting.FileSystemObject. Этот метод гораздо мощнее, так как он умеет игнорировать атрибут «Только чтение» и предоставляет более гибкие механизмы работы с путями.

Рассмотрим пример реализации удаления через FSO:


Попытка
    FSO = СоздатьОбъект("Scripting.FileSystemObject");
    // Второй параметр "1" (True) заставляет принудительно удалять файлы Read-only
    FSO.DeleteFile("C:\EXCEL\яйцо.xlsx", 1);
Исключение
    Сообщить("Ошибка при удалении через FSO: " + ОписаниеОшибки());
КонецПопытки;

Преимущества использования FSO:

  1. Принудительное удаление: Параметр Force позволяет удалять защищенные от записи файлы.
  2. Информативность: В отличие от ФС, работа с FSO внутри блока Попытка позволяет перехватить ошибку и понять, почему она произошла (например, «Permission denied» — отказ в доступе).
  3. Работа с сетевыми путями: FSO стабильнее ведет себя в сетевом окружении и с длинными путями.

Оптимизация: Переименование вместо копирования

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

ФС.ПереименоватьФайл("C:\EXCEL\файл.xlsx", "C:\EXCEL_GOOD\файл.xlsx", 1);

Эта операция является атомарной на уровне файловой системы NTFS. Если файл занят, ПереименоватьФайл просто не сработает, но вам не придется беспокоиться о «зависших» копиях файлов, которые не удалось удалить.

Дополнительные нюансы работы в среде Windows

При работе с файлами .xlsx стоит учитывать специфику работы Microsoft Excel. При открытии документа Excel создает в той же папке скрытый временный файл, имя которого начинается с тильды и знака доллара (например, ~$файл.xlsx). Если ваш цикл обхода файлов через НайтиПервыйФайл подхватывает эти временные объекты, попытка их удаления программно почти всегда будет приводить к ошибке, так как они жестко заблокированы самим Excel.

Рекомендация: Всегда добавляйте проверку имени файла перед обработкой. Если имя начинается с ~$, такой файл следует игнорировать.

Итоги

Мы рассмотрели основные причины, по которым программное удаление файла может не работать в 1С 7.7. Подведем итог нашим действиям при возникновении подобной проблемы:

  1. Убедимся, что файл не открыт ни в одной программе и ни в одном COM-объекте.
  2. Проверим, что мы передаем полный путь к файлу в процедуру УдалитьФайл.
  3. Если штатный объект ФС не помогает, используем FileSystemObject с флагом принудительного удаления.
  4. Проверяем права доступа пользователя, под которым запущен сеанс 1С, к данной директории.

Используя эти методы, вы сможете сделать работу вашей конфигурации с внешними файлами Excel надежной и стабильной.

← На главную