Как автоматизировать перенос множества баз данных 1С на новый SQL-сервер со сменой пользователя

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

При масштабной миграции инфраструктуры, когда на сервере СУБД размещено более сотни информационных баз, перенос данных вручную через консоль администрирования кластера 1С (классическую оснастку MMC) становится чрезмерно трудоемким и чреват ошибками. Задача усложняется, если на новом сервере баз данных меняются не только сетевой адрес или имя инстанса СУБД, но и учетная запись пользователя, под которой кластер 1С подключается к базам данных.

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

Почему не работает простое копирование файлов реестра кластера

Файлы описания кластера и зарегистрированных в нем баз данных по умолчанию располагаются в каталоге данных службы агента сервера (каталог srvinfo, путь к которому задается в параметрах запуска службы ragent). За список информационных баз отвечают файлы реестра (например, 1CV8Clst.lst или 1CV8Reg.lst в зависимости от версии платформы и настроек кластера).

Казалось бы, достаточно остановить службу ragent, открыть файл реестра текстовым редактором, выполнить массовую замену старого имени SQL-сервера на новое и поменять имя пользователя. Однако главная трудность возникает с полем пароля. Платформа 1С не хранит пароль пользователя СУБД в открытом виде.

Проанализируем механизм защиты паролей в реестре кластера:

  1. Значение пароля не является простым хэшем (таким как MD5 или SHA-256). Платформа применяет симметричное шифрование с солью (salt), которая жестко привязана к внутреннему уникальному идентификатору (GUID) конкретной информационной базы.
  2. Попытка вручную прописать одну базу через консоль, получить зашифрованную строку пароля и скопировать ее для остальных 100 баз приведет к ошибке: для каждой базы итоговая строка шифра уникальна. При попытке запуска информационной базы кластер не сможет расшифровать пароль и вернет ошибку авторизации в СУБД.
  3. Любые правки файлов реестра напрямую возможны исключительно при полностью остановленной службе агента сервера 1С, так как при штатной остановке служба перезаписывает файлы актуальными данными из оперативной памяти.

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

Решение 1. Автоматизация через утилиту командной строки RAC

Штатным и наиболее гибким платформенным инструментом автоматизации управления кластером без использования COM-технологий является связка из сервиса удаленного администрирования ras и консольной утилиты rac. Данный подход работает как в среде Windows, так и в Linux.

Рассмотрим порядок действий для массового обновления параметров подключения баз:

  1. Убедимся, что на сервере 1С запущена служба администрирования ras (по умолчанию она ожидает подключений на TCP-порту 1545). Если служба не запущена, ее можно стартовать командой ras cluster --port=1545 localhost:1540.
  2. Получим список идентификаторов кластера и всех зарегистрированных информационных баз с помощью утилиты rac.
  3. Запустим пакетный скрипт (например, на PowerShell), который в цикле выполнит команду изменения параметров подключения к СУБД для каждой базы.

Посмотрим на пример команды обновления параметров отдельной базы через rac:


rac infobase --cluster=d3b07384-2a6d-4b8a-9f22-123456789abc update \
    --infobase=e4c18495-3b7e-4c9b-af33-987654321def \
    --db-server="tcp:SQL-SRV-02" \
    --db-name="trade_base" \
    --db-user="app_1c_user" \
    --db-pwd="StrongNewPassword123"

При выполнении команды rac infobase update платформа самостоятельно генерирует корректную зашифрованную последовательность пароля для каждого GUID информационной базы и сохраняет изменения в конфигурацию на лету, не требуя перезапуска службы ragent.

Решение 2. Программное обновление через COM-соединение

Если администрирование выполняется с помощью внешней обработки 1С, задачу можно решить через системный объект V83.COMConnector. Для этого используется программный доступ к агенту сервера 1С.

Разберем по шагам логику работы скрипта или обработки на встроенном языке:

  1. Инициализируем COM-коннектор и устанавливаем соединение с агентом сервера методом ConnectAgent().
  2. Получаем список кластеров, выбираем рабочий кластер и выполняем аутентификацию администратора кластера через метод Authenticate().
  3. Получаем список информационных баз методом GetInfoBases().
  4. Для каждой информационной базы запрашиваем детальное описание методом GetInfoBaseInfo(), модифицируем свойства объекта и применяем новые настройки методом UpdateInfoBase().

Посмотрим на пример кода на встроенном языке 1С:


Соединитель = Новый COMОбъект("V83.COMConnector");
Агент = Соединитель.ConnectAgent("SRV-APP-02");

Кластеры = Агент.GetClusters();
Кластер = Кластеры.Получить(0);

// Аутентификация администратора кластера 1С при необходимости
Агент.Authenticate(Кластер, "AdminCluster", "AdminPassword");

СписокБаз = Агент.GetInfoBases(Кластер);

Для Каждого КраткоеОписаниеИБ Из СписокБаз Цикл
    // Аутентификация в контексте информационной базы (если задана)
    Агент.AuthenticateInfoBase(Кластер, КраткоеОписаниеИБ, "AdminIB", "PassIB");
    
    // Получаем полные параметры информационной базы
    ОписаниеИБ = Агент.GetInfoBaseInfo(Кластер, КраткоеОписаниеИБ);
    
    // Обновляем параметры подключения к СУБД
    ОписаниеИБ.DbServerName = "SQL-SRV-02";
    ОписаниеИБ.DbUser       = "NewSqlUser";
    ОписаниеИБ.DbPassword   = "NewSqlPassword";
    
    // Блокируем сеансы и регламентные задания на время миграции
    ОписаниеИБ.ScheduledJobsDenied = Истина;
    
    // Записываем обновленные настройки
    Агент.UpdateInfoBase(Кластер, ОписаниеИБ);
КонецЦикла;

Важное ограничение: использование V83.COMConnector требует соответствия разрядности клиента и сервера, а также корректно зарегистрированной в операционной системе библиотеки comcntr.dll. Данный способ доступен исключительно в среде Windows.

Решение 3. Использование Windows-аутентификации в MS SQL Server

Один из самых надежных способов решения проблемы с хранением и сменой паролей пользователей СУБД — полный отказ от SQL-аутентификации в пользу встроенной аутентификации Windows (Integrated Security).

Проанализируем, как это реализовать:

  1. Служба сервера 1С:Предприятия (ragent) в операционной системе должна запускаться не от имени системной учетной записи LocalSystem, а от имени выделенного доменного пользователя (например, DOMAIN\usr1cv8).
  2. На новом сервере MS SQL Server создается имя входа (Login) для этой учетной записи Windows — DOMAIN\usr1cv8.
  3. Этому имени входа предоставляются необходимые права: роль уровня сервера dbcreator (если кластер должен сам создавать базы) или назначение пользователя владельцем (db_owner) для всех перенесенных баз данных.
  4. В настройках баз данных кластера 1С поля Пользователь сервера БД и Пароль сервера БД оставляются абсолютно пустыми.

При пустых полях пользователя и пароля процесс рабочих процессов 1С (rphost) подключается к MS SQL Server от имени учетной записи Windows, под которой он запущен. Это полностью устраняет проблему передачи, синхронизации и шифрования паролей в конфигурационных файлах кластера.

Регламент проведения миграции

При единовременном переносе сотни информационных баз критически важно соблюдать правильную последовательность технологических шагов:

  1. Завершение активных сеансов и блокировка входа: перед снятием финальных бэкапов на старом SQL-сервере установите свойство SessionsDenied = Истина и принудительно отключите зависшие соединения. Это исключит модификацию данных в момент резервного копирования.
  2. Блокировка регламентных заданий: обязательно взведите флаг ScheduledJobsDenied = Истина. Если переключить 100 баз на новый сервер без блокировки заданий, сразу после старта они одновременно запустят регламентные процедуры (закрытие месяца, расчет итогов, обновление полнотекстового поиска), что приведет к мгновенной перегрузке дисковой подсистемы и процессора нового SQL-сервера.
  3. Перенос и восстановление данных: выполните скриптовое резервное копирование и восстановление баз на новом экземпляре СУБД.
  4. Пакетное переключение адресов: примените один из описанных выше способов (скрипт с rac или обработку с COMConnector).
  5. Поэтапное включение регламентных заданий: снимайте блокировку заданий группами, контролируя утилизацию ресурсов сервера баз данных.
← На главную