Рано или поздно любой администратор или разработчик 1С сталкивается с проблемой стремительного роста базы данных. Когда дисковое пространство начинает таять, возникает закономерный вопрос: какие именно таблицы занимают больше всего места? Сложность заключается в том, что в СУБД (будь то MS SQL Server или PostgreSQL) таблицы 1С имеют технические имена вида _InfoRg1234 или _Document56, которые мало о чем говорят обычному пользователю. В этой статье мы разберем по шагам, как получить детальную статистику по размерам таблиц и перевести эти данные на «человеческий» язык 1С.
Если ваша база данных работает под управлением Microsoft SQL Server, мы можем получить самую точную информацию о физическом размере данных и индексов напрямую через консоль SQL Server Management Studio (SSMS). Рассмотрим запрос, который собирает данные из системных представлений и выводит количество строк, общий объем, занятое и свободное место для каждой таблицы.
Для выполнения этого анализа откройте SSMS, выберите вашу базу данных и выполните следующий скрипт:
SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN
sys.schemas s ON t.schema_id = s.schema_id
WHERE
t.NAME NOT LIKE 'dt%'
AND t.is_ms_shipped = 0
AND i.OBJECT_ID > 255
GROUP BY
t.Name, s.Name, p.Rows
ORDER BY
TotalSpaceKB DESC
Проанализируем результаты выполнения этого запроса. Колонка TotalSpaceKB покажет нам полный объем, который таблица резервирует на диске. Важно помнить, что 1С активно использует индексы, и зачастую именно они (разница между TotalSpaceKB и UsedSpaceKB для данных) занимают значительную часть места. Если вы видите аномально большие значения в индексах, возможно, базе требуется реиндексация или пересмотр структуры метаданных.
Теперь, когда мы получили список самых «тяжелых» таблиц, нам нужно понять, какому объекту в конфигураторе они соответствуют. Выясним причину, по которой 1С использует такие имена: это необходимо для обеспечения независимости платформы от конкретной СУБД. Чтобы расшифровать эти имена, воспользуемся встроенной функцией платформы 1С — ПолучитьСтруктуруХраненияБазыДанных().
Рассмотрим пример кода, который можно запустить во внешней обработке для получения соответствия:
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого СтрокаСтруктуры Из ТаблицаСтруктуры Цикл
Сообщить("Объект: " + СтрокаСтруктуры.ИмяТаблицы + " -> Таблица в SQL: " + СтрокаСтруктуры.ИмяТаблицыХранения);
КонецЦикла;
Эта функция возвращает таблицу значений, содержащую информацию обо всех таблицах базы данных, включая таблицы итогов, индексы и вспомогательные структуры. На основе этих данных можно создать полноценный отчет, который соединит данные из SQL-запроса (Метод 1) и имена объектов метаданных. Вместо написания такого отчёта можно попробовать обработку обследования базы: она сопоставляет таблицы с объектами после загрузки SQL-статистики. Запрос для MS SQL и работа на 8.3 автором не проверялись.
Если вы работаете в современной конфигурации (например, УТ 11, ERP 2, БП 3.0), которая построена на базе Библиотеки стандартных подсистем (БСП), вам не обязательно писать запросы или использовать внешние обработки. В составе БСП уже есть готовые механизмы для анализа.
Разберем, где их найти:
Этот отчет автоматически выполняет запросы к СУБД и сопоставляет их с объектами метаданных, выводя удобный список с названиями справочников и документов. Важный момент: для работы этого отчета у пользователя 1С, под которым он запускается, могут потребоваться права на просмотр динамических представлений в самом SQL-сервере.
Часто основной объем базы занимают не записи в документах, а присоединенные файлы (сканы, PDF, картинки). Посмотрим на ситуацию глубже: в современных конфигурациях файлы хранятся не в одной общей таблице, а распределены по справочникам вида ПрисоединенныеФайлы для каждого типа объекта.
Проанализируем механизм хранения:
ДвоичныеДанныеФайлов, либо во внешних томах на диске.Если ваша таблица _InfoRg... (соответствующая двоичным данным) является лидером по объему, это явный сигнал к тому, что пора настроить хранение файлов в томах на диске. Это позволит радикально уменьшить размер .mdf файла базы данных и упростить процедуру бэкапа.
Если ваша 1С работает на Linux с СУБД PostgreSQL, синтаксис запросов будет отличаться. Для получения размеров таблиц в этой среде мы будем использовать системные функции pg_relation_size и pg_total_relation_size.
Рассмотрим пример запроса для Postgres:
SELECT
relname AS TableName,
pg_size_pretty(pg_total_relation_size(relid)) AS TotalSize,
pg_size_pretty(pg_relation_size(relid)) AS DataSize,
pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) AS IndexSize
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
Этот запрос выведет список таблиц, отсортированный по убыванию общего объема (включая индексы), в удобном для чтения формате (Мб, Гб).
После того как вы обнаружили «жирные» таблицы, не спешите их очищать. Рассмотрим стандартный порядок действий:
_Chng. Если обмен с каким-то узлом давно не выполнялся, регистрация изменений будет расти бесконечно.Пересчет итогов через Тестирование и исправление может помочь оптимизировать их размер.Shrink, однако делайте это осторожно, так как она вызывает сильную фрагментацию индексов. После сжатия обязательно выполните перестроение индексов (Rebuild).Таким образом, комбинируя прямые SQL-запросы для получения технических данных и механизмы платформы 1С для их интерпретации, мы получаем полный контроль над объемом нашей информационной системы.