Что занимает место в 1Cv8.1CD: три способа найти тяжёлые таблицы

· 9 мин

Содержание

Самый быстрый способ посмотреть размер таблиц файловой базы 1С — вызвать функцию платформы ПолучитьРазмерДанныхБазыДанных() для каждого объекта метаданных из внешней обработки. Она есть в платформе 8.3.15 и новее, работает в файловом режиме и возвращает объём в байтах. Если платформа старше или нужна разбивка до физических таблиц и индексов, копию базы переносят в MS SQL или PostgreSQL и смотрят размеры средствами СУБД.

Типичная ситуация: файл 1Cv8.1CD за год вырос с 3 до 18 ГБ, база открывается по минуте, а копия не помещается на флешку. Общий размер файла виден в проводнике, но он не говорит, что именно разрослось: документы, файлы-вложения или служебные регистры.

Как устроен файл 1Cv8.1CD и почему его размер ничего не объясняет

Файловая база — это один файл 1Cv8.1CD в каталоге базы. Внутри он разбит на страницы фиксированного размера, а из страниц собраны таблицы. Снаружи их не видно, поэтому проводник показывает только общий объём.

У каждой таблицы внутри файла три части:

  • 📄 записи — строки с полями фиксированной длины;
  • 📦 BLOB-данные — строки неограниченной длины и ХранилищеЗначения (файлы, картинки, XML-пакеты);
  • 🔎 индексы — для быстрого поиска и отборов.

Таблицы называются не по-русски, а по служебным именам. Каждому объекту конфигурации соответствует одна или несколько таблиц:

Объект конфигурацииПример имени таблицы
Справочник_Reference125
Документ_Document312
Табличная часть документа_Document312_VT4508
Регистр сведений_InfoRg8841
Регистр накопления (движения)_AccumRg9012
Итоги регистра накопления_AccumRgT9025
Регистрация изменений для обмена_DocumentChngR…, _ReferenceChngR…

Кроме таблиц данных в файле лежат служебные: CONFIG (конфигурация базы), CONFIGSAVE (сохранённая, но ещё не применённая конфигурация), PARAMS, DBSCHEMA, V8USERS (список пользователей).

Журнал регистрации в 1Cv8.1CD не входит. Он хранится рядом, в подкаталоге 1Cv8Log. Если «тяжёлый» весь каталог базы, а сам файл небольшой, сначала проверьте размер этой папки.

Ещё одна особенность: после удаления данных файл сам не уменьшается. Освободившиеся страницы остаются внутри и используются под новые записи. Поэтому большой файл не всегда означает много данных — иногда это пустое место, которое уйдёт после сжатия.

Способ 1. Размер таблиц базы встроенной функцией платформы

Платформа 8.3.15 и выше умеет сама считать, сколько занимает каждый объект. Функция ПолучитьРазмерДанныхБазыДанных() работает и в файловом, и в клиент-серверном варианте.

Вызов без параметров вернёт объём всей базы в байтах. Если передать массив полных имён объектов (например, Документ.РеализацияТоваровУслуг), функция вернёт размер данных только этих объектов.

Что понадобится

  1. Платформа с номером не ниже 8.3.15. Номер смотрите в окне «О программе».
  2. Пользователь с полными правами (роль администратора).
  3. Пустая внешняя обработка: создаётся в Конфигураторе через Файл → Новый… → Внешняя обработка.

Код обработки

В форму обработки добавьте команду «Посчитать» и привяжите к ней этот код. Обработка обходит справочники, документы и регистры, считает размер каждого и выводит двадцать самых крупных объектов.

&НаКлиенте
Процедура Посчитать(Команда)
    ПосчитатьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПосчитатьНаСервере()

    Итог = Новый ТаблицаЗначений;
    Итог.Колонки.Добавить("Объект", Новый ОписаниеТипов("Строка"));
    Итог.Колонки.Добавить("РазмерМБ", Новый ОписаниеТипов("Число"));

    Коллекции = Новый Массив;
    Коллекции.Добавить(Метаданные.Справочники);
    Коллекции.Добавить(Метаданные.Документы);
    Коллекции.Добавить(Метаданные.РегистрыСведений);
    Коллекции.Добавить(Метаданные.РегистрыНакопления);
    Коллекции.Добавить(Метаданные.РегистрыБухгалтерии);

    Для Каждого Коллекция Из Коллекции Цикл
        Для Каждого ОбъектМД Из Коллекция Цикл
            Имена = Новый Массив;
            Имена.Добавить(ОбъектМД.ПолноеИмя());
            Байт = ПолучитьРазмерДанныхБазыДанных(, Имена);
            СтрокаИтога = Итог.Добавить();
            СтрокаИтога.Объект = ОбъектМД.ПолноеИмя();
            СтрокаИтога.РазмерМБ = Окр(Байт / 1024 / 1024, 1);
        КонецЦикла;
    КонецЦикла;

    Итог.Сортировать("РазмерМБ Убыв");

    ВсегоМБ = Окр(ПолучитьРазмерДанныхБазыДанных() / 1024 / 1024, 1);
    Сообщить(СтрШаблон("Вся база: %1 МБ", Формат(ВсегоМБ, "ЧДЦ=1; ЧГ=0")));

    Граница = Мин(20, Итог.Количество());
    Для Индекс = 0 По Граница - 1 Цикл
        СтрокаИтога = Итог[Индекс];
        Сообщить(СтрШаблон("%1 — %2 МБ",
            СтрокаИтога.Объект,
            Формат(СтрокаИтога.РазмерМБ, "ЧДЦ=1; ЧН=0; ЧГ=0")));
    КонецЦикла;

