Перенос информационной базы из клиент-серверного варианта (SQL) в файловый (1CD) — задача, с которой часто сталкиваются разработчики при необходимости создать локальную копию для разработки или при оптимизации расходов на лицензии. Однако этот процесс часто прерывается критической ошибкой: «Ошибка DBMS: Превышен максимально допустимый внутренний размер файла». В этой статье мы подробно разберем, почему возникает эта проблема, как найти «виновную» таблицу и какие технические приемы позволят успешно завершить миграцию.
Для начала проанализируем, как устроена файловая база 1С. Файл 1Cv8.1CD является своего рода контейнером, внутри которого хранятся таблицы базы данных. В стандартном режиме (при размере страницы данных 4 Кб) размер одной внутренней таблицы не может превышать 4 Гб. Этот лимит включает в себя не только сами данные, но и индексы к этой таблице.
Начиная с версии платформы 8.3.8, появилась возможность увеличить этот лимит до 6 Гб, выбрав размер страницы 8 Кб. А в более современных версиях (начиная с 8.3.14) при создании базы можно задать размер страницы 16, 32 или 64 Кб, что теоретически позволяет таблицам расти до терабайтных размеров. Ошибка возникает тогда, когда в вашей SQL-базе есть хотя бы одна таблица, объем которой превышает установленный порог для целевого файлового файла.
Прежде чем предпринимать действия по переносу, нам нужно выяснить, какая именно таблица мешает выгрузке. Если у нас есть доступ к SQL Server Management Studio (SSMS), мы можем выполнить специальный запрос, который покажет размер всех таблиц в базе данных. Рассмотрим и проанализируем этот скрипт:
USE [Имя_Вашей_Базы]
GO
SELECT
tab.name AS TableName,
part.rows AS [RowsCount],
CAST(SUM(allocat.total_pages) * 8 / 1024.00 AS numeric(20,2)) AS TotalMB,
CAST(SUM(allocat.used_pages) * 8 / 1024.00 AS numeric(20,2)) AS UsedMB,
CAST((SUM(allocat.total_pages) - SUM(allocat.used_pages)) * 8 / 1024.00 AS numeric(20,2)) AS UnusedMB
FROM
sys.tables tab
INNER JOIN
sys.indexes idx ON tab.object_id = idx.object_id
INNER JOIN
sys.partitions part ON idx.object_id = part.object_id AND idx.index_id = part.index_id
INNER JOIN
sys.allocation_units allocat ON part.partition_id = allocat.container_id
GROUP BY
tab.name, part.rows
ORDER BY
TotalMB DESC
GO
Этот запрос выведет список таблиц, отсортированный по убыванию их размера в мегабайтах. Обратите внимание на колонку TotalMB. Если значение превышает 4000 (или 6000 для расширенного режима), эта таблица — главная причина ошибки.
SQL-таблицы имеют технические имена, такие как _InfoReg12345 или _Document300. Чтобы понять, какой объект метаданных в конфигураторе соответствует этой таблице, мы воспользуемся встроенным методом 1С ПолучитьСтруктуруХраненияБазыДанных(). Выполните следующий код в любой внешней обработке на стороне SQL-базы:
Структура = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого СтрокаТаблицы Из Структура Цикл
Если СтрокаТаблицы.ИмяТаблицыХранения = "_InfoReg12345" Тогда // Подставьте имя из SQL-запроса
Сообщить("Проблемный объект: " + СтрокаТаблицы.ИмяТаблицы);
КонецЕсли;
КонецЦикла;
Так мы выясним, что именно раздуло базу: история версий объектов, огромный регистр сведений с логами или присоединенные файлы (картинки, видео, PDF).
Рассмотрим основные стратегии, которые помогут нам «втиснуть» базу в файловые рамки:
.dt.Если данные удалить невозможно, воспользуемся технической возможностью платформы. При создании новой файловой базы (куда вы будете загружать .dt), мы можем заранее задать увеличенный размер страницы.
Для этого воспользуемся утилитой CNVDBFL.EXE, которая находится в папке bin установленной платформы 1С. Проанализируем порядок действий:
CNVDBFL.EXE.1Cv8.1CD.После этого попробуйте загрузить ваш .dt файл в эту подготовленную базу. С размером страницы 64 Кб лимит на размер таблицы перестает быть проблемой для большинства информационных баз.
Выясним, какие действия на стороне SQL сервера помогут сделать выгрузку более стабильной. Перед тем как нажать кнопку «Выгрузить информационную базу в файл...», выполните следующие операции:
Сжатие таблиц информационной базы.Shrink (сжатие) базы данных и Rebuild индексов. Это поможет избавиться от фрагментации и «пустых» страниц внутри файлов данных, что иногда критично для корректного формирования .dt.Мы проанализировали ситуацию, когда стандартный перенос базы блокируется СУБД. Помните: файловый вариант — это всегда компромисс. Если ваша база требует использования страниц размером 64 Кб для работы, рассмотрите возможность остаться на клиент-серверном варианте, используя бесплатную версию PostgreSQL. Это избавит вас от рисков повреждения файлового контейнера при внезапном отключении питания и обеспечит гораздо более высокую производительность при тех же объемах данных.