Работа с большими базами данных в 1С:Предприятие часто требует контроля за объемом хранимых данных. Один из ключевых вопросов — как узнать размер таблиц в базе 1С, чтобы оптимизировать производительность, выявить "раздутые" объекты или спланировать миграцию. Эта задача актуальна как для администраторов, так и для разработчиков, которые сталкиваются с замедлением работы системы или необходимостью архивирования.
В зависимости от конфигурации (файловый или клиент-серверный режим) и используемой СУБД (Microsoft SQL Server, PostgreSQL), методы анализа размера таблиц будут отличаться. В этой статье мы разберем пять проверенных способов, включая SQL-запросы, встроенные отчеты 1С и сторонние утилиты, с учетом особенностей разных версий платформы (8.3 и выше).
Особое внимание уделим практическим примерам: от простых запросов для оценки объема до сложных скриптов, которые помогут выявить скрытые зависимости между таблицами. Также рассмотрим типичные ошибки, которые допускают новички при анализе базы, и дадим рекомендации по интерпретации результатов.
1. Почему важно контролировать размер таблиц в 1С
На первый взгляд, мониторинг объема таблиц может показаться рутинной задачей, но на практике он решает несколько критичных проблем:
- 📉 Производительность: таблицы с миллионами записей (например,
Document1000илиAccumulationRegister1234) замедляют выполнение запросов и регламентных операций. Анализ помогает выявить "узкие места" до того, как пользователи начнут жаловаться на тормоза. - 💾 Хранение: в облачных или виртуализированных средах объем базы данных напрямую влияет на стоимость инфраструктуры. Например, в MS Azure SQL тарификация зависит от занимаемого пространства.
- 🔄 Обновления и миграции: перед переходом на новую версию 1С или переносом базы на другой сервер необходимо оценить объем данных, чтобы спланировать время простоя и ресурсы.
- 🛠️ Диагностика ошибок: некоторые сбои (например,
Timeout expiredилиНедостаточно памяти) связаны с переполнением таблиц. Их размер — первый индикатор для поиска причины.
По данным исследований, в 70% случаев замедления работы 1С виноваты именно перегруженные таблицы регистров накопления или документов. При этом даже стандартные отчеты платформы (например, "Анализ использования дискового пространства") не всегда дают полную картину, особенно если база работает на PostgreSQL или использует нетипичные настройки хранения.
2. Способ 1: SQL-запросы для Microsoft SQL Server
Если ваша база 1С работает на MS SQL Server, самый точный способ узнать размер таблиц — использовать системные представления. Ниже приведены запросы, адаптированные под структуру баз 1С, где имена таблиц часто содержат префиксы вроде _1S или v8.
2.1. Запрос для оценки размера всех таблиц
Этот скрипт вернет список таблиц с указанием:
- 📊 Общего размера (включая индексы).
- 📄 Количества строк.
- 📈 Занятого пространства (в МБ).
SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB,
CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
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.is_ms_shipped = 0
AND t.NAME NOT LIKE 'dt%'
AND t.NAME NOT LIKE 'sys%'
AND t.NAME NOT LIKE 'queue%'
GROUP BY
t.Name, s.Name, p.Rows
ORDER BY
TotalSpaceMB DESC;
Обратите внимание на фильтры t.NAME NOT LIKE 'dt%' — они исключают служебные таблицы 1С (например, dtProperties), которые не несут полезной нагрузки для анализа. Результаты отсортированы по убыванию размера, чтобы сразу увидеть самые "тяжелые" таблицы.
2.2. Запрос для конкретной таблицы
Если нужно проверить размер конкретной таблицы (например, Document1000), используйте модифицированный запрос:
EXEC sp_spaceused 'dbo._Document1000';
Эта хранимая процедура вернет:
- 📏 name — имя таблицы.
- 📏 rows — количество строк.
- 📏 reserved — зарезервированное пространство (в КБ).
- 📏 data — пространство, занятое данными.
- 📏 index_size — размер индексов.
- 📏 unused — неиспользуемое пространство.
Если имя таблицы содержит префикс схемы (например, v81.), укажите его явно: EXEC sp_spaceused 'v81._Document1000';. В базах 1С 8.3 часто используется схема v81 или dbo.
2.3. Анализ фрагментации индексов
Размер таблицы — не единственный показатель производительности. Фрагментация индексов может замедлять запросы даже при небольшом объеме данных. Чтобы проверить ее уровень, выполните:
SELECT
OBJECT_NAME(ind.OBJECT_ID) AS TableName,
ind.name AS IndexName,
indexstats.avg_fragmentation_in_percent
FROM
sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') indexstats
INNER JOIN
sys.indexes ind ON ind.object_id = indexstats.object_id AND ind.index_id = indexstats.index_id
WHERE
indexstats.avg_fragmentation_in_percent > 10 -- Порог фрагментации
AND OBJECT_NAME(ind.OBJECT_ID) LIKE '_%' -- Фильтр по таблицам 1С
ORDER BY
indexstats.avg_fragmentation_in_percent DESC;
Если значение avg_fragmentation_in_percent превышает 30%, рекомендуется выполнить реорганизацию или перестроение индекса:
ALTER INDEX [IndexName] ON [Schema].[TableName] REORGANIZE;
Фрагментация выше 30% может увеличивать время выполнения запросов в 2–3 раза, особенно на таблицах с частыми вставками/удалением данных (например, регистры накопления).
3. Способ 2: Анализ для PostgreSQL
Если ваша база 1С работает на PostgreSQL, синтаксис запросов будет иным. Здесь используются системные каталоги pg_class, pg_namespace и pg_total_relation_size.
3.1. Запрос для всех таблиц
SELECT
nspname AS SchemaName,
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_indexes_size(relid)) AS IndexesSize,
n_live_tup AS LiveRows
FROM
pg_class C
LEFT JOIN
pg_namespace N ON (N.oid = C.relnamespace)
WHERE
relkind = 'r' -- Только обычные таблицы
AND nspname NOT IN ('pg_catalog', 'information_schema') -- Исключаем системные схемы
AND relname LIKE '_%' -- Фильтр по таблицам 1С
ORDER BY
pg_total_relation_size(relid) DESC;
Функция pg_size_pretty автоматически преобразует байты в читаемый формат (КБ, МБ, ГБ). Обратите внимание на колонку LiveRows — она показывает количество активных строк, что полезно для оценки "мертвого груза" после массовых удалений.
3.2. Детализация по таблице
Для анализа конкретной таблицы (например, _AccumRg1234) используйте:
SELECT
pg_size_pretty(pg_total_relation_size('"_AccumRg1234"')) AS TotalSize,
pg_size_pretty(pg_relation_size('"_AccumRg1234"')) AS DataSize,
pg_size_pretty(pg_indexes_size('"_AccumRg1234"')) AS IndexesSize;
В PostgreSQL имена таблиц 1С часто заключены в двойные кавычки (например, "_Document1000"), так как содержат символы, недопустимые без экранирования.
Убедитесь, что у вас есть права на чтение системных каталогов|Проверьте версию PostgreSQL (в 9.x и 10.x синтаксис может отличаться)|Используйте \dt в psql для просмотра списка таблиц|Создайте резервную копию перед массовыми операциями с индексами-->
4. Способ 3: Встроенные инструменты 1С
Не всегда есть доступ к SQL-серверу, особенно в облачных решениях или при работе через 1С:Fresh. В таких случаях можно использовать встроенные механизмы платформы.
4.1. Отчет "Анализ использования дискового пространства"
Этот отчет доступен в конфигураторе:
- Откройте конфигуратор 1С в режиме
Администратор. - Перейдите в меню
Администрирование → Поддержка и обслуживание → Анализ использования дискового пространства. - Выберите базу данных и нажмите
Выполнить анализ.
Отчет покажет:
- 📊 Размер таблиц в базах данных (для клиент-серверного варианта).
- 📁 Размер файлов
.1CD(для файлового варианта). - 🗃️ Статистику по объектам метаданных (документы, справочники, регистры).
Минус метода — отсутствие детализации по индексам и невозможность экспорта данных для дальнейшего анализа. Однако это единственный способ для пользователей без доступа к SQL.
4.2. Тестирование и исправление (chdbfl.exe)
Утилита chdbfl.exe (входит в комплект поставки 1С) позволяет проверить целостность базы и получить информацию о размере файлов. Для файлового варианта выполните:
chdbfl.exe /F "C:\Bases\YourBase.1CD" /L "C:\Temp\report.txt"
В отчете (report.txt) будет строка Database size с общим объемом базы. Для клиент-серверного варианта утилита покажет размеры табличных пространств.
Что делать, если chdbfl.exe не находит базу?
Убедитесь, что путь к файлу .1CD указан корректно и база не заблокирована другими сессиями. Если утилита выдает ошибку Файл поврежден, попробуйте запустить ее с ключом /R для восстановления: chdbfl.exe /F "base.1CD" /R.
5. Способ 4: Сторонние утилиты
Для углубленного анализа можно использовать специализированные инструменты:
| Утилита | Поддерживаемые СУБД | Функциональность | Ссылка (поиск) |
|---|---|---|---|
| SQL Server Management Studio (SSMS) | MS SQL | Визуальный анализ размеров, фрагментации, генерация отчетов | Официальный сайт Microsoft |
| pgAdmin | PostgreSQL | Детализация по таблицам, индексам, визуализация занятого пространства | pgadmin.org |
| 1C:Администратор сервера | Любые (через RAS) | Мониторинг производительности, анализ блокировок, размеров временных таблиц | Входит в дистрибутив 1С |
| DBVisualizer | MS SQL, PostgreSQL, Oracle | Кросс-платформенный инструмент с поддержкой кастомных запросов | dbvis.com |
Для MS SQL особенно полезен встроенный в SSMS отчет Disk Usage by Table (доступен через контекстное меню базы данных → Reports → Standard Reports). Он визуализирует распределение пространства по таблицам в виде диаграммы.
В pgAdmin для быстрого анализа используйте контекстное меню таблицы → Properties → Statistics. Здесь отображается размер, количество строк и последняя дата анализа статистики.
6. Способ 5: Анализ в файловом режиме
Если база 1С работает в файловом режиме (без СУБД), размер таблиц определяется косвенно — через анализ файла .1CD. Здесь поможет:
6.1. Утилита 1Cv8.epf (внешняя обработка)
Многие администраторы используют внешние обработки, например, "Анализ базы данных" от Инфостарт. Она позволяет:
- 📊 Посмотреть размеры логических таблиц (документов, справочников).
- 🔍 Выявить "мертвые" ссылки и неиспользуемые объекты.
- 📈 Построить графики роста базы по датам.
Скачать обработку можно на порталах Инфостарт или 1С:ИТС (требуется подписка). После загрузки:
- Откройте 1С в режиме
Конфигуратор. - Перейдите в
Файл → Открыть → Внешняя обработка. - Выберите скачанный файл
.epfи запустите анализ.
6.2. Ручное измерение файла .1CD
Простейший способ — проверить размер файла базы в проводнике Windows. Однако это покажет общий объем, а не размеры отдельных таблиц. Для детализации:
- Создайте резервную копию базы (
.dt). - Откройте файл
.dtв текстовом редакторе (например, Notepad++) и найдите блоки с именами таблиц (например,{Document1000}). - Оцените размер блоков вручную (требует опыта).
Этот метод подходит только для небольших баз и опытных пользователей, так как структура .1CD не документирована и может меняться между версиями платформы.
В файловом режиме точный анализ размеров таблиц невозможен без специализированных инструментов. Ориентируйтесь на общий размер базы и регулярно выполняйте архивацию.
7. Типичные ошибки и как их избежать
При анализе размеров таблиц в 1С даже опытные администраторы допускают ошибки. Вот самые распространенные:
- ❌ Игнорирование временных таблиц: запросы 1С часто создают временные таблицы с префиксом
#или@, которые занимают место. Их нужно учитывать отдельно:SELECT * FROM tempdb.sys.tables; - ❌ Путаница между
reservedиused: в MS SQLreserved— это зарезервированное пространство, аused— фактически занятое. Разница показывает фрагментацию. - ❌ Анализ без учета транзакций: если в базе есть незафиксированные транзакции, размер таблиц может быть занижен. Перед анализом выполните:
CHECKPOINT; - ❌ Использование устаревших скриптов: в PostgreSQL 12+ изменилась структура системных каталогов. Всегда проверяйте совместимость запросов с вашей версией СУБД.
Еще одна частая проблема — неверная интерпретация результатов. Например, большая таблица _AccumRg1234 не всегда означает, что ее нужно чистить. Возможно, это рабочая нагрузка (например, регистр остатков товаров). Всегда сверяйте размеры с бизнес-логикой!
Как понять, что таблица действительно требует оптимизации?
Сравните темпы роста таблицы за последние месяцы (используйте исторические данные из мониторинга). Если объем вырос в 2+ раза без объективных причин (например, сезонный рост данных), это повод для анализа. Также проверьте, есть ли на таблицу жалобы пользователей на медленные отчеты.
8. Практические рекомендации по оптимизации
Выявив крупные таблицы, приступайте к оптимизации. Вот проверенные методы:
8.1. Архивация старых данных
Для документов и регистров с историей более 3–5 лет:
- 🗃️ Настройте регламентное задание по архивации (например, через
ВыгрузкаДанныхXML). - 📂 Перенесите данные в отдельную базу или внешний архив.
- 🔄 Используйте механизм
Планы обменадля синхронизации актуальных данных.
8.2. Перестроение индексов
Для таблиц с высокой фрагментацией (>30%):
-- Для MS SQL:
ALTER INDEX ALL ON [Schema].[TableName] REBUILD;
-- Для PostgreSQL:
REINDEX TABLE "_TableName";
Эту операцию лучше выполнять в нерабочее время, так как она блокирует таблицу.
8.3. Очистка "мусора"
В 1С накапливаются временные данные, которые не удаляются автоматически:
- 🧹 Очистите таблицу
_SessionParams(хранит параметры сессий). - 🗑️ Удалите устаревшие записи из
_DeadLockи_JobLog. - 📋 Проверьте регистры сведений на наличие дублей (используйте отчет
Поиск дублей).
Для массовой очистки используйте скрипт:
DELETE FROM "_SessionParams" WHERE "SessionID" NOT IN (
SELECT "SessionID" FROM "_Sessions" WHERE "Active" = 1
);
Перед массовым удалением данных всегда делайте резервную копию! В 1С для этого подходит утилита 1Cv8.exe /D"BasePath" /DumpIB "Backup.1CD".
FAQ: Частые вопросы
❓ Как узнать размер таблицы в 1С 8.3, если нет доступа к SQL?
Используйте встроенный отчет Анализ использования дискового пространства в конфигураторе (меню Администрирование → Поддержка и обслуживание). Для файлового режима подойдет утилита chdbfl.exe или внешние обработки (например, с Инфостарта).
❓ Почему размер таблицы в SQL и 1С отличается?
В SQL показывается физический размер (включая индексы и служебные данные), а в 1С — логический (только полезная нагрузка). Разница может достигать 30–50% за счет:
- Индексов (занимают ~20–40% от размера таблицы).
- Фрагментации (неиспользуемое пространство после удаления строк).
- Служебных полей (например,
_IDRRef,_Marked).
❓ Можно ли уменьшить размер таблицы без потери данных?
Да, несколько способов:
- Реорганизация индексов (не блокирует таблицу):
ALTER INDEX REORGANIZE. - Сжатие данных (в MS SQL):
ALTER TABLE [TableName] REBUILD WITH (DATA_COMPRESSION = PAGE). - Очистка истории: удаление устаревших записей из регистров накопления.
Сжатие может сократить объем на 40–60%, но требует тестирования на производительность (иногда замедляет запросы).
❓ Как автоматизировать мониторинг размеров таблиц?
Настройте:
- 📅 Регламентное задание в 1С с вызовом внешней обработки анализа.
- 🤖 SQL Agent (для MS SQL) с еженедельным выполнением скрипта и отправкой отчета на email.
- 📊 Grafana + Prometheus для визуализации трендов роста таблиц.
Пример скрипта для автоматического сбора данных:
-- Сохраняем результаты в таблицу для истории
INSERT INTO [dbo].[TableSizeHistory] ([TableName], [SizeMB], [Date])
SELECT
t.NAME AS TableName,
CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS SizeMB,
GETDATE() AS Date
FROM sys.tables t
-- ... (остальная часть запроса из раздела 2.1)
WHERE t.NAME LIKE '_%';
❓ Какие таблицы в 1С обычно занимают больше всего места?
Топ-5 "тяжелых" таблиц в типичных конфигурациях:
_AccumRg{Номер}— регистры накопления (остатки, обороты)._Document{Номер}— документы с большим количеством движений._InformationRegister{Номер}— регистры сведений с историей._ChartOfAccounts— план счетов (если ведется аналитика по субконто)._Catalog{Номер}— справочники с большим количеством реквизитов (например, номенклатура).
В торговле лидерами часто становятся _DocumentСчетФактураВыданный и _AccumRgТоварыНаСкладах.