КонецПроцедуры

Сохраните обработку и откройте её в режиме 1С:Предприятие через Файл → Открыть. На базе в 10–20 ГБ подсчёт идёт от нескольких секунд до пары минут.

Таблица значений не передаётся на клиент, поэтому весь подсчёт и вывод сообщений сделан в серверной процедуре. Если переделываете код, не возвращайте Итог в клиентскую процедуру — будет ошибка.

Как сопоставить объект с физической таблицей

Иногда нужна обратная связь: в утилите или логе видно имя _InfoRg8841, а что это за регистр — неизвестно. Для этого есть функция ПолучитьСтруктуруХраненияБазыДанных(). Она возвращает таблицу значений с колонками ИмяТаблицыХранения, ИмяТаблицы, Метаданные и Назначение.

Структура = ПолучитьСтруктуруХраненияБазыДанных();
Найдено = Структура.НайтиСтроки(Новый Структура("ИмяТаблицыХранения", "_InfoRg8841"));
Для Каждого Стр Из Найдено Цикл
    Сообщить(СтрШаблон("%1 (%2)", Стр.ИмяТаблицы, Стр.Назначение));
КонецЦикла;

Этот же код можно выполнить в серверной процедуре той же обработки. Функция доступна и в старых релизах 8.3, поэтому сопоставление имён работает даже там, где подсчёта размеров нет.

Способ 2. Размер таблиц через копию базы в MS SQL или PostgreSQL

Встроенная функция показывает размер по объекту целиком. Если нужно отделить данные от индексов или посмотреть каждую табличную часть отдельно, удобнее перенести копию базы в СУБД. Там размеры таблиц смотрятся стандартными запросами.

Нужен тестовый стенд с сервером 1С и MS SQL или PostgreSQL. Рабочую файловую базу при этом не трогают.

Порядок переноса

  1. В Конфигураторе файловой базы выполните Администрирование → Выгрузить информационную базу. Получится файл .dt.
  2. На стенде создайте пустую клиент-серверную базу через консоль кластера или окно запуска 1С.
  3. Откройте её в Конфигураторе и выполните Администрирование → Загрузить информационную базу, выбрав файл .dt.
  4. Подключитесь к базе средствами СУБД и выполните запрос из подраздела ниже.

Запрос для PostgreSQL

SELECT relname AS table_name,
       pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
       pg_size_pretty(pg_indexes_size(relid))        AS index_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 30;

pg_total_relation_size учитывает саму таблицу, индексы и TOAST — область, куда PostgreSQL выносит длинные значения. Именно там окажутся файлы и XML из реквизитов типа ХранилищеЗначения.

Запрос для MS SQL Server

SELECT t.name AS table_name,
       SUM(a.total_pages) * 8 / 1024 AS total_mb,
       SUM(a.used_pages)  * 8 / 1024 AS used_mb
FROM sys.tables t
JOIN sys.indexes i          ON t.object_id = i.object_id
JOIN sys.partitions p       ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN sys.allocation_units a ON p.partition_id = a.container_id
GROUP BY t.name
ORDER BY total_mb DESC;

Для одной таблицы проще встроенная процедура: EXEC sp_spaceused '_InfoRg8841'; — она покажет число строк, объём данных и индексов.

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

Способ 3. Сторонние утилиты для анализа файла 1CD

Для чтения 1Cv8.1CD напрямую существуют независимые утилиты. Самая известная — Tool_1CD: она открывает файл базы без запуска 1С, показывает список внутренних таблиц, их поля и записи. Есть и консольный вариант для запуска из скриптов.

Плюс такого подхода — не нужна ни платформа, ни права в базе. Минусы:

  • ❗ утилиты не поддерживаются фирмой 1С, и новые версии формата файла они могут читать с ограничениями;
  • ❗ имена таблиц служебные, расшифровывать их всё равно придётся через ПолучитьСтруктуруХраненияБазыДанных();
  • ❗ запись в файл такой программой может повредить базу.

Открывайте в сторонних утилитах только копию 1Cv8.1CD, никогда рабочий файл. Копию делайте при закрытой базе, когда в ней нет пользователей.

Ещё одна утилита идёт в комплекте с платформой: chdbfl.exe в каталоге bin. Размеры она не показывает, но проверяет физическую целостность файла. Её полезно запустить на копии перед сжатием, о котором ниже.

Какой способ выбрать

