Можно ли восстановить базу данных 1С из DT без автоматического расчета итогов

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Механизм загрузки данных из файла .dt

Для начала проанализируем, как именно платформа 1С:Предприятие 8 выполняет команду «Загрузить информационную базу». Этот процесс является низкоуровневым и строго последовательным. Рассмотрим основные этапы:

  1. Очистка целевой базы: Платформа удаляет все существующие таблицы в СУБД.
  2. Создание структуры: На основе метаданных из .dt создаются пустые таблицы и поля.
  3. Загрузка записей: Данные из файла последовательно заливаются в таблицы движений, справочников и документов.
  4. Построение индексов и расчет итогов: Это финальный и самый опасный этап в условиях дефицита места. После загрузки «сырых» данных платформа автоматически запускает пересчет итогов для всех регистров, у которых в метаданных включено использование итогов.

Важно понимать: в штатном функционале 1С не существует переключателя, который позволил бы загрузить .dt и пропустить этап расчета итогов. Если база вместе с рассчитанными итогами превысит 10 Гб, MS SQL Express вернет ошибку, и вся транзакция загрузки будет откачена. Однако есть обходные пути.

Решение 1: Программное отключение итогов перед выгрузкой

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

Рассмотрим, как это сделать программно для регистров бухгалтерии или накопления. Нам понадобится обработка с кодом, который переберет нужные регистры:


// Пример для регистра бухгалтерии
РегистрБух = РегистрыБухгалтерии.Хозрасчетный;
Если РегистрБух.ПолучитьИспользованиеИтогов() Тогда
    РегистрБух.УстановитьИспользованиеИтогов(Ложь);
    Сообщить("Использование итогов для регистра Хозрасчетный отключено. Таблицы итогов очищены.");
КонецЕсли;

// Пример для регистров накопления (массовое отключение)
Для Каждого МетДанныеРегистра Из Метаданные.РегистрыНакопления Цикл
    ИмяРегистра = МетДанныеРегистра.Имя;
    РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Ложь);
    Сообщить("Отключены итоги для: " + ИмяРегистра);
КонецЦикла;

Что это дает: Метод УстановитьИспользованиеИтогов(Ложь) не просто меняет флаг, он физически очищает соответствующие таблицы итогов в СУБД (например, _AccumRgT). После этого размер базы в SQL значительно уменьшится, и выгруженный .dt при загрузке не будет инициировать тяжелые расчеты. После успешного переезда на новый сервер или очистки места итоги можно будет включить обратно за нужный период.

Решение 2: Использование SQL Developer Edition для промежуточных манипуляций

Если база уже «упала» или не дает сделать выгрузку из-за ошибок SQL, проанализируем вариант с временной сменой редакции СУБД. SQL Server Developer Edition функционально идентичен версии Enterprise, но бесплатен для целей разработки и тестирования. В нем нет ограничения в 10 Гб.

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

  1. Установим SQL Server Developer Edition на технический компьютер.
  2. Восстановим базу из .dt или через средства Backup/Restore SQL на этот сервер.
  3. В этой копии базы выполним очистку данных: удалим старые периоды, свернем базу или отключим итоги, как показано в Решении 1.
  4. Выполним Shrink базы (сжатие файлов), чтобы убедиться, что она теперь «влезает» в 10 Гб.
  5. Выгрузим новый .dt и загрузим его обратно на клиентский SQL Express.

Решение 3: Манипуляции с файлами базы данных (для опытных админов)

Существует техническая хитрость, позволяющая временно «обмануть» ограничение SQL Express при расширении файлов. Ограничение в 10 Гб проверяется в момент попытки расширения файла данных (.mdf). Рассмотрим схему действий:

  1. Создадим базу с двумя файлами данных по 10 Гб каждый на сервере, где нет ограничений (или используя хитрости подмены файлов).
  2. Хотя SQL Express увидит суммарный объем более 10 Гб, он может позволить работать с такой базой, если она была подключена (Attach) уже в таком виде, но не потребует немедленного расширения.

Внимание: Этот метод является нарушением лицензионного соглашения и крайне нестабилен, мы рекомендуем использовать его только как экстренную меру для спасения данных перед миграцией на PostgreSQL.

Решение 4: Переход на PostgreSQL

Если клиент столкнулся с лимитом в 10 Гб, это явный сигнал к переходу на свободную СУБД. Разберем особенности миграции через .dt на PostgreSQL:

Практические рекомендации по «выживанию»

Если нужно «прожить» на текущем сервере еще какое-то время, проанализируем возможность сжатия данных (Data Compression). Начиная с версии SQL 2016 SP1, сжатие таблиц и индексов доступно даже в редакции Express.

Хотя в конфигураторе 1С этой настройки нет, мы можем зайти в SQL Management Studio и выполнить сжатие для самых больших таблиц:


-- Пример включения страничного сжатия для таблицы итогов бухгалтерии
ALTER TABLE _AccntRegT123 REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE);

Это может высвободить от 20% до 50% места, что позволит базе функционировать и успешно проходить процесс загрузки из .dt с последующим расчетом итогов. Помните, что при реструктуризации базы из конфигуратора эти настройки могут сброситься, поэтому их нужно контролировать.

Подведем итог: Прямого способа загрузить .dt без итогов «одной кнопкой» нет. Основной стратегией является либо предварительное отключение итогов в исходной базе через УстановитьИспользованиеИтогов(Ложь), либо временное использование более мощной редакции SQL Server для оптимизации данных перед возвратом на Express-версию.

← На главную