При использовании механизма хранения файлов в томах на диске системные администраторы и разработчики часто сталкиваются с проблемой: после удаления документов или записей в 1С физические файлы на сервере остаются нетронутыми. Со временем это приводит к тому, что объем папок на диске в несколько раз превышает реальный объем данных, используемых в информационной базе. В этой статье мы подробно разберем, как привести состояние томов в соответствие с данными базы 1С, используя стандартные средства Библиотеки стандартных подсистем (БСП).
Прежде чем приступать к удалению, давайте разберем, почему возникает такая ситуация. В 1С файлы, привязанные к объектам (документам, справочникам), хранятся либо непосредственно в базе данных, либо во внешних томах. При выборе хранения в томах в базе сохраняется только ссылка (путь) на файл. Когда пользователь помечает объект на удаление и затем окончательно удаляет его через «Удаление помеченных объектов», запись в базе исчезает, но физический файл на диске может остаться. Это происходит потому, что непосредственное удаление файла с диска в момент удаления записи из БД — операция рискованная и не всегда автоматизированная.
Рассмотрим основной инструмент очистки, который предусмотрен в большинстве современных конфигураций (УТ 11, БП 3.0, ERP 2, КА 2). Для доступа к нему выполним следующие шаги:
В карточке тома нас интересуют две важные кнопки: Проверить целостность и Удалить лишние файлы. Рассмотрим их назначение подробнее.
Перед любым удалением мы рекомендуем сначала запустить проверку. Проанализируем, что именно делает эта функция. Она сопоставляет список файлов в папке на диске с записями в регистре сведений ПутиКФайлам. По результатам проверки система формирует отчет, где файлы делятся на категории:
Важный нюанс: в некоторых версиях конфигураций (например, в старых релизах УТ 11.1) кнопка удаления может отсутствовать. Как мы видим из обсуждения, функционал полноценной очистки появился в более поздних версиях БСП (начиная с УТ 11.3.3 и аналогичных). Если кнопки нет, стоит убедиться, что программа обновлена до актуального релиза.
Посмотрим, как избавить себя от рутины и настроить автоматическую очистку. В современных версиях 1С существует регламентное задание ОчисткаНенужныхФайлов. Чтобы его настроить:
Выясним причину, по которой кнопка очистки может быть неактивна или выдавать ошибки. Для выполнения этих операций недостаточно быть просто пользователем. Проанализируем два уровня прав:
1. Права внутри 1С: Пользователь должен обладать ролями ПолныеПрава или СистемноеАдминистрирование. Без них интерфейсные кнопки управления томами могут быть скрыты.
2. Права в операционной системе: Это критически важный момент. Сервер 1С (процесс rphost) работает под определенной учетной записью (часто это USR1CV8). Эта учетная запись должна иметь права на Удаление в сетевой папке, где расположен том. Если права есть только на чтение и запись, 1С сможет добавлять файлы, но при попытке очистки лишних данных ничего не произойдет, хотя система может не выдать явной ошибки в интерфейсе.
Часто возникает ситуация: объект удален, а файл все равно считается «нужным» и не попадает в категорию лишних. Разберем, почему так происходит. Если в базе включено Версионирование объектов, то 1С хранит историю изменений. Даже если основной документ удален, файл может быть привязан к одной из исторических версий этого документа в регистре ВерсииОбъектов. Для очистки устаревших записей регистра версионирования можно использовать обработку для удаления неактуальных версий объектов.
Чтобы очистить такие файлы, сначала необходимо выполнить очистку истории версий:
Рассмотрим предложение из обсуждения использовать обработчик ПередУдалением для немедленного удаления файла с диска. Проанализируем, почему это плохая практика. Посмотрим на пример кода, который часто пытаются внедрить новички:
Процедура ПередУдалением(Отказ)
// ОПАСНО: Попытка удаления файла напрямую
ПутьКФайлу = ПолучитьПутьКФайлуВТоме(ЭтотОбъект);
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
УдалитьФайлы(ПутьКФайлу);
КонецЕсли;
КонецПроцедуры
Почему это опасно? Удаление объекта в 1С происходит внутри транзакции. Если после выполнения кода в ПередУдалением произойдет сбой (например, база заблокирована другим процессом или возникла ошибка в другом месте), транзакция откатится, и объект останется в базе. Но файл на диске уже будет удален физически! В итоге вы получите «битую» ссылку, по которой файл никогда не откроется. Правильный подход — использовать типовые механизмы БСП, которые удаляют файлы только после подтвержденного удаления ссылок в БД.
В завершение проанализируем ситуацию с дисковыми квотами. Если вы используете продвинутые системы хранения данных (NAS), место на диске может не освобождаться даже после успешного удаления файлов 1С. Это связано с механизмом Snapshots (снимков системы). Файловая система хранит копию удаленного файла для возможности восстановления. В этом случае для реального освобождения места потребуется вмешательство системного администратора для настройки политики хранения снимков на стороне сетевого хранилища.
Таким образом, для эффективной очистки томов мы рекомендуем придерживаться следующего алгоритма: проверить права доступа учетной записи сервера 1С, очистить историю версий объектов, выполнить регламентное удаление помеченных объектов и только затем запускать стандартную процедуру очистки лишних файлов в карточке тома. При значительном объеме удаляемых данных для ускорения этого шага можно использовать обработку для удаления помеченных на удаление объектов с предварительным отбором.