Как программно управлять базами данных в кластере 1С через сервис RAS без использования COM

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

В современных реалиях администрирования систем на базе «1С:Предприятие» использование устаревшей технологии COM-соединения становится всё более проблематичным. Это связано как с переходом на 64-битные системы, так и с необходимостью кроссплатформенного управления серверами. Основным инструментом для решения этих задач сегодня является связка RAS (Remote Administration Service) и RAC (Remote Administration Console). В этой статье мы подробно разберем, как программно взаимодействовать с реестром кластера, создавать и обновлять информационные базы, а также управлять сеансами, используя встроенные средства платформы и внешние утилиты.

Архитектура взаимодействия через RAS/RAC

Прежде чем переходить к коду, проанализируем архитектуру решения. Сервис ras является посредником между вашим программным кодом и агентом сервера ragent. Он слушает определенный порт (по умолчанию 1545) и принимает команды по проприетарному протоколу. Утилита rac — это консольный клиент, который умеет общаться с ras. Начиная с версии платформы 8.3.14, встроенный язык 1С получил прямые объекты для работы с этим сервисом, что избавляет нас от необходимости регистрировать DLL или использовать COM-объекты.

Способ 1: Использование встроенных объектов 1С (версия 8.3.14 и выше)

Рассмотрим наиболее современный и «чистый» способ — использование объекта АдминистрированиеСервера. Этот метод позволяет работать с кластером непосредственно из кода 1С (например, из обработки или фонового задания). Для работы этого кода необходимо, чтобы на сервере был запущен процесс ras.

Разберем по шагам процесс получения списка информационных баз:


&НаСервере
Процедура ПолучитьСписокБазНаСервере()
    // Указываем адрес сервера RAS и порт
    Агент = Новый АдминистрированиеСервера("localhost", "1545");
    
    // Выполняем аутентификацию (если на уровне кластера заданы администраторы)
    // Если администраторов нет, метод вызывается без параметров
    Агент.ВыполнитьАутентификацию();
    
    // Получаем массив кластеров, зарегистрированных на данном сервере
    Кластеры = Агент.ПолучитьКластеры();
    
    Для Каждого Кластер Из Кластеры Цикл
        // Для каждого кластера получаем интерфейс администрирования
        АдминистрированиеКластера = Кластер;
        АдминистрированиеКластера.ВыполнитьАутентификацию();
        
        // Получаем список информационных баз
        Базы = АдминистрированиеКластера.ПолучитьИнформационныеБазы();
        
        Для Каждого База Из Базы Цикл
            Сообщить("Найдена база: " + База.Имя + " на сервере БД: " + База.СерверБазыДанных);
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Важный нюанс: если ваша платформа ниже версии 8.3.14, попытка создать объект АдминистрированиеСервера вызовет ошибку «Тип не определен». В этом случае необходимо либо обновить платформу, либо использовать способы, описанные ниже.

Программное создание информационной базы

Одной из самых частых задач является автоматическое создание базы в кластере. Для этого мы используем метод СоздатьИнформационнуюБазу. Выясним, какие параметры для этого необходимы. Нам потребуется заполнить свойства объекта ИнформационнаяБазаОболочка.


// Пример создания базы
НоваяБаза = АдминистрированиеКластера.СоздатьОбъектИнформационнаяБаза();
НоваяБаза.Имя = "New_Accounting_Base";
НоваяБаза.Описание = "База создана автоматически";
НоваяБаза.СУБД = "PostgreSQL"; // Или "MSSQLServer"
НоваяБаза.СерверБазыДанных = "db_server_name";
НоваяБаза.ИмяБазыДанных = "db_name_on_sql";
НоваяБаза.ПользовательБазыДанных = "postgres";
НоваяБаза.ПарольПользователяБазыДанных = "secure_password";
НоваяБаза.СоздатьБазуДанных = Истина; // Платформа сама создаст базу на SQL-сервере

// Режим создания: Создать (физически на СУБД) или Зарегистрировать (только в кластере)
Режим = РежимСозданияИнформационнойБазы.Создать;
АдминистрированиеКластера.СоздатьИнформационнуюБазу(НоваяБаза, Режим);

Способ 2: Использование консольной утилиты RAC

Если нам нужно управлять кластером извне (например, через скрипты PowerShell или Python) или если мы используем старую версию платформы, на помощь приходит утилита rac.exe. Она располагается в каталоге bin установленной платформы.

Проанализируем основные команды, которые можно выполнять программно через запуск внешнего приложения:

  1. Просмотр списка кластеров: rac cluster list localhost:1545
  2. Список баз в конкретном кластере: rac infobase --cluster=[ID_кластера] summary list localhost:1545
  3. Блокировка базы: Чтобы программно запретить вход пользователям, мы можем обновить параметры базы:

rac infobase update --infobase=[ID_базы] --sessions-deny=on --permission-code=123 --cluster=[ID_кластера] localhost:1545

Совет для автоматизации: В новых версиях платформы утилита поддерживает параметр --format=json. Это позволяет получать результат выполнения команды в структурированном виде, который легко парсится любым современным языком программирования, включая 1С (через ЧтениеJSON).

Способ 3: Библиотека irac для OneScript

Для тех, кто предпочитает писать скрипты автоматизации на языке 1С, но вне контекста тяжелой конфигурации, существует проект OneScript. Библиотека irac представляет собой мощную обертку над rac.exe. Она позволяет оперировать объектами «Кластер», «ИнформационнаяБаза» и «Сеанс» без необходимости вручную парсить текстовые строки вывода консоли.

Пример логики на OneScript с использованием irac:


// Подключаем библиотеку
#Использовать irac

АдресСервиса = "localhost:1545";
Менеджер = Новый МенеджерRAC(АдресСервиса);
Кластер = Менеджер.ПолучитьКластеры()[0];
Менеджер.УстановитьТекущийКластер(Кластер.ID);

Базы = Менеджер.ПолучитьИнформационныеБазы();
Для Каждого База Из Базы Цикл
    Если База.Name = "TestDB" Тогда
        Сообщить("Удаляем тестовую базу...");
        Менеджер.УдалитьИнформационнуюБазу(База.ID, РежимУдаленияИнформационнойБазы.ОставитьВБД);
    КонецЕсли;
КонецЦикла;

Разграничение прав и управление пользователями

Важно понимать принципиальное различие: через RAS/RAC мы управляем реестром кластера, а не содержимым базы.

Что МОЖНО сделать через RAS:

Чего НЕЛЬЗЯ сделать через RAS:

Для управления пользователями внутри информационной базы (назначение прав, ролей) без использования COM-соединения следует использовать OData (Universal HTTP REST API) или собственные HTTP-сервисы, опубликованные в конкретной базе. Это единственный надежный способ «достучаться» до внутренней логики конфигурации без прямой привязки к Windows-технологиям.

Безопасность и хранение паролей

Рассмотрим вопрос безопасности. При программном вызове rac.exe пароли часто передаются в открытом виде как аргументы командной строки. Проанализируем, как этого избежать:

  1. Использование переменных окружения: Платформа позволяет считывать некоторые параметры из окружения ОС.
  2. Файлы ответов: В некоторых случаях можно перенаправлять ввод пароля из защищенного временного файла.
  3. Встроенные объекты: Использование АдминистрированиеСервера внутри 1С является наиболее безопасным, так как пароли передаются в рамках сессии защищенного протокола взаимодействия с RAS.

Резюмируя, переход на программное управление через RAS делает вашу систему администрирования более гибкой и готовой к работе в Linux-окружении, полностью избавляя от проблем, связанных с настройкой DCOM и регистрацией библиотек comcntr.

← На главную