Что делать, если база 1С на SQL Express превысила лимит 10 ГБ и как найти тяжелые таблицы

Системный администратор 1С v8.3 (Управляемые формы)
← На главную

Работа с бесплатной версией MS SQL Server Express накладывает на администраторов 1С существенное ограничение: размер одного файла базы данных (MDF) не может превышать 10 ГБ. Как только этот порог достигается, СУБД блокирует любые операции записи, что приводит к остановке работы пользователей. В этой статье мы разберем, как детально проанализировать структуру хранения данных, выявить "виновников" разрастания базы и вернуть систему в рабочее состояние.

Разбираемся с ограничениями SQL Express

Прежде чем приступать к очистке, нам необходимо четко понимать, как работают лимиты SQL Express. Рассмотрим основные нюансы:

  1. Ограничение файла данных: Лимит в 10 ГБ относится исключительно к файлу .mdf. Файлы логов транзакций (.ldf) могут быть значительно больше, и они не вызывают блокировку по лимиту Express-издания.
  2. Индексы и данные: В общий объем входят не только сами записи таблиц, но и их индексы. Иногда индексы могут занимать до 40–50% общего объема таблицы.
  3. Механизм FILESTREAM: Если ваша конфигурация настроена на хранение двоичных данных (сканов, документов) во внешних томах через FILESTREAM, эти данные не учитываются в лимите 10 ГБ. Это один из способов «обмануть» ограничение, вынося тяжелый контент за пределы базы.

Шаг 1: Идентификация тяжелых таблиц в SQL Management Studio

Когда база «встала», первым делом выясним, какая именно таблица занимает больше всего места. Мы не будем гадать, а воспользуемся встроенными инструментами SQL Server Management Studio (SSMS). Проанализируем ситуацию с помощью стандартного отчета.

Разберем последовательность действий:

  1. Откройте SSMS и подключитесь к вашему серверу.
  2. Нажмите правой кнопкой мыши на нужную базу данных.
  3. Выберите пункт Отчеты (Reports) -> Стандартные отчеты (Standard Reports) -> Использование дисковой памяти таблицами (Disk Usage by Table).

В открывшемся отчете мы увидим список всех таблиц. Особое внимание уделим колонке «Зарезервировано» (Reserved) и «Данные» (Data). Например, если мы видим таблицу с именем dbo._InfoRg24424, занимающую около 7 ГБ, это явный кандидат на очистку.

Шаг 2: Как сопоставить имя таблицы SQL с объектом 1С

Имена таблиц в SQL (например, _InfoRg24424 или _Document155) мало что говорят обычному пользователю. Нам нужно понять, какой объект метаданных за ними скрывается. Проанализируем способы сопоставления:

Способ А: Программный метод (универсальный)

Мы можем использовать встроенную функцию платформы ПолучитьСтруктуруХраненияБазыДанных(). Рассмотрим пример кода, который можно запустить в обработке или консоли кода:


СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из СтруктураХранения Цикл
    Если Таблица.ИмяТаблицыХранения = "_InfoRg24424" Тогда
        Сообщить("Имя объекта в 1С: " + Таблица.ИмяТаблицы);
        Сообщить("Метаданные: " + Таблица.Метаданные);
    КонецЕсли;
КонецЦикла;

Способ Б: Использование префиксов

Зная префиксы, можно быстро сориентироваться в типе объекта:

Шаг 3: Проблема версионирования объектов

Как показывает практика, чаще всего в «раздувании» базы виноват регистр «Версии объектов» (или «История данных»). В SQL он часто выглядит как тяжелый _InfoRg. Рассмотрим, почему это происходит.

Версионирование сохраняет копию объекта при каждом его изменении. Если в расширении или основной конфигурации включено версионирование для часто изменяемых документов, таблица вырастет до гигантских размеров за считанные месяцы. Выясним причину: в нашем примере таблица содержит более 2 миллионов записей, что для SQL Express является критическим объемом.

Шаг 4: Безопасная очистка данных

Просто удалить записи из 1С может быть недостаточно, а иногда и невозможно из-за нехватки места для лога транзакций. Разберем правильный алгоритм:

  1. Настройка модели восстановления: Перед массовым удалением переведите базу в режим Simple (Простая). Это позволит SQL серверу не накапливать гигантский лог транзакций.

    Клик правой кнопкой на БД -> Properties -> Options -> Recovery Model: Simple.

  2. Удаление через 1С: Перейдите в раздел Администрирование — Общие настройки — История изменений. Настройте расписание очистки и нажмите «Очистить сейчас».
  3. Порционное удаление: Если стандартная очистка зависает, лучше использовать регламентное задание Очистка устаревших версий объектов, предварительно установив срок хранения (например, «За последний месяц»).

Шаг 5: Сжатие базы данных (Shrink)

Важный момент: после удаления данных из таблиц размер файла .mdf на диске не уменьшится автоматически. SQL Server просто пометит это место как «свободное внутри файла». Чтобы операционная система увидела освободившееся место и лимит 10 ГБ перестал быть критическим, необходимо выполнить сжатие.

Рассмотрим, как выполнить Shrink правильно:

  1. В SSMS нажмите правой кнопкой на базу.
  2. Выберите Задачи (Tasks) -> Сжать (Shrink) -> База данных (Database).
  3. В появившемся окне нажмите «ОК».

Важно: Не злоупотребляйте сжатием в обычное время, так как это вызывает сильную фрагментацию индексов. Используйте его только как экстренную меру при достижении лимитов SQL Express.

Профилактика повторения проблемы

Чтобы база снова не «вылетела» за пределы 10 ГБ, проанализируем следующие рекомендации:

Таким образом, системный подход к мониторингу размеров таблиц и своевременная очистка технических данных (логов, версий, кэшей) позволяют успешно эксплуатировать даже крупные базы 1С на бесплатном SQL Server Express.

← На главную