При работе с базами данных 1С на бесплатной версии MS SQL Server Express администраторы часто сталкиваются с жестким ограничением объема базы в 10 Гб. Одной из самых ресурсоемких частей базы являются таблицы итогов регистров (бухгалтерии или накопления). В ситуации, когда база приближается к критическому порогу, возникает вопрос: можно ли загрузить данные из .dt файла так, чтобы платформа не пыталась сразу рассчитать итоги и не вызвала переполнение дискового пространства СУБД? Разберем эту ситуацию подробно, проанализируем механизмы платформы и найдем рабочие решения.
Для начала проанализируем, как именно платформа 1С:Предприятие 8 выполняет команду «Загрузить информационную базу». Этот процесс является низкоуровневым и строго последовательным. Рассмотрим основные этапы:
.dt создаются пустые таблицы и поля.Важно понимать: в штатном функционале 1С не существует переключателя, который позволил бы загрузить .dt и пропустить этап расчета итогов. Если база вместе с рассчитанными итогами превысит 10 Гб, MS SQL Express вернет ошибку, и вся транзакция загрузки будет откачена. Однако есть обходные пути.
Самый надежный способ загрузить базу из .dt без итогов — это подготовить исходную базу перед созданием файла выгрузки. Если мы программно отключим использование итогов для тяжелых регистров, информация об этом флаге попадет в .dt. При загрузке в новую базу платформа увидит, что итоги отключены, и пропустит этап их формирования.
Рассмотрим, как это сделать программно для регистров бухгалтерии или накопления. Нам понадобится обработка с кодом, который переберет нужные регистры:
// Пример для регистра бухгалтерии
РегистрБух = РегистрыБухгалтерии.Хозрасчетный;
Если РегистрБух.ПолучитьИспользованиеИтогов() Тогда
РегистрБух.УстановитьИспользованиеИтогов(Ложь);
Сообщить("Использование итогов для регистра Хозрасчетный отключено. Таблицы итогов очищены.");
КонецЕсли;
// Пример для регистров накопления (массовое отключение)
Для Каждого МетДанныеРегистра Из Метаданные.РегистрыНакопления Цикл
ИмяРегистра = МетДанныеРегистра.Имя;
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Ложь);
Сообщить("Отключены итоги для: " + ИмяРегистра);
КонецЦикла;
Что это дает: Метод УстановитьИспользованиеИтогов(Ложь) не просто меняет флаг, он физически очищает соответствующие таблицы итогов в СУБД (например, _AccumRgT). После этого размер базы в SQL значительно уменьшится, и выгруженный .dt при загрузке не будет инициировать тяжелые расчеты. После успешного переезда на новый сервер или очистки места итоги можно будет включить обратно за нужный период.
Если база уже «упала» или не дает сделать выгрузку из-за ошибок SQL, проанализируем вариант с временной сменой редакции СУБД. SQL Server Developer Edition функционально идентичен версии Enterprise, но бесплатен для целей разработки и тестирования. В нем нет ограничения в 10 Гб.
Разберем алгоритм действий:
.dt или через средства Backup/Restore SQL на этот сервер.Shrink базы (сжатие файлов), чтобы убедиться, что она теперь «влезает» в 10 Гб..dt и загрузим его обратно на клиентский SQL Express.Существует техническая хитрость, позволяющая временно «обмануть» ограничение SQL Express при расширении файлов. Ограничение в 10 Гб проверяется в момент попытки расширения файла данных (.mdf). Рассмотрим схему действий:
Внимание: Этот метод является нарушением лицензионного соглашения и крайне нестабилен, мы рекомендуем использовать его только как экстренную меру для спасения данных перед миграцией на PostgreSQL.
Если клиент столкнулся с лимитом в 10 Гб, это явный сигнал к переходу на свободную СУБД. Разберем особенности миграции через .dt на PostgreSQL:
.dt в Postgres вы можете не беспокоиться о размере итогов..dt в PostgreSQL обязательно нужно выполнить команду ANALYZE. Платформа 1С при загрузке создает индексы, но планировщик запросов Postgres не будет знать о распределении данных, что приведет к колоссальным тормозам.Если нужно «прожить» на текущем сервере еще какое-то время, проанализируем возможность сжатия данных (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-версию.