Удаление файлов в 1С 8.3: от метода УдалитьФайлы до очистки томов
Содержание
Удалить файл в 1С 8.3 программно можно одной строкой: УдалитьФайлы("C:\Обмен\выгрузка.xml"). На клиенте с платформы 8.3.18 лучше вызывать асинхронный вариант Ждать УдалитьФайлыАсинх(Путь). Файл, прикреплённый к документу, удаляют иначе: помечают на удаление и запускают удаление помеченных объектов.
Способ зависит от того, что это за файл. Файл на диске, временный файл платформы, кэш клиента и присоединённый файл в базе живут в разных местах, и метод удаления у каждого свой. Ниже разобраны все четыре случая, плюс особенности клиент-серверного варианта и автоматическая очистка по расписанию.
Какие файлы бывают в 1С и чем их удалять
Прежде чем удалять, определите, с каким файлом вы имеете дело. От этого зависит инструмент.
| Что удаляем | Где лежит | Чем удалять |
|---|---|---|
| Файл на диске (выгрузка, отчёт, обмен) | Любой каталог, сетевая папка | УдалитьФайлы, УдалитьФайлыАсинх |
| Временный файл, созданный кодом | Каталог временных файлов клиента или сервера | Тот же метод сразу после использования |
| Кэш метаданных клиента | Профиль пользователя Windows | Ключ /ClearCache или вручную при закрытой 1С |
| Сеансовые данные сервера | Каталог srvinfo сервера 1С | Только при остановленной службе агента |
| Присоединённый файл (скан, договор) | В базе или в томе на диске | Пометка на удаление → удаление помеченных |
| Журнал регистрации | Каталог базы или кластера | Сокращение журнала, не ручное удаление |
В платформе для работы с файлами есть несколько встроенных инструментов:
- 📁 объект
Файл— проверка существования, тип (файл или каталог), атрибут «только чтение», время изменения; - 🔍
НайтиФайлы(Путь, Маска, ИскатьВПодкаталогах)— список файлов по маске; - 🗑
УдалитьФайлы(Путь, Маска)— удаление файла, каталога или файлов по маске; - ⏳
ПолучитьИмяВременногоФайла(Расширение)иКаталогВременныхФайлов()— работа со временными файлами; - ⚡ асинхронные аналоги с суффиксом
Асинх(8.3.18 и выше) — для клиентского кода и веб-клиента.
УдалитьФайлы удаляет файл безвозвратно, мимо корзины Windows. Восстановить его можно только из резервной копии диска.
Удаление файла кодом на встроенном языке
Базовый алгоритм из трёх шагов: проверить, что файл есть, снять атрибут «только чтение», удалить и перехватить ошибку.
Серверный вариант
&НаСервере
Процедура УдалитьФайлНаСервере(ПолноеИмя)
Файл = Новый Файл(ПолноеИмя);
Если Не Файл.Существует() Тогда
Возврат;
КонецЕсли;
Если Файл.ПолучитьТолькоЧтение() Тогда
Файл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
Попытка
УдалитьФайлы(ПолноеИмя);
Исключение
ЗаписьЖурналаРегистрации("УдалениеФайлов",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Без Попытка … Исключение любой занятый файл обрывает выполнение всей процедуры. А запись в журнал регистрации потом покажет, какой файл не удалился и почему. Сама платформа удаление файла с диска в журнал не пишет.
Клиентский вариант (асинхронный)
На клиенте синхронные файловые методы вызывают предупреждения конфигуратора о модальности и не работают в веб-клиенте без расширения работы с файлами. Поэтому для 8.3.18 и выше:
&НаКлиенте
Асинх Процедура УдалитьВыгрузку(Команда)
Путь = "C:\Обмен\выгрузка.xml";
Файл = Новый Файл(Путь);
Если Ждать Файл.СуществуетАсинх() Тогда
Попытка
Ждать УдалитьФайлыАсинх(Путь);
Исключение
Сообщить("Не удалось удалить " + Путь + ": "
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
КонецПроцедуры
На старых платформах вместо Асинх/Ждать используется НачатьУдалениеФайлов с описанием оповещения.
Удаление по маске и целого каталога
Метод принимает два параметра, и их сочетание меняет поведение:
УдалитьФайлы("D:\Выгрузки\отчет.xlsx")— удаляется один файл.УдалитьФайлы("D:\Выгрузки", "*.tmp")— удаляются файлы по маске в указанном каталоге, сам каталог остаётся.УдалитьФайлы("D:\Выгрузки\Архив")— удаляется каталог вместе со всем содержимым.
Третий вариант самый опасный: ошибка в переменной с путём, и вы стираете не ту папку. Перед удалением каталога проверяйте, что путь не пустой и указывает именно туда, куда нужно:
Если ПустаяСтрока(Каталог) Или СтрДлина(Каталог) < 4 Тогда
ВызватьИсключение "Подозрительный путь к каталогу: " + Каталог;
КонецЕсли;
Если нужно выборочно удалить файлы, например старше 30 дней, не используйте маску. Получите список через НайтиФайлы, отфильтруйте по ПолучитьВремяИзменения() и удаляйте по одному. Пример есть в разделе об автоматизации.
Временные файлы и кэш: что можно стереть без вреда
Временные файлы из кода
ПолучитьИмяВременногоФайла("xlsx") только придумывает уникальное имя в каталоге временных файлов. Сам файл создаёт ваш код, и удалять его тоже должен ваш код. Платформа за вами не уберёт.
Правильный шаблон: создать, использовать, удалить в одной процедуре.
ИмяВрем = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяВрем, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВрем);
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
УдалитьФайлы(ИмяВрем);
Если про удаление забыть, в каталоге временных файлов копятся тысячи файлов вида v8_XXXX.tmp. На сервере это %TEMP% учётной записи, от которой запущена служба 1С (по умолчанию usr1cv8).
Кэш клиента
Кэш конфигурации хранится в профиле пользователя Windows:
- 📂
%APPDATA%\1C\1cv8\— папки с именами-идентификаторами (GUID), по одной на базу; - 📂
%LOCALAPPDATA%\1C\1cv8\— такие же папки с локальной частью кэша.
Удалять можно только папки с GUID-именами и только при закрытой 1С. Каталог %APPDATA%\1C\1CEStart не трогайте: там файл ibases.v8i со списком баз.
Ручное удаление не всегда нужно. Проще добавить ключ /ClearCache в дополнительные параметры запуска базы: в окне запуска выберите базу → Изменить → на последнем шаге поле дополнительных параметров. После одного входа ключ можно убрать.
Кэш и сеансовые данные сервера
На сервере 1С в каталоге srvinfo\reg_1541\<идентификатор базы>\ лежат папки snccntx… с сеансовыми данными. Их чистят, когда после обновления конфигурации появляются странные ошибки, которые не уходят после очистки клиентского кэша.
Удалять snccntx можно только при остановленной службе агента сервера 1С. Остановка службы оборвёт сеансы всех пользователей всех баз на этом сервере. Делайте это в нерабочее время, предупредив людей заранее.
Порядок:
- Завершите сеансы пользователей и остановите службу агента сервера 1С.
- Скопируйте папки
snccntx…в сторону, чтобы был путь назад. - Удалите их из каталога базы.
- Запустите службу и проверьте вход в базу.
Присоединённые файлы: удаление через интерфейс программы
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) к документам и справочникам прикрепляют файлы: сканы, договоры, фотографии. Это не файлы на диске, а элементы справочника, поэтому удалить их кнопкой Delete в проводнике нельзя.
Как удалить присоединённый файл
- Откройте документ или элемент справочника.
- Нажмите на кнопку со скрепкой, откроется список присоединённых файлов.
- Выделите файл и пометьте его на удаление (клавиша
Deleteв списке ставит пометку, а не удаляет). - Откройте
Администрирование → Обслуживание → Корректировка данных → Удаление помеченных объектов. - Выберите выборочное удаление, отметьте файл и подтвердите.
Пока объект только помечен, он остаётся в базе и занимает место. Физически файл исчезнет после шага 5.
Если файлы хранятся в томах на диске
В БСП есть режим хранения файлов не в базе, а в томах — каталогах на диске или в сетевой папке. Его включают в разделе Администрирование, в группе настроек работы с файлами (в разных релизах это ссылка в «Общих настройках» или отдельная команда раздела).
Что учесть:
- 🚫 Не удаляйте файлы из каталога тома проводником. В базе останется ссылка, и при открытии карточки пользователь получит ошибку чтения файла.
- ✅ Удаляйте через пометку и удаление помеченных, как описано выше. Тогда исчезнет и запись в базе, и файл в томе.
- 🔎 Для поиска «осиротевших» файлов в томе, которых уже нет в базе, используйте проверку целостности тома из карточки тома в справочнике томов хранения файлов. Она покажет лишние файлы и файлы, которых не хватает.
| Ситуация | Что делать |
|---|---|
| Файл есть в базе, нужно убрать | Пометка на удаление → удаление помеченных |
| Файл есть на диске, но нет в базе | Проверка целостности тома, затем удаление лишних |
| Файл есть в базе, но пропал с диска | Восстановить из бэкапа каталога тома |
Журнал регистрации
Файлы журнала регистрации тоже занимают место, но удалять их вручную нельзя: база перестанет корректно писать события. Сокращают журнал в конфигураторе через Администрирование → Журнал регистрации, с выгрузкой старых записей в файл, если они могут понадобиться.
Клиент-серверный вариант: на чьём диске удаляется файл
Главная ловушка клиент-серверной базы: код с директивой &НаСервере работает на компьютере сервера 1С, а не у пользователя.
Что из этого следует:
- 🖥
УдалитьФайлы("C:\Users\Иванов\Desktop\отчет.xlsx")на сервере ищет такой путь на диске сервера. Файл пользователя не удалится, а на сервере такого пути обычно нет. - 🔐 Серверный код работает от имени учётной записи службы 1С (по умолчанию
usr1cv8). Если у неё нет права на изменение в папке, удаление упадёт с ошибкой доступа, хотя у пользователя права есть. - 🌐 Для сетевых папок используйте UNC-путь вида
\\fileserver\obmen\, а не подключённую букву диска. БукваZ:существует в сеансе пользователя Windows, а служба её не видит. - ⚙️ Если в кластере несколько рабочих серверов, вызовы одного сеанса могут выполняться на разных машинах. Временный файл, созданный в одном серверном вызове, в следующем может оказаться недоступен. Передавайте данные между вызовами через
ПоместитьВоВременноеХранилище, а файл удаляйте в том же вызове, где создали.
Файлы на компьютере пользователя удаляют клиентским кодом (&НаКлиенте). В веб-клиенте для этого нужно расширение работы с файлами, без него браузер не даст доступа к локальному диску.
В файловом варианте базы «сервер» и клиент — один компьютер или одна сетевая папка, поэтому путаница с дисками возникает реже. Права всё равно проверяйте: пользователь Windows, под которым запущена 1С, должен иметь право на удаление в каталоге.
Автоматическая очистка по расписанию
Ручная чистка забывается. Если каталог обмена или выгрузок растёт каждый день, вынесите удаление в регламентное задание.
Удаление помеченных объектов по расписанию
В типовых конфигурациях на БСП в форме удаления помеченных объектов есть настройка автоматического удаления по расписанию. С ней помеченные присоединённые файлы будут физически удаляться, например, раз в неделю ночью. Включайте её, только если пользователи понимают, что пометка на удаление больше не «корзина» с возможностью передумать.
Своё регламентное задание для каталога
Если нужно чистить каталог на диске, разработчик добавляет регламентное задание в расширение или конфигурацию. Пример процедуры, которая удаляет XML-файлы старше 30 дней:
Процедура ОчисткаКаталогаОбмена() Экспорт
Каталог = "\\fileserver\obmen\archive";
Граница = ТекущаяДата() - 30 * 86400;
Найденные = НайтиФайлы(Каталог, "*.xml", Ложь);
Удалено = 0;
Для Каждого Ф Из Найденные Цикл
Если Ф.ЭтоФайл() И Ф.ПолучитьВремяИзменения() < Граница Тогда
Попытка
УдалитьФайлы(Ф.ПолноеИмя);
Удалено = Удалено + 1;
Исключение
ЗаписьЖурналаРегистрации("ОчисткаКаталогаОбмена",
УровеньЖурналаРегистрации.Предупреждение, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
КонецЦикла;
ЗаписьЖурналаРегистрации("ОчисткаКаталогаОбмена",
УровеньЖурналаРегистрации.Информация, , ,
СтрШаблон("Удалено файлов: %1", Формат(Удалено, "ЧГ=0")));
КонецПроцедуры
Здесь ТекущаяДата() берётся намеренно: процедура выполняется на сервере, и время изменения файла тоже показывается по часам сервера. 30 дней × 86 400 секунд = 2 592 000 секунд, на столько сдвигается граница.
Что настроить вокруг задания:
- Укажите расписание в часы, когда обмен не идёт, например в 03:00.
- В клиент-серверной базе проверьте, что регламентные задания не заблокированы в свойствах базы в консоли кластера.
- В файловой базе задание выполняется только при запущенном сеансе 1С, поэтому ночью оно сработает лишь при открытом клиенте или публикации на веб-сервере.
- Через неделю откройте журнал регистрации с отбором по событию
ОчисткаКаталогаОбменаи убедитесь, что счётчик удалённых файлов растёт.