Почему не уменьшается размер файловой базы 1С и как исправить ошибку выгрузки в DT

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

В процессе активной эксплуатации файловой информационной базы 1Cv8.1CD ее размер может достигать критических значений. Администраторы и разработчики часто сталкиваются с ситуацией, когда после выполнения свертки базы данных и полного удаления десятков тысяч помеченных объектов физический размер файла базы на диске не уменьшается ни на один мегабайт, а при попытке сформировать файл выгрузки *.dt возникает ошибка нарушения целостности информационной базы в таблице Files или Params.

Разберем детально внутреннее устройство файловой СУБД 1С, выясним причину такого поведения и пошагово рассмотрим способы физического сжатия базы данных, восстановления целостности и корректного резервного копирования.

Почему удаление объектов и свертка не уменьшают размер файла 1CD

Для понимания происходящего проанализируем архитектуру файлового хранилища 1С. Внутренний механизм файловой СУБД устроен таким образом, что при пометке на удаление и последующем окончательном удалении объектов из базы (документов, элементов справочников, движений регистров) физическое удаление данных из файла 1Cv8.1CD не происходит:

  1. Маркировка свободных блоков: При удалении строк таблицы занимаемые ими страницы данных и блоки LOB (Large Object) лишь помечаются как свободные для будущей записи.
  2. Отсутствие автоматической дефрагментации: Файл базы данных не отдает освободившееся дисковое пространство операционной системе автоматически, чтобы не тратить ресурсы процессора и дисковой подсистемы на постоянное перестроение структуры таблиц.
  3. Переиспользование пространства: Новые документы и данные будут записываться в уже выделенные свободные страницы, поэтому до момента заполнения этих блоков файл базы расти не будет, но и меньше он сам по себе не станет.

Физическое уменьшение файла базы данных и возврат пространства операционной системе возможны только при принудительном сжатии таблиц.

Способ 1. Физическое сжатие базы через Тестирование и исправление

Основным штатным инструментом для освобождения незанятых блоков является режим тестирования и исправления информационной базы. Рассмотрим правильный порядок действий для сжатия базы:

  1. Завершим все активные сеансы пользователей и создадим резервную копию файла 1Cv8.1CD простым копированием на уровне файловой системы.
  2. Запустим информационную базу в режиме Конфигуратор с правами администратора.
  3. Перейдем в главное меню: Администрирование — Тестирование и исправление...
  4. В открывшемся окне обязательно установим флаг Сжатие таблиц информационной базы.
  5. Для комплексного обслуживания базы рекомендуется также включить опции Реиндексация таблиц информационной базы и Пересчет итогов.
  6. Нажмем кнопку Выполнить и дождемся завершения операции.

После завершения процедуры сжатия размер файла 1Cv8.1CD уменьшится до реального объема фактически хранящихся данных.

Способ 2. Исправление и сжатие утилитой chdbfl.exe

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

  1. Перейдем в каталог установленной платформы, например: C:\Program Files\1cv8\8.3.X.XXXX\bin\ (или Program Files (x86)).
  2. Запустим исполняемый файл chdbfl.exe.
  3. В поле Имя файла БД укажем путь к нашему файлу 1Cv8.1CD.
  4. Установим флаг Исправлять обнаруженные ошибки.
  5. Нажмем кнопку Выполнить.

В процессе исправления утилита не только валидирует целостность страниц, но и выполняет реструктуризацию и уплотнение данных, что приводит к уменьшению общего размера базы на диске.

Анализ ошибки выгрузки в DT: Ошибка в размере файла *.pfls при выгрузке таблицы Files

При выгрузке базы данных через меню Администрирование — Выгрузить информационную базу... нередко возникает критическая ошибка:

Нарушение целостности информационной базы. Ошибка в размере файла ***.pfls при выгрузке таблицы Files. Ожидаемое значение 0, значение в таблице...

Разберем природу данной ошибки:

  1. Файлы с расширением .pfls представляют собой внутренние сериализованные структуры системных настроек форм, фильтров, отчетов и интерфейсов конкретных пользователей. Они хранятся в служебных таблицах Files и Params.
  2. При аварийном завершении работы сеанса, скачках питания или сетевых сбоях в момент записи пользовательских настроек возникает несоответствие между заголовком блока и фактической длиной потока данных.
  3. Начиная с версии платформы 8.3.7, компания 1С внедрила строгий контроль целостности внутренней структуры контейнеров при формировании *.dt. Утилита chdbfl.exe проверяет только физические страницы базы и не видит логических ошибок внутри контейнера файлов, поэтому рапортует об отсутствии ошибок, а выгрузка в *.dt падает.

Способ 3. Программная очистка поврежденных пользовательских настроек

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

Для полного удаления сбойных записей настроек напишем и выполним внешнюю обработку со следующим кодом:


ВыборкаПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого ТекПользователь Из ВыборкаПользователей Цикл
    ИмяПользователя = ТекПользователь.Имя;
    
    // Очищаем системные настройки интерфейса и форм
    ХранилищеСистемныхНастроек.Удалить(Неопределено, Неопределено, ИмяПользователя);
    
    // Очищаем общие настройки
    ХранилищеОбщихНастроек.Удалить(Неопределено, Неопределено, ИмяПользователя);
    
    // Очищаем сохраненные настройки отчетов
    ХранилищеПользовательскихНастроекОтчетов.Удалить(Неопределено, Неопределено, ИмяПользователя);
КонецЦикла;

Выполнение данной процедуры очистит битые записи из системных таблиц Files и _SystemSettings, устранив причину блокировки выгрузки.

Способ 4. Временный переход на другую версию платформы или СУБД

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

  1. Выгрузка на платформе без жесткой валидации: Откроем информационную базу в Конфигураторе версии платформы 8.3.6 или 8.2 (если режим совместимости конфигурации позволяет это сделать). Выполним выгрузку в *.dt. Старая платформа сформирует файл без проверки сбойного заголовка.
  2. Загрузка в клиент-серверный вариант (SQL): Загрузим полученный *.dt в пустую базу на MS SQL Server или PostgreSQL. В реляционных СУБД структура таблиц переформируется, а сбойные LOB-поля нормализуются.
  3. Перенос данных через XML: Для полного исключения поврежденных системных таблиц воспользуемся типовой обработкой ВыгрузкаЗагрузкаДанныхXML.epf. Она переносит исключительно прикладные объекты метаданных в чистую базу, оставляя все поврежденные служебные кэши позади.

Особенности резервного копирования и лимиты таблиц 1CD

Разберем важные системные правила, которые необходимо учитывать при сопровождении файловых баз большого объема:

  1. Выгрузка в DT не является бэкапом: Механизм выгрузки в *.dt предназначен исключительно для переноса данных между различными СУБД и создания демонстрационных баз. Резервной копией файловой базы 1С является исключительно прямая копия файла 1Cv8.1CD (или архивная копия, созданная специализированным ПО при остановленных сеансах).
  2. Лимит размера таблицы 4 ГБ: В файловой базе ограничение 4 ГБ действует не на всю базу целиком, а на каждую отдельную таблицу. База может весить 8–20 ГБ, если ни одна из ее таблиц (например, _DocumentJournal, _AccumRg) не превышает 4 ГБ.
  3. Изменение размера страницы утилитой cnvstorage.exe: Начиная с платформы 8.3.8, доступна утилита cnvstorage.exe. С ее помощью можно увеличить размер страницы базы данных с 4 КБ до 8, 16, 32 или 64 КБ, что позволяет поднять максимальный объем отдельной таблицы до 64 ГБ.
← На главную