При активной работе с файловой базой 1С:Предприятие (например, популярной конфигурацией 1С:Управление торговлей) пользователи часто сталкиваются с лавинообразным ростом файла 1Cv8.1CD. В определенный момент возникает необходимость выяснить, какие именно объекты метаданных и таблицы занимают больше всего места на диске. Однако при попытке использовать старые проверенные утилиты, такие как Tools_1CD или V8TableSizes.exe, разработчики часто получают критические ошибки: "Неподдерживаемая версия базы 1С" или "Неверная сигнатура в заголовке страницы данных". Для наглядного анализа структуры хранения подойдёт инструмент для построения карты объемов базы 1С.
В этой статье мы подробно разберем, почему старые инструменты перестали работать на современных платформах, проанализируем внутренние изменения структуры баз данных 1С и изучим три надежных способа узнать точный размер таблиц в файловой базе.
Выясним причину, по которой классический софт отказывается открывать современные файлы баз данных. Начиная с версии платформы 8.3.8, разработчики фирмы "1С" существенно модернизировали внутренний формат файловых баз 1Cv8.1CD:
Именно из-за этих архитектурных новшеств старые парсеры файлов баз данных не могут распознать заголовки и аварийно завершают свою работу. Ниже мы детально рассмотрим актуальные и безопасные способы получения структуры хранения и размера таблиц.
Начиная с версии платформы 8.3.15, разработчики добавили мощный встроенный метод для анализа физического объема данных без использования сторонних программ. Метод работает на уровне платформы и доступен как в файловом, так и в серверном вариантах работы. Чтобы не реализовывать алгоритм вручную, можно воспользоваться готовым отчетом для расчета размера таблиц базы данных по метаданным.
Рассмотрим подробнее синтаксис этого метода:
ПолучитьРазмерДанныхБазыДанных(<ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>)
Разберем по шагам, как написать простую внешнюю обработку, которая обойдет метаданные нашей конфигурации и выведет список самых "тяжелых" объектов в наглядную таблицу. Нам потребуется запустить цикл по основным коллекциям метаданных. Обратите внимание, что этот метод может вызывать исключения при анализе некоторых специфических системных объектов или таблиц с включенным разделением данных, поэтому код обязательно нужно оборачивать в конструкцию Попытка — Исключение.
Посмотрим на пример программного кода:
Функция ПолучитьТаблицуРазмеровОбъектов() Экспорт
ТаблицаРезультат = Новый ТаблицаЗначений;
ТаблицаРезультат.Колонки.Добавить("ИмяМетаданных", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("РазмерБайт", Новый ОписаниеТипов("Число"));
ТаблицаРезультат.Колонки.Добавить("РазмерМб", Новый ОписаниеТипов("Число"));
// Зададим интересующие нас коллекции метаданных
МассивКоллекций = Новый Массив;
МассивКоллекций.Добавить("Справочники");
МассивКоллекций.Добавить("Документы");
МассивКоллекций.Добавить("РегистрыСведений");
МассивКоллекций.Добавить("РегистрыНакопления");
МассивКоллекций.Добавить("РегистрыБухгалтерии");
Для Каждого ИмяКоллекции Из МассивКоллекций Цикл
Для Каждого ОбъектМетаданных Из Метаданные[ИмяКоллекции] Цикл
ПолноеИмя = ИмяКоллекции + "." + ОбъектМетаданных.Имя;
Попытка
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ОбъектМетаданных);
// Вызываем встроенный метод платформы
Размер = ПолучитьРазмерДанныхБазыДанных(ОбластьПоискаДанныхБазыДанных.Объекты, МассивОбъектов);
Если Размер > 0 Тогда
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.ИмяМетаданных = ПолноеИмя;
НоваяСтрока.Синоним = ОбъектМетаданных.Синоним;
НоваяСтрока.РазмерБайт = Размер;
НоваяСтрока.РазмерМб = Окр(Размер / 1024 / 1024, 2);
КонецЕсли;
Исключение
// Исключаем аварийную остановку при ошибках доступа к таблицам SDBL
ЗаписьЖурналаРегистрации("АнализРазмераБазы", УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось рассчитать размер для объекта: " + ПолноеИмя + ". Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецЦикла;
// Сортируем таблицу по убыванию размера
ТаблицаРезультат.Сортировать("РазмерБайт Убыв");
Возврат ТаблицаРезультат;
КонецФункции
Важный нюанс этого метода: Метод ПолучитьРазмерДанныхБазыДанных рассчитывает исключительно "чистый" объем физических записей полей (включая табличные части). Он не учитывает индексы таблиц, системные служебные данные платформы и накладные расходы файловой системы. Поэтому итоговая сумма размеров таблиц по этому методу всегда будет меньше реального размера файла 1Cv8.1CD на диске. Для сравнения размеров объектов можно использовать обработку обследования базы: она также показывает число строк табличных частей, но не измеряет размер каждой части отдельно. На платформе 8.3 совместимость автором не проверена.
Если вам требуется детальный низкоуровневый анализ файла базы данных (включая размер индексов и двоичных данных BLOB), следует использовать обновленный софт, умеющий корректно работать с новым форматом страниц:
0.4.0 работает в режиме "только чтение", но при этом безошибочно открывает новые базы формата 8.3.8 и старше. Она позволяет увидеть физический размер каждой таблицы и детально проанализировать ее внутреннюю структуру.1CDLib (написанной по технологии NativeAPI). Данная обработка работает непосредственно внутри сеанса 1С под управлением операционных систем Windows или Linux. Она умеет разбивать размер каждой таблицы на три составляющие: размер самих записей, размер BLOB-полей (хранилищ значений, картинок и файлов) и размер индексов.На некоторых форумах можно встретить совет временно понизить версию формата базы данных до старого формата 8.2.14 с помощью стандартной утилиты конвертации, входящей в комплект платформы, проанализировать базу старыми версиями ПО и вернуть формат обратно.
Схема выглядит следующим образом. Сначала выполняется конвертация в старый формат:
cnvdbfl -c -f 8.2.14 c:\temp\1cv8.1cd
Затем производится анализ старыми утилитами, после чего формат возвращается к современному стандарту:
cnvdbfl -c -f 8.3.8 c:\temp\1cv8.1cd
ВНИМАНИЕ! Этот метод несет огромные риски потери данных:
ВерсииОбъектов или присоединенных файлов) уже превысил 4 Гб, утилита cnvdbfl.exe завершит работу с критической ошибкой "Превышен максимально допустимый размер внутреннего файла", и база данных будет повреждена.Мы проанализировали ситуацию и рекомендуем придерживаться следующих правил при работе с современными файловыми базами:
ПолучитьРазмерДанныхБазыДанных в рамках своей небольшой обработки. Это гарантирует отсутствие конфликтов с лицензированием и полную сохранность данных.1CDLib или найдите проверенную утилиту Tool_1CD версии 0.4.0.cnvdbfl.exe на рабочих базах без предварительного создания резервной копии.