Ситуация, когда база данных «1С:Управление торговлей 10.3» (УТ 10.3) разрастается до внушительных размеров (например, 1 Тб), требует системного подхода. Такой объем часто не является следствием реального роста количества хозяйственных операций, а указывает на технические проблемы или неоптимальные настройки хранения данных. Рассмотрим подробно, как проанализировать структуру базы, выявить «пожирателей» места и привести систему в порядок.
Прежде чем приступать к действиям внутри конфигуратора 1С, нам необходимо выяснить, какие именно физические таблицы занимают больше всего места на диске. Поскольку база работает под управлением MS SQL Server, воспользуемся стандартными инструментами этой СУБД. Проанализируем ситуацию с помощью отчета Disk Usage by Top Tables.
Откроем SQL Server Management Studio (SSMS), нажмем правой кнопкой мыши на нашу базу данных и выберем пункт Reports -> Standard Reports -> Disk Usage by Top Tables. Этот отчет покажет нам список таблиц, отсортированных по занимаемому объему. Особое внимание стоит уделить колонкам Data (данные) и Index (индексы).
Если у нас нет возможности использовать графический интерфейс, воспользуемся SQL-запросом для получения детальной информации о размерах таблиц:
SELECT
t.NAME AS TableName,
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
WHERE
t.is_ms_shipped = 0 AND i.object_id > 255
GROUP BY
t.Name, p.Rows
ORDER BY
TotalSpaceKB DESC;
Этот запрос позволит нам увидеть реальную картину. Выясним причину: если в топе находятся таблицы с префиксами _AccumRg, проблема в регистрах накопления; если _InfoRg — в регистрах сведений; если _Document или _Reference — в самих документах или справочниках.
SQL-имена таблиц (например, _InfoRg12345) мало что говорят прикладному программисту. Нам нужно сопоставить их с метаданными. Для этого в платформе предусмотрена функция ПолучитьСтруктуруХраненияБазыДанных(). Также можно воспользоваться готовыми внешними обработками, такими как «Структура хранения БД» из состава инструментов разработчика.
Рассмотрим, как программно получить имя таблицы 1С по ее имени в SQL:
Структура = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из Структура Цикл
Если Таблица.ИмяТаблицыХранения = "_InfoRg12345" Тогда
Сообщить("Это таблица объекта: " + Таблица.Метаданные);
КонецЕсли;
КонецЦикла;
Одной из самых частых причин разрастания УТ 10.3 является включенная подсистема «Версионирование объектов». Если в настройках указано «Хранить историю всегда» для всех документов, то регистр сведений ВерсииОбъектов (в SQL это будет одна из крупнейших таблиц _InfoRg...) может занимать сотни гигабайт. В нем хранятся XML-снимки объектов при каждом их изменении.
Решение: Проанализируем настройки версионирования. Если история за 5 лет не нужна, следует очистить старые записи. Для очистки можно использовать типовые средства подсистемы или написать простую обработку, удаляющую записи из регистра ВерсииОбъектов по определенную дату.
Выясним, не хранятся ли в базе тяжелые вложения. В УТ 10.3 часто используют справочник ХранилищеДополнительной информации. Если пользователи загружают туда сканы договоров в высоком разрешении или даже видеофайлы, база будет расти катастрофически быстро. Данные хранятся в полях типа Image или VarBinary(max).
Решение: Рассмотрим вариант выноса файлов на диск. В современных конфигурациях 1С это штатный функционал, но в старой УТ 10.3 может потребоваться доработка. Мы можем программно выгрузить содержимое хранилища в сетевую папку, а в самой базе оставить только путь к файлу.
Регистры накопления (например, Закупки, Продажи, ОстаткиТоваров) имеют таблицы итогов (префикс _AccumRgT). 1С хранит итоги на конец каждого месяца. Если в регистрах есть «зависшие» остатки (когда по одной аналитике пришло 10 единиц, а ушло 10 единиц по другой, из-за чего общий остаток ноль, но в разрезе измерений записи остаются), таблица итогов начинает раздуваться.
Разберем по шагам, что делать:
_AccumRgT, которые больше не актуальны.Если база участвует в обмене данными (например, с «Бухгалтерией предприятия» или сайтом), проверьте таблицы регистрации изменений (префикс _ChangeRec). Если один из узлов обмена перестал работать, а регистрация для него продолжает копиться, эти таблицы могут вырасти до огромных размеров.
Проанализируем ситуацию: зайдем в Операции -> Планы обмена. Посмотрим на количество зарегистрированных изменений для каждого узла. Если там миллионы записей для узла, который не используется — смело удаляем регистрацию или сам узел.
Иногда «размер базы» — это просто размер файла .mdf, в котором 80% свободного места после удаления старых данных. SQL Server не отдает место операционной системе автоматически.
Рассмотрим технические действия:
SHRINKDATABASE или SHRINKFILE. Но помните: это вызывает сильную фрагментацию индексов.Full Recovery, но бэкап лога не делается, файл .ldf может быть больше файла данных. Установите модель Simple (если это допустимо политикой безопасности) или настройте регулярный бэкап лога.Если после всех манипуляций размер базы остается критическим, единственным радикальным решением для УТ 10.3 остается свертка базы. Это процесс обрезания документов до определенной даты (например, до начала текущего года) с переносом входящих остатков. Это физически удаляет миллионы строк из основных таблиц документов и регистров.
Резюме: Мы проанализировали основные причины роста базы. Начните с отчета по таблицам в SQL, определите «виновника» по метаданным 1С и последовательно применяйте методы очистки: от удаления версий и пересчета итогов до оптимизации хранения файлов. Совместная работа системного администратора и программиста 1С позволит сократить базу в несколько раз без потери производительности.