Что занимает место в 1Cv8.1CD: три способа найти тяжёлые таблицы
Содержание
Самый быстрый способ посмотреть размер таблиц файловой базы 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 и выше умеет сама считать, сколько занимает каждый объект. Функция ПолучитьРазмерДанныхБазыДанных() работает и в файловом, и в клиент-серверном варианте.
Вызов без параметров вернёт объём всей базы в байтах. Если передать массив полных имён объектов (например, Документ.РеализацияТоваровУслуг), функция вернёт размер данных только этих объектов.
Что понадобится
- Платформа с номером не ниже 8.3.15. Номер смотрите в окне «О программе».
- Пользователь с полными правами (роль администратора).
- Пустая внешняя обработка: создаётся в Конфигураторе через
Файл → Новый… → Внешняя обработка.
Код обработки
В форму обработки добавьте команду «Посчитать» и привяжите к ней этот код. Обработка обходит справочники, документы и регистры, считает размер каждого и выводит двадцать самых крупных объектов.
&НаКлиенте
Процедура Посчитать(Команда)
ПосчитатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПосчитатьНаСервере()
Итог = Новый ТаблицаЗначений;
Итог.Колонки.Добавить("Объект", Новый ОписаниеТипов("Строка"));
Итог.Колонки.Добавить("РазмерМБ", Новый ОписаниеТипов("Число"));
Коллекции = Новый Массив;
Коллекции.Добавить(Метаданные.Справочники);
Коллекции.Добавить(Метаданные.Документы);
Коллекции.Добавить(Метаданные.РегистрыСведений);
Коллекции.Добавить(Метаданные.РегистрыНакопления);
Коллекции.Добавить(Метаданные.РегистрыБухгалтерии);
Для Каждого Коллекция Из Коллекции Цикл
Для Каждого ОбъектМД Из Коллекция Цикл
Имена = Новый Массив;
Имена.Добавить(ОбъектМД.ПолноеИмя());
Байт = ПолучитьРазмерДанныхБазыДанных(, Имена);
СтрокаИтога = Итог.Добавить();
СтрокаИтога.Объект = ОбъектМД.ПолноеИмя();
СтрокаИтога.РазмерМБ = Окр(Байт / 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. Рабочую файловую базу при этом не трогают.
Порядок переноса
- В Конфигураторе файловой базы выполните
Администрирование → Выгрузить информационную базу. Получится файл.dt. - На стенде создайте пустую клиент-серверную базу через консоль кластера или окно запуска 1С.
- Откройте её в Конфигураторе и выполните
Администрирование → Загрузить информационную базу, выбрав файл.dt. - Подключитесь к базе средствами СУБД и выполните запрос из подраздела ниже.
Запрос для 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 и протоколами: журналы обмена с банком, ЭДО, загрузки с сайта.
Признаки аномалии
- Служебный регистр больше, чем все документы вместе.
- Табличная часть одного документа весит больше, чем сам вид документа по всей базе.
- Таблица с данными за прошлые годы растёт, хотя в те периоды никто не работает .
- Общий размер по функции платформы заметно меньше размера файла. Разница — это пустые страницы внутри
1Cv8.1CD.
Последний пункт особенно полезен. Если функция показала 6 ГБ, а файл весит 15 ГБ, больше половины — пустое место. Здесь поможет сжатие, а чистка данных почти ничего не даст.
Как уменьшить размер файловой базы после анализа
Порядок важен: сначала убрать лишние данные, затем сжать файл. Иначе сжатие придётся повторять.
Все операции ниже требуют, чтобы в базе не было пользователей. Предупредите коллег заранее и выполняйте их вне рабочего времени. Перед началом сделайте копию каталога базы или выгрузку в .dt.
Шаг 1. Убрать лишние данные
- 🧹 Версии объектов: в типовых конфигурациях на БСП в разделе
Администрирование → Общие настройкиесть настройки версионирования. Там можно отключить его для лишних объектов и очистить устаревшие версии. - 📁 Файлы: в том же разделе можно перевести хранение присоединённых файлов в тома на диске. Тогда содержимое переедет из базы в папку на сервере.
- 🔄 Обмены: удалите неиспользуемые узлы через настройку синхронизации данных. Регистрация изменений по ним уйдёт вместе с узлом.
- 💾 CONFIGSAVE: в Конфигураторе либо обновите конфигурацию базы, либо верните конфигурацию к конфигурации базы данных.
- 🗑 Помеченные на удаление: удалите их обработкой «Удаление помеченных объектов» в разделе
Администрирование → Обслуживание.
Шаг 2. Сжать файл
- Откройте базу в Конфигураторе.
- Выберите
Администрирование → Тестирование и исправление. - Отметьте флажок «Сжатие таблиц информационной базы». Остальные проверки для этой задачи не нужны.
- Нажмите «Выполнить» и дождитесь окончания.
Второй путь — выгрузить базу
в .dt и загрузить обратно в новый пустой каталог. Файл собирается заново, без пустых страниц. На больших базах это часто быстрее, а заодно проверяет, что выгрузка вообще читается.
Сколько ждать результата
На базе в 15 ГБ, где 8 ГБ — пустые страницы, после сжатия разумно ожидать файл около 7–8 ГБ. Если после чистки и сжатия размер почти не изменился, значит данные действительно нужные. Тогда пора думать о свёртке базы или переходе на клиент-серверный вариант.
Частые вопросы
Можно ли посмотреть размер таблиц файловой базы без Конфигуратора?
ПолучитьРазмерДанныхБазыДанных() можно открыть прямо в режиме 1С:Предприятие через Файл → Открыть. Нужны права администратора и разрешение на открытие внешних обработок.Почему функция показала меньше, чем весит файл 1Cv8.1CD?
Входит ли журнал регистрации в размер базы?
1Cv8Log рядом с файлом базы. Его объём уменьшают настройкой срока хранения и сокращением журнала в Конфигураторе.Безопасно ли сжатие таблиц для рабочей базы?
Что делать, если платформа старше 8.3.15?
ПолучитьСтруктуруХраненияБазыДанных(): она есть и в ранних релизах 8.3.