В процессе разработки в среде 1С:Предприятие одной из наиболее часто встречающихся проблем при работе с файловой системой является ошибка: «Ошибка при вызове метода контекста (УдалитьФайлы): Отказано в доступе. 5(0x00000005)». Ситуация часто осложняется тем, что вручную (через проводник Windows) файл удаляется без проблем, а программный код выдает исключение. В данной статье мы подробно разберем, почему это происходит, и рассмотрим комплекс алгоритмов для решения этой задачи.
Проанализируем специфику работы встроенного метода 1С УдалитьФайлы. Согласно документации и практическому опыту, этот метод генерирует ошибку доступа, если у целевого файла установлен флаг «Только чтение». В отличие от операционной системы, которая может запросить подтверждение или проигнорировать этот флаг при ручном удалении, встроенный язык 1С требует предварительной подготовки файла.
Разберем по шагам, как программно снять это ограничение перед удалением. Нам понадобится объект Файл, который позволяет считывать и изменять параметры объекта файловой системы.
// Определяем путь к файлу
ПутьКФайлу = "\\ORM\sertifikat2\20150221\филе грудки кур. Юбилейное серт.TIF";
// Создаем объект Файл для анализа его свойств
ВыбФайл = Новый Файл(ПутьКФайлу);
// Проверяем, существует ли файл физически
Если ВыбФайл.Существует() Тогда
// Если установлен атрибут "Только чтение", снимаем его
Если ВыбФайл.ПолучитьТолькоЧтение() Тогда
ВыбФайл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
// Пытаемся удалить файл после снятия атрибута
Попытка
УдалитьФайлы(ПутьКФайлу);
Исключение
Сообщить("Не удалось удалить файл: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Выясним причину, связанную с архитектурой клиент-серверного взаимодействия. Если ваш код выполняется в процедуре с директивой &НаСервере, то физическое удаление файла инициирует не текущий пользователь Windows, а процесс службы сервера 1С (обычно ragent.exe).
Рассмотрим подробнее, на что стоит обратить внимание системному администратору и разработчику:
USR1CV8. Эта учетная запись не имеет прав доступа к сетевым ресурсам (UNC-путям типа \\Server\Share).Часто файл невозможно удалить, потому что он все еще «занят» другой программой или самой 1С. Рассмотрим ситуацию: вы открыли файл для чтения, вывели его в отчет, а затем сразу попытались удалить. Система может не успеть освободить дескриптор (handle) файла.
Посмотрим на пример решения с использованием цикла ожидания. Это позволяет дать системе время на освобождение файла, если он был занят антивирусом или завершающимся процессом.
ПутьКФайлу = Стр.ПутьКФайлу;
УспешноУдалено = Ложь;
КоличествоПопыток = 5; // Пробуем 5 раз
Для Итерация = 1 По КоличествоПопыток Цикл
Попытка
УдалитьФайлы(ПутьКФайлу);
УспешноУдалено = Истина;
Прервать; // Выходим из цикла, если удаление прошло успешно
Исключение
// Если это последняя попытка — выводим ошибку пользователю
Если Итерация = КоличествоПопыток Тогда
ЗаписьЖурналаРегистрации("Файловые операции", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось удалить файл после нескольких попыток: " + ПутьКФайлу);
КонецЕсли;
// Ждем небольшое время (например, 0.5 - 1 секунду) перед следующей попыткой
// В 1С 8.3 для этого можно использовать метод Приостановить
#Если Клиент Тогда
// На клиенте можно использовать предупреждение с таймаутом (хак)
#Иначе
// На сервере можно использовать замер времени или фоновое задание
#КонецЕсли
КонецПопытки;
КонецЦикла;
Проанализируем внешние факторы. Служба индексирования Windows Search или антивирусное ПО могут мгновенно захватывать новые или измененные файлы для сканирования. Если 1С пытается удалить файл ровно в этот микросегмент времени, возникнет ошибка «Отказано в доступе».
Для решения этой проблемы мы рекомендуем:
Разберем еще несколько технических нюансов, которые могут приводить к ошибке 5:
УдалитьФайлы не справляется, разработчики прибегают к вызову системной команды через ЗапуститьПриложение.Пример принудительного удаления через командную строку Windows:
// Формируем команду удаления (/F - принудительно, /Q - без подтверждения)
Команда = "cmd /c del /f /q """ + ПутьКФайлу + """";
ЗапуститьПриложение(Команда, , Истина); // Ждем завершения выполнения
Подведем итог: Ошибка «Отказано в доступе» при удалении файла в 1С чаще всего лечится программным снятием атрибута Только чтение или корректной настройкой прав доступа для пользователя, под которым работает серверная служба 1С. Сочетание этих методов обеспечит стабильную работу вашей системы при манипуляциях с файлами.