К статье
Практический материал

Администрирование · 11 мин

Как узнать размер таблиц в базе 1С на SQL

Как узнать размер таблиц в базе 1С на SQL Server и PostgreSQL: готовые запросы, поиск самых больших таблиц, очистка итогов и журналов регистрации.

База 1С на SQL Server или PostgreSQL со временем разрастается: накапливаются документы, движения по регистрам, версии объектов и записи журнала регистрации. Когда свободное место на диске заканчивается или запросы начинают тормозить, первый шаг — выяснить, какие именно таблицы занимают больше всего места. Без этой информации любая чистка превращается в работу вслепую.

Таблицы в базе 1С имеют технические имена вида _Document123, _AccumRg456, _InfoRg789, поэтому по названию не всегда понятно, какому объекту конфигурации они соответствуют. Ниже разобраны готовые запросы для MS SQL Server и PostgreSQL, способы сопоставить технические имена с объектами метаданных и безопасные методы уменьшения самых тяжёлых таблиц.

Зачем контролировать размер таблиц и что именно занимает место

Рост базы почти никогда не бывает равномерным. Обычно 80–90% объёма занимают несколько таблиц: регистры накопления и сведений с большим количеством движений, журнал регистрации, таблицы версирования объектов, вложения и хранилища двоичных данных. Пока вы не знаете конкретных «тяжёлых» таблиц, невозможно решить, что чистить: сворачивать итоги, удалять старые версии объектов или сокращать журнал регистрации.

Важно понимать, что размер таблицы складывается из самих данных, индексов и, в случае MS SQL, нераспределённого (зарезервированного, но не использованного) пространства. Таблица с большим объёмом индексов может требовать не удаления данных, а перестроения индексов. Поэтому полезно смотреть размер данных и индексов раздельно — оба запроса ниже это позволяют.

Регистры накопления и сведенийТаблицы _AccumRg и _InfoRg

Миллионы строк движений по документам за несколько лет

Журнал регистрацииТаблица _EventLog или файлы lgd

При включённом полном протоколировании растёт неограниченно

Версии объектовТаблицы _Versions*

Накапливаются, если включено версионирование без ограничения срока хранения

Вложения и файлыТаблицы хранения двоичных данных

Прикреплённые сканы, фото, печатные формы

Как узнать размер таблиц в MS SQL Server

Для базы 1С на MS SQL Server самый практичный способ — запрос к системным представлениям sys.tables и sys.dm_db_partition_stats. Он выполняется в SQL Server Management Studio (SSMS) в контексте нужной базы и не требует никаких изменений в самой базе — это операция только чтения.

sql
SELECT t.name AS TableName, SUM(p.rows) AS RowCount, CAST(SUM(a.total_pages) <em> 8 / 1024.0 AS DECIMAL(18,2)) AS TotalMB, CAST(SUM(a.used_pages) </em> 8 / 1024.0 AS DECIMAL(18,2)) AS UsedMB 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 TotalMB DESC

Запрос возвращает имя таблицы, количество строк, общий зарезервированный объём и фактически использованный объём в мегабайтах, отсортированные от большего к меньшему. Строки вида _Document234, _AccumRg567 — это и есть таблицы объектов 1С. Если разница между TotalMB и UsedMB велика, таблица содержит много неиспользуемого зарезервированного пространства — его можно вернуть перестроением индексов или shrink при осознанной необходимости.

Альтернатива: отчёт SSMS без запросов

Если запросы писать не хочется, в SSMS есть встроенный отчёт: правый клик по базе → Reports → Standard Reports → Disk Usage by Table. Отчёт показывает те же таблицы с количеством строк и занятым местом. Ограничение — отчёт медленно строится на очень больших базах и не всегда удобен для копирования результатов.

Как узнать размер таблиц в PostgreSQL

Для базы 1С на PostgreSQL используются функции pg_total_relation_size() (таблица вместе с индексами и TOAST-данными) и pg_relation_size() (только данные). Запрос выполняется в pgAdmin или psql.

sql
SELECT relname AS TableName, pg_size_pretty(pg_total_relation_size(c.oid)) AS TotalSize, pg_size_pretty(pg_relation_size(c.oid)) AS DataSize, c.reltuples::bigint AS ApproxRows FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = 'r' AND n.nspname = 'public' ORDER BY pg_total_relation_size(c.oid) DESC LIMIT 30

Запрос выводит 30 самых больших таблиц схемы public с размером в читаемом виде и приблизительным числом строк. Учтите, что reltuples — оценочное значение из статистики, а не точный счёт; для точного числа строк по конкретной таблице нужен SELECT count(*), который на больших таблицах выполняется долго.

Как сопоставить технические имена таблиц с объектами 1С

Получив список тяжёлых таблиц, нужно понять, каким объектам конфигурации они соответствуют. Для этого в 1С есть встроенная функция ПолучитьСтруктуруХраненияБазыДанных(). Она возвращает таблицу значений с колонками «ИмяТаблицыХранения» (техническое имя вроде _AccumRg4231) и «ИмяТаблицы» (имя объекта метаданных, например «РегистрНакопления.Продажи»).

Практический способ — открыть в конфигураторе или в режиме предприятия (при наличии внешней обработки) консоль кода и выгрузить структуру хранения, затем найти в ней нужное техническое имя. Многие готовые обработки «Структура хранения базы данных» делают это наглядно: показывают дерево объектов метаданных с их физическими таблицами и индексами.