СпособКогда подходитОграничения
ПолучитьРазмерДанныхБазыДанных()Платформа 8.3.15+, есть права администратораРазмер по объекту, без разбивки на индексы
Копия в MS SQL / PostgreSQLНужна детализация до таблиц и индексовНужен стенд с сервером 1С и СУБД
Сторонняя утилитаНет доступа в 1С, старая платформаТолько копия файла, возможны проблемы с новыми форматами

Как читать результат и какие таблицы обычно раздувают файловую базу

Здоровая картина: самые крупные — основные документы и регистры по ним. Если на первом месте служебная таблица, которая к учёту отношения не имеет, — это и есть причина роста.

Частые «пожиратели» места

  • 🗂 Версии объектов. Регистр сведений ВерсииОбъектов хранит копию документа при каждой записи. При включённом версионировании и активной работе он легко обгоняет сами документы.
  • 📎 Файлы в базе. Справочники присоединённых файлов (сканы договоров, фото, PDF) хранят содержимое в BLOB. Сотня сканов по 3 МБ — уже 300 МБ.
  • 🔄 Регистрация изменений для обмена. Таблицы с ChngR в имени копятся, если узел обмена давно не забирал данные или удалён неправильно.
  • 💾 CONFIGSAVE. Если в Конфигураторе загрузили конфигурацию, но не обновили базу, рядом с рабочей лежит её полная копия.
  • 📊 Итоги регистров _AccumRgT…. Растут при большом количестве периодов и измерений, особенно если итоги давно не пересчитывали.
  • 📨 Регистры сведений с XML и протоколами: журналы обмена с банком, ЭДО, загрузки с сайта.

Признаки аномалии

  1. Служебный регистр больше, чем все документы вместе.
  2. Табличная часть одного документа весит больше, чем сам вид документа по всей базе.
  3. Таблица с данными за прошлые годы растёт, хотя в те периоды никто не работает .
  4. Общий размер по функции платформы заметно меньше размера файла. Разница — это пустые страницы внутри 1Cv8.1CD.

Последний пункт особенно полезен. Если функция показала 6 ГБ, а файл весит 15 ГБ, больше половины — пустое место. Здесь поможет сжатие, а чистка данных почти ничего не даст.

Как уменьшить размер файловой базы после анализа

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

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

Шаг 1. Убрать лишние данные

  • 🧹 Версии объектов: в типовых конфигурациях на БСП в разделе Администрирование → Общие настройки есть настройки версионирования. Там можно отключить его для лишних объектов и очистить устаревшие версии.
  • 📁 Файлы: в том же разделе можно перевести хранение присоединённых файлов в тома на диске. Тогда содержимое переедет из базы в папку на сервере.
  • 🔄 Обмены: удалите неиспользуемые узлы через настройку синхронизации данных. Регистрация изменений по ним уйдёт вместе с узлом.
  • 💾 CONFIGSAVE: в Конфигураторе либо обновите конфигурацию базы, либо верните конфигурацию к конфигурации базы данных.
  • 🗑 Помеченные на удаление: удалите их обработкой «Удаление помеченных объектов» в разделе Администрирование → Обслуживание.

Шаг 2. Сжать файл

  1. Откройте базу в Конфигураторе.
  2. Выберите Администрирование → Тестирование и исправление.
  3. Отметьте флажок «Сжатие таблиц информационной базы». Остальные проверки для этой задачи не нужны.
  4. Нажмите «Выполнить» и дождитесь окончания.

Второй путь — выгрузить базу в .dt и загрузить обратно в новый пустой каталог. Файл собирается заново, без пустых страниц. На больших базах это часто быстрее, а заодно проверяет, что выгрузка вообще читается.

Сколько ждать результата

На базе в 15 ГБ, где 8 ГБ — пустые страницы, после сжатия разумно ожидать файл около 7–8 ГБ. Если после чистки и сжатия размер почти не изменился, значит данные действительно нужные. Тогда пора думать о свёртке базы или переходе на клиент-серверный вариант.

Частые вопросы

Можно ли посмотреть размер таблиц файловой базы без Конфигуратора?
Да. Внешнюю обработку с функцией ПолучитьРазмерДанныхБазыДанных() можно открыть прямо в режиме 1С:Предприятие через Файл → Открыть. Нужны права администратора и разрешение на открытие внешних обработок.
Почему функция показала меньше, чем весит файл 1Cv8.1CD?
Функция считает только данные. Файл включает ещё пустые страницы после удалений, служебные таблицы и запас под рост. Большая разница — повод сжать базу.
Входит ли журнал регистрации в размер базы?
Нет. Журнал лежит в отдельной папке 1Cv8Log рядом с файлом базы. Его объём уменьшают настройкой срока хранения и сокращением журнала в Конфигураторе.
Безопасно ли сжатие таблиц для рабочей базы?
Операция штатная, но при сбое питания во время сжатия файл может пострадать. Поэтому делают копию до запуска и выполняют сжатие при отсутствии пользователей.
Что делать, если платформа старше 8.3.15?
Используйте перенос копии в MS SQL или PostgreSQL либо стороннюю утилиту на копии файла. Расшифровать имена таблиц поможет ПолучитьСтруктуруХраненияБазыДанных(): она есть и в ранних релизах 8.3.