Почему при хранении файлов в томах запрос к базе всё равно показывает их размер и количество?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

Анализируем структуру справочника присоединенных файлов

Для начала проанализируем, что именно мы получаем, когда выполняем запрос к справочнику, например, к НоменклатураПрисоединенныеФайлы. Рассмотрим типичный запрос, который часто используют для оценки объема данных:


ВЫБРАТЬ
    СУММА(1) КАК КолвоШтук,
    СУММА(Файлы.Размер) КАК ОбщийРазмер
ИЗ
    Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы

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

Проанализировав эту структуру, становится ясно: когда вы суммируете поле Размер, вы просто складываете обычные числа. Это значение не зависит от того, удален ли физический файл с диска или очищен ли реквизит ФайлХранилище. Это справочная информация, которая нужна системе, чтобы быстро показать пользователю размер файла в списке, не обращаясь к файловой системе или тяжелым бинарным полям.

Разберем механизм миграции файлов в тома

Рассмотрим ситуацию, когда мы нажимаем кнопку «Перенести все файлы в тома». Проанализируем, какие действия выполняет система в этот момент:

  1. Программа перебирает записи в справочнике, у которых ТипХраненияФайла установлен в значение «В информационной базе».
  2. Для каждой записи извлекаются двоичные данные из поля ФайлХранилище.
  3. Эти данные записываются в файл на диске по пути, указанному в настройках тома.
  4. В справочнике обновляется поле Том и путь к файлу.
  5. Критически важный этап: реквизит ФайлХранилище очищается (устанавливается в значение Неопределено или пустое ХранилищеЗначения), а ТипХраненияФайла меняется на «В томах на диске».

Таким образом, запись в справочнике остается всегда. Она служит «карточкой» документа. Если вы добавили 7 новых файлов, в справочнике гарантированно появится 7 новых записей, и ваш запрос покажет их рост. Но физический вес этих записей в самой базе SQL или файловой 1Cv8.1cd будет минимальным, так как самое «тяжелое» поле (двоичные данные) теперь пустое.

Почему база данных не уменьшается сразу?

Часто после переноса гигабайт данных в тома администраторы замечают, что размер файла базы данных (.mdf или .1cd) не изменился. Проанализируем причины этого поведения. Системы управления базами данных (СУБД) работают таким образом, что при удалении данных внутри таблиц образуются «дыры» (свободное пространство), но само место на диске операционной системе не возвращается. СУБД резервирует это пространство для будущих записей.

Чтобы реально уменьшить размер файла базы, необходимо выполнить дополнительные действия:

Особенности хранения на диске и права доступа

Выясним, как именно файлы располагаются на диске. 1С не сохраняет их с именами вроде «Прайс.pdf». Вместо этого используется уникальный идентификатор (GUID). Система создает вложенную структуру папок, например: \0a\f1\0af1e3.... Это делается для того, чтобы в одной папке не скапливались десятки тысяч файлов, что могло бы привести к критическому замедлению работы файловой системы.

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

Риски и стратегия резервного копирования

Посмотрим на ситуацию со стороны системного администрирования. Переход на хранение в томах радикально меняет стратегию бэкапов. Рассмотрим основные риски:

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

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

Поэтому при использовании томов мы должны обеспечить одновременное создание копии SQL-базы и копии содержимого всех папок с томами.

Резюме

Проанализировав проблему, мы приходим к следующим выводам:

  1. Запрос к справочнику присоединенных файлов всегда будет показывать количество и размер файлов, так как это описательные данные, хранящиеся в обычных полях таблиц.
  2. Настройка «Хранить в томах» эффективно выносит только «тело» файла (двоичный код), освобождая основное хранилище базы данных.
  3. Для проверки эффективности переноса следует анализировать не результат запроса по полю Размер, а физический объем таблиц с суффиксом _Blob в SQL или размер файла 1Cv8.1cd после сжатия.

Таким образом, ваша настройка работает корректно: файлы появляются в папке, а записи в базе позволяют системе знать, что это за файлы и какой объем они занимают в реальности.

← На главную