Перенос информационной базы 1С между разными версиями СУБД Microsoft SQL Server часто становится серьезной технической задачей, особенно когда требуется выполнить «даунгрейд» — переход с более новой версии (например, SQL 2017) на более старую (SQL 2012). В этой ситуации стандартные механизмы, такие как создание резервной копии .bak и её восстановление (Restore) или отсоединение и присоединение файлов .mdf/.ldf (Attach/Detach), не работают. Это связано с тем, что Microsoft SQL Server не обладает обратной совместимостью на уровне физических файлов: внутренняя структура страниц данных в версии 2017 отличается от 2012, и старый сервер просто не поймет формат нового файла.
В данной статье мы разберем, как решить эту задачу исключительно средствами SQL Server, минуя стандартную выгрузку 1С в формат .dt, которая на больших базах (от 75 ГБ и выше) может выполняться крайне медленно или приводить к ошибкам нехватки памяти.
Прежде всего, проанализируем техническое ограничение. Каждый выпуск SQL Server имеет свой внутренний номер версии базы данных (Database Internal Version). Когда мы пытаемся выполнить команду RESTORE DATABASE на версии 2012, используя файл, созданный в 2017, система выдает ошибку, сообщая, что версия файла выше версии сервера. Даже если вы установите Compatibility Level (режим совместимости) в значение 110 (соответствует SQL 2012) на исходном сервере 2017, это изменит лишь логику работы оптимизатора запросов и доступность функций T-SQL, но не изменит физический формат хранения данных в .mdf.
Рассмотрим рабочие сценарии, которые позволят нам обойти это ограничение.
Этот способ считается одним из самых надежных для баз среднего объема. Он заключается в создании SQL-запросов, которые сначала воссоздают структуру всех таблиц (схему), а затем наполняют их данными. Разберем этот процесс по шагам:
SQL Server 2012.Schema and data (Схема и данные). По умолчанию там стоит только «Schema», что перенесет пустые таблицы без информации.sqlcmd).После генерации скрипта выполним его на целевом сервере SQL 2012 в предварительно созданной пустой базе. Обратим внимание, что в 1С структура таблиц очень обширна, поэтому выполнение скрипта может занять значительное время.
Технология BACPAC была разработана для миграции баз в облако Azure, но она отлично подходит и для локального даунгрейда. В отличие от обычного бэкапа, .bacpac содержит описание схемы и данные в формате JSON/XML, что делает его независимым от физической версии SQL Server.
Рассмотрим алгоритм действий:
.bacpac.Databases.Важный нюанс: Если в базе 1С используются специфические объекты, которые появились только в версии 2017 (например, полнотекстовые индексы определенного типа), экспорт может прерваться с ошибкой. В этом случае придется временно удалить конфликтующие объекты в исходной базе и создать их заново уже на SQL 2012.
Если база весит десятки и сотни гигабайт, текстовые скрипты могут не подойти. Посмотрим на метод прямой перекачки данных между двумя запущенными серверами. Для этого нам понадобится сетевой доступ между SQL 2017 и SQL 2012.
Cyrillic_General_CI_AS.Этот способ подходит для опытных администраторов и ситуаций, когда простой базы должен быть минимальным (режим 24/7). Проанализируем схему:
Мы можем настроить транзакционную репликацию, где SQL 2017 будет выступать в роли Издателя (Publisher), а SQL 2012 — в роли Подписчика (Subscriber). Данные будут постепенно синхронизироваться. Когда репликация завершится и данные на обоих серверах станут идентичными, мы просто отключаем репликацию, и на SQL 2012 остается полноценная рабочая копия базы. Это позволяет избежать долгого простоя, связанного с копированием 75 ГБ данных «одним куском».
Выясним причины, по которым после переноса база может не сразу заработать в 1С. При использовании SQL-инструментов переноса мы копируем только таблицы и данные, но можем упустить специфические настройки. После успешного разворота базы на SQL 2012 выполним следующие действия:
Config: Если при переносе возникли проблемы с кэшем конфигурации, иногда требуется очистить временные данные, хотя при полном переносе через скрипты это обычно не требуется.
EXEC sp_updatestats;
Это позволит избежать жутких тормозов 1С в первые часы работы.Import/Export Wizard, индексы могли не перенестись. Лучшим решением будет запустить «Тестирование и исправление» в конфигураторе 1С на новой базе с галочкой «Реиндексация таблиц информационной базы».Проанализировав ситуацию, выберем оптимальный путь в зависимости от условий:
1. База до 20-30 ГБ: Оптимально использовать Generate Scripts (Schema and Data).
2. База 70-100 ГБ (наш случай): Лучше использовать BACPAC или комбинацию Generate Scripts (только схема) + Import Wizard (только данные).
3. База более 500 ГБ: Только репликация или все же использование 1С-ного .dt на очень мощном сервере с быстрыми NVMe дисками.
Таким образом, мы выяснили, что перенос базы 1С «вниз» по версии SQL Server возможен и без использования .dt, если грамотно использовать встроенные инструменты трансформации данных СУБД.