Порядок действий от запроса до вывода
  1. 1
    Выполните запрос размера таблиц в SSMS или pgAdmin и сохраните топ-20 таблиц
  2. 2
    В 1С получите структуру хранения через ПолучитьСтруктуруХраненияБазыДанных() или обработку
  3. 3
    Сопоставьте технические имена с объектами метаданных
  4. 4
    Определите природу каждой тяжёлой таблицы: данные, итоги, журнал, версии, вложения
  5. 5
    Выберите безопасный способ уменьшения: штатная свёртка, настройка журнала регистрации, очистка версий
  6. 6
    После чистки повторите запрос и оцените фактическое изменение размера

Что делать с самыми большими таблицами

Действия зависят от типа таблицы. Для регистров накопления с многолетней историей штатный вариант — свёртка базы или установка периода расчёта итогов, чтобы итоги не хранились за ненужные периоды. Для журнала регистрации — сокращение через «Настройка журнала регистрации» с выгрузкой старого периода в файл, либо уменьшение уровня протоколирования. Для версий объектов — ограничение срока хранения версий в настройках версионирования.

Категорически не рекомендуется удалять строки из таблиц 1С напрямую SQL-запросами DELETE. Структура базы 1С включает служебные таблицы, итоги и ссылки между объектами; ручное удаление нарушает целостность и может привести к ошибкам при обновлении конфигурации или к потере данных. Все чистки выполняйте штатными средствами платформы и конфигурации.

Типичные ошибки при анализе размера базы

Типичные ошибки
01
Смотреть только размер файла .mdf — файл данных не уменьшается сам после удаления строк, поэтому его размер не отражает реальную заполненность таблиц
02
Путать размер базы и размер журнала транзакций (.ldf) — раздутый лог решается настройкой модели восстановления и бэкапом лога, а не чисткой таблиц
03
Удалять данные напрямую SQL-запросами — нарушается целостность базы 1С и слетают итоги
04
Делать shrink базы регулярно — это фрагментирует индексы и ухудшает производительность; shrink оправдан только как разовая операция после массовой чистки
05
Чистить без резервной копии — свёртка и сокращение журнала регистрации необратимы

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

Контроль результата и регулярный мониторинг

После чистки повторите запрос размера таблиц и сравните с исходными значениями. Помните про особенности СУБД: в MS SQL освободившееся внутри файла место видно по UsedMB, а возврат места операционной системе требует shrink; в PostgreSQL размер таблицы уменьшится только после VACUUM FULL или pg_repack. Для регулярного контроля полезно сохранять результаты запроса раз в месяц — так видна динамика роста и можно спрогнозировать, когда понадобится расширение диска или очередная чистка.

Контрольные точки

Как проверить результат

Запрос размера таблиц после чистки
Норма

Целевые таблицы заметно уменьшились по UsedMB/TotalSize

Тревожный признак

Размер не изменился — чистка не затронула реальные данные или требуется VACUUM/перестроение индексов

Целостность базы
Норма

Тестирование и исправление в конфигураторе проходит без ошибок

Тревожный признак

Ошибки ссылочной целостности — признак прямого вмешательства в таблицы

Свободное место на диске
Норма

Место освободилось или стабилизировалось

Тревожный признак

Файл базы не уменьшился — место освобождено только внутри файла, shrink не выполнялся

Итог

Что важно запомнить

Размер таблиц определяется запросом к системным представлениям СУБД, технические имена расшифровываются через ПолучитьСтруктуруХраненияБазыДанных(), а уменьшение базы выполняется только штатными средствами 1С после резервного копирования. Прямые DELETE в SQL под запретом.

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

Можно ли узнать размер таблиц прямо из 1С, без доступа к SQL?

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

Почему после удаления документов размер базы не уменьшился?

В MS SQL удалённые строки освобождают место внутри файла данных, но сам файл не сжимается автоматически. В PostgreSQL удалённые строки остаются в таблице до прохода VACUUM. Кроме того, в 1С удаление документа требует сначала пометки, затем штатной операции «Удаление помеченных объектов» — до её выполнения данные физически остаются в таблицах.

Какая таблица обычно самая большая в типовой базе 1С?

Универсального ответа нет: в торговых базах это чаще регистры накопления по товарам и продажам, в бухгалтерских — регистры бухгалтерии и сведений. Нередко лидирует журнал регистрации при включённом подробном протоколировании или таблицы версий объектов. Именно поэтому нужен запрос к конкретной базе, а не предположения.

Безопасно ли делать shrink базы после чистки?

Разовый shrink после масштабной свёртки допустим, но он сильно фрагментирует индексы — после него рекомендуется перестроить индексы. Регулярный или автоматический shrink (autoshrink) включать не стоит: база будет постоянно расти и сжиматься, что ускоряет фрагментацию и даёт лишнюю нагрузку на дисковую подсистему.

Как узнать размер журнала регистрации, если он хранится в файлах?

В файловом формате (каталог с файлами .lgd/.lgp) размер определяется просто по размеру каталога журнала на диске. В новом формате журнал хранится в файле базы SQLite — его размер также виден по файлу. Сокращение выполняется из конфигуратора: Администрирование → Настройка журнала регистрации → Сократить, с возможностью сохранить удаляемый период в отдельный файл.