При администрировании крупной инфраструктуры 1С часто возникает задача автоматической сверки баз, зарегистрированных в кластере серверов 1С, с фактическими базами данных на SQL-сервере. Это необходимо для выявления «сиротских» баз (которые есть в SQL, но удалены из 1С) или ошибочно настроенных подключений. В этой статье мы подробно разберем все доступные инструменты и программные интерфейсы (API) для взаимодействия с сервером 1С.
Наиболее современным и рекомендуемым способом управления кластером является использование серверов администрирования. Разберем эту связку подробнее.
RAS (Remote Administration Service) — это служба (исполняемый файл ras.exe), которая выступает в роли посредника между сервером 1С и внешними запросами. Она предоставляет программный интерфейс для управления кластером. Чтобы начать работу, необходимо запустить эту службу на стороне сервера 1С (по умолчанию используется порт 1545).
RAC (Remote Administration Client) — это консольная утилита (rac.exe), которая обращается к RAS и позволяет выполнять любые действия: создавать базы, удалять сеансы, изменять параметры кластера. Для решения нашей задачи по получению списка баз мы можем использовать следующую команду в командной строке или PowerShell:
rac infobase --cluster=<ID_кластера> summary list
Проанализируем ситуацию: утилита rac выводит текстовые данные, которые легко парсятся скриптами. Мы можем получить такие параметры, как name (имя базы в 1С) и db-name (имя базы в SQL). Это идеальный способ для системных администраторов, так как он не требует наличия установленной платформы 1С на клиенте (нужна только сама утилита rac).
Если задача решается внутри кода 1С или через внешнее Windows-приложение (например, скрипт VBScript или C#), наиболее удобным будет использование COMConnector. Рассмотрим пример кода, который позволяет подключиться к агенту сервера и перебрать все информационные базы.
Для начала создадим объект коннектора и установим соединение с рабочим процессом:
// Создаем объект для работы с сервером
Коннектор = Новый COMОбъект("v83.COMConnector.1");
// Соединяемся с агентом сервера (укажите адрес вашего сервера)
СерверАдрес = "ServerName:1540";
Агент = Коннектор.ConnectAgent(СерверАдрес);
// Получаем кластеры сервера
Кластеры = Агент.GetClusters();
// Обычно используется первый кластер в списке
Кластер = Кластеры.GetValue(0);
// Аутентификация в кластере (если установлены логин/пароль администратора)
Агент.Authenticate(Кластер, "", "");
// Получаем список всех информационных баз
СписокБаз = Агент.GetInfoBases(Кластер);
Теперь проанализируем, как извлечь нужные нам данные для сравнения с SQL. Каждая информационная база в полученном списке является объектом типа IInfoBaseInfo. Нам важны два свойства: dbName (имя базы в СУБД) и DBMS (тип СУБД).
Для Каждого ТекБаза Из СписокБаз Цикл
ИмяВ1С = ТекБаза.Name;
ИмяВSQL = ТекБаза.dbName;
ТипСУБД = ТекБаза.DBMS;
Сообщить("База 1С: " + ИмяВ1С + " соответствует базе SQL: " + ИмяВSQL);
КонецЦикла;
Этот метод позволяет получить полную информацию, включая регламентные задания и текущие подключения, используя дополнительные методы, такие как GetSessions.
Малоизвестный, но крайне мощный инструмент — библиотека администрирования на языке Java. В состав дистрибутива сервера 1С входят JAR-файлы (например, com.1c.v8.administration.jar). Рассмотрим преимущества этого подхода:
Для использования Java API вам потребуется настроить среду исполнения и подключить соответствующие библиотеки из каталога установки платформы. С помощью классов ClusterAdminConnector можно программно выполнять те же действия, что и через RAC, но на уровне полноценного объектно-ориентированного кода.
Если вы хотите писать скрипты на языке 1С, но запускать их вне платформы, воспользуйтесь OneScript. В сообществе разработана отличная библиотека platform-admin, которая инкапсулирует в себе вызовы rac.
Разберем пример того, как это упрощает жизнь. Вам не нужно знать синтаксис командной строки rac, вы работаете с объектами:
// Пример на OneScript с использованием библиотеки platform-admin
Менеджер = Новый МенеджерКластера("localhost:1545");
Менеджер.Авторизоваться("admin", "password");
СписокБаз = Менеджер.ПолучитьИнформационныеБазы();
Для Каждого База Из СписокБаз Цикл
// Сравниваем Имя базы в SQL с массивом имен из SQL-сервера
Если SQLБазы.Найти(База.dbName) = Неопределено Тогда
Сообщить("Внимание: база " + База.Name + " ссылается на отсутствующую базу SQL!");
КонецЕсли;
КонецЦикла;
Выясним, какой метод лучше выбрать в зависимости от ваших задач:
Важный момент по безопасности: Начиная с последних релизов платформы 8.3, при работе через RAS/RAC и COM-соединение, система требует обязательной аутентификации администратора кластера. Если администраторы не заданы, доступ может быть ограничен. Также помните, что для работы v83.COMConnector версия компоненты на сервере и клиенте должна строго совпадать.
Таким образом, полноценное API у сервера 1С существует в нескольких ипостасях, что позволяет гибко решать задачи автоматизации администрирования и сверки данных между 1С и СУБД.