При переходе на хранение файлов вне информационной базы (в томах на диске) многие администраторы и разработчики сталкиваются с ситуацией, которая на первый взгляд кажется ошибкой. Выполнив запрос к справочнику присоединенных файлов, мы видим, что количество записей и суммарный размер файлов остались прежними или даже выросли после добавления новых объектов. Разберем детально, как устроена подсистема «Присоединенные файлы» в 1С:Предприятие 8, и выясним, почему данные в базе не исчезают полностью.
Для начала проанализируем, что именно мы получаем, когда выполняем запрос к справочнику, например, к НоменклатураПрисоединенныеФайлы. Рассмотрим типичный запрос, который часто используют для оценки объема данных:
ВЫБРАТЬ
СУММА(1) КАК КолвоШтук,
СУММА(Файлы.Размер) КАК ОбщийРазмер
ИЗ
Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы
Важно понимать, что в данном случае мы обращаемся к метаданным. В справочнике присоединенных файлов хранятся не только сами двоичные данные, но и их описание. Посмотрим на ключевые реквизиты, которые присутствуют в карточке файла:
Число), куда записывается объем файла в байтах в момент его загрузки.ТомаХраненияФайлов, если выбрано внешнее хранение.ХранилищеЗначения. Именно здесь лежат бинарные данные, если файл хранится «В базе».Проанализировав эту структуру, становится ясно: когда вы суммируете поле Размер, вы просто складываете обычные числа. Это значение не зависит от того, удален ли физический файл с диска или очищен ли реквизит ФайлХранилище. Это справочная информация, которая нужна системе, чтобы быстро показать пользователю размер файла в списке, не обращаясь к файловой системе или тяжелым бинарным полям.
Рассмотрим ситуацию, когда мы нажимаем кнопку «Перенести все файлы в тома». Проанализируем, какие действия выполняет система в этот момент:
ТипХраненияФайла установлен в значение «В информационной базе».ФайлХранилище.Том и путь к файлу.ФайлХранилище очищается (устанавливается в значение Неопределено или пустое ХранилищеЗначения), а ТипХраненияФайла меняется на «В томах на диске».Таким образом, запись в справочнике остается всегда. Она служит «карточкой» документа. Если вы добавили 7 новых файлов, в справочнике гарантированно появится 7 новых записей, и ваш запрос покажет их рост. Но физический вес этих записей в самой базе SQL или файловой 1Cv8.1cd будет минимальным, так как самое «тяжелое» поле (двоичные данные) теперь пустое.
Часто после переноса гигабайт данных в тома администраторы замечают, что размер файла базы данных (.mdf или .1cd) не изменился. Проанализируем причины этого поведения. Системы управления базами данных (СУБД) работают таким образом, что при удалении данных внутри таблиц образуются «дыры» (свободное пространство), но само место на диске операционной системе не возвращается. СУБД резервирует это пространство для будущих записей.
Чтобы реально уменьшить размер файла базы, необходимо выполнить дополнительные действия:
Выясним, как именно файлы располагаются на диске. 1С не сохраняет их с именами вроде «Прайс.pdf». Вместо этого используется уникальный идентификатор (GUID). Система создает вложенную структуру папок, например: \0a\f1\0af1e3.... Это делается для того, чтобы в одной папке не скапливались десятки тысяч файлов, что могло бы привести к критическому замедлению работы файловой системы.
Проанализируем вопрос безопасности. Для корректной работы необходимо, чтобы у пользователя, под которым запущен сервер 1С (rphost.exe), были полные права (чтение и запись) на сетевую папку или локальную директорию тома. Если вы работаете в файловом режиме, права должны быть у каждого пользователя, который открывает базу.
Посмотрим на ситуацию со стороны системного администрирования. Переход на хранение в томах радикально меняет стратегию бэкапов. Рассмотрим основные риски:
1. Рассинхронизация данных. Если вы восстановите базу данных из вечернего бэкапа, а папку с томами оставите текущую (утреннюю), возможны ошибки. В базе могут отсутствовать ссылки на файлы, которые уже физически созданы на диске. Хуже обратная ситуация: в базе есть записи о файлах, а в томах их нет (например, если тома не попали в бэкап).
2. Формат .dt. Важно помнить: при выгрузке информационной базы в формат .dt файлы, хранящиеся в томах, не включаются в этот архив. Выгрузка будет содержать только метаданные (те самые записи в справочнике, которые мы видели в запросе).
Поэтому при использовании томов мы должны обеспечить одновременное создание копии SQL-базы и копии содержимого всех папок с томами.
Проанализировав проблему, мы приходим к следующим выводам:
Размер, а физический объем таблиц с суффиксом _Blob в SQL или размер файла 1Cv8.1cd после сжатия.Таким образом, ваша настройка работает корректно: файлы появляются в папке, а записи в базе позволяют системе знать, что это за файлы и какой объем они занимают в реальности.