При разработке скриптов автоматизации, внешних обработок или попытках программного управления кластером 1С программисты часто сталкиваются с досадной ошибкой при инициализации подключения к серверу администрирования. Код падает на вызове конструктора АдминистрированиеСервера, сообщая о невозможности установить соединение. Сегодня мы детально разберем природу этой ошибки, изучим архитектуру взаимодействия компонентов 1С и пошагово настроим службу удаленного администрирования RAS (Remote Administration Service) на серверах под управлением Windows и Linux.
Для начала проанализируем типичный сценарий. Разработчик пытается подключиться к серверу администрирования с помощью следующего программного кода:
Агент = Новый АдминистрированиеСервера("localhost", 2240);
В результате выполнения этой строки платформа выбрасывает исключение:
«Ошибка при вызове конструктора (АдминистрированиеСервера) по причине: Ошибка соединения с сервером»
Главная ошибка здесь кроется в непонимании сетевой архитектуры 1С:Предприятия. Программный объект встроенного языка АдминистрированиеСервера спроектирован так, что он никогда не подключается напрямую к агенту сервера 1С (процессу ragent.exe, работающему по умолчанию на порту 1540) или к менеджеру кластера (процессу rmngr.exe, работающему на порту 1541).
Этот объект взаимодействует исключительно со специальной промежуточной службой — сервером удаленного администрирования (утилита ras.exe). Именно ras.exe выступает в роли связующего шлюза. Он принимает входящие команды от вашего программного кода или стандартной консоли администрирования, транслирует их в кластер 1С по внутренним протоколам и возвращает результат обратно. Если служба RAS не запущена на целевом сервере или настроена на другой порт, вы гарантированно получите ошибку соединения.
Давайте убедимся, запущена ли вообще необходимая нам служба. Для этого откроем оболочку PowerShell и выполним команду проверки состояния служб 1С:
Get-Service -Name 1*
В выводе команды мы можем увидеть, например, запущенный агент сервера 1С, но не увидеть запущенный сервер администрирования. Нам необходимо запустить утилиту ras.exe с правильными параметрами.
По умолчанию служба RAS ожидает входящие подключения на порту 1545. Если ваш кластер 1С работает на стандартных портах, то для запуска утилиты в интерактивном режиме (в консоли командной строки) достаточно перейти в каталог бинарных файлов вашей версии платформы 1С и выполнить команду:
cd "C:\Program Files\1cv8\8.3.14.1565\bin"
ras.exe cluster localhost:1540 --port=1545
Разберем синтаксис этой команды:
cluster — параметр указывает, что мы запускаем сервер администрирования для управления кластером серверов.localhost:1540 — адрес и порт агента сервера (ragent), к которому утилита ras должна подключиться для выполнения команд. Обратите внимание, что если ваш кластер работает на нестандартном порту (например, 2240), то здесь необходимо указать именно его.--port=1545 — порт, который займет сам сервер администрирования RAS. Именно его мы будем указывать в коде 1С при создании объекта АдминистрированиеСервера.После этого изменим наш код в 1С, указав правильный порт службы RAS:
ПараметрыПодключения = "localhost";
ПортRAS = 1545; // Порт, который мы назначили для ras.exe
Агент = Новый АдминистрированиеСервера(ПараметрыПодключения, ПортRAS);
Если служба запущена в консоли, код отработает успешно, подключение установится, и мы сможем управлять сеансами, базами и процессами кластера.
Запуск утилиты ras.exe в интерактивном окне командной строки удобен только для тестов. В реальной эксплуатации нам нужно, чтобы сервер администрирования работал постоянно в фоновом режиме как служба Windows и автоматически стартовал при перезагрузке сервера.
Поскольку исполняемый файл ras.exe не снабжен ключом для саморегистрации в системе (в отличие от ragent.exe с его параметром -instsrvc), мы воспользуемся встроенной утилитой Windows sc.exe.
Важные правила синтаксиса утилиты sc:
=) обязательно должен следовать один пробел. Например: binPath= "..." — правильно, а binPath="..." — вызовет ошибку Windows.Program Files содержит пробелы. Внутри аргументов командной строки эти кавычки экранируются обратным слэшем: \".--service. Без этого параметра служба не сможет вовремя ответить диспетчеру служб Windows о своем запуске, и операционная система принудительно завершит ее процесс по таймауту с ошибкой 1053.Откроем командную строку Windows от имени Администратора и выполним следующую команду для регистрации службы (замените версию платформы 8.3.24.1368 и порты на ваши актуальные значения):
sc create "1C_Enterprise_RAS_1545" binPath= "\"C:\Program Files\1cv8\8.3.24.1368\bin\ras.exe\" cluster --service --port=1545 localhost:1540" start= auto displayname= "Сервер администрирования 1С:Предприятия 8.3 (1545)"
После успешного создания службы мы можем запустить ее непосредственно из оснастки services.msc (Службы) или командой:
net start "1C_Enterprise_RAS_1545"
Для повышения безопасности рекомендуется настроить запуск созданной службы от имени того же пользователя, под которым функционирует основной сервер 1С (как правило, это локальная учетная запись USR1CV8). Сделать это можно в свойствах службы на вкладке «Вход в систему».
Поскольку серверная часть 1С:Предприятия часто разворачивается на операционных системах семейства Linux (Ubuntu, RedHat, Astra Linux), настроим RAS и в этой среде. Начиная с современных версий платформы, разработчики 1С поставляют вместе с дистрибутивом готовые файлы конфигурации для демона инициализации systemd.
Рассмотрим процесс регистрации службы RAS по шагам:
systemd:
ln -s /opt/1cv8/x86_64/8.3.24.1368/ras-8.3.24.1368.service /etc/systemd/system/ras-8.3.24.1368.service
systemctl daemon-reload
--now:
systemctl enable ras-8.3.24.1368.service --now
systemctl status ras-8.3.24.1368.service
Проанализируем ситуацию, когда на одном физическом сервере развернуты два независимых кластера 1С. Например, один промышленный (рабочий) кластер функционирует на стандартном порту агента 1540, а второй тестовый кластер — со смещением портов на +100 (порт агента 1640).
В таком сценарии нам потребуется создать две независимые службы RAS, каждая из которых будет слушать свой собственный порт и перенаправлять запросы на соответствующий порт агента кластера:
1545, которая будет транслировать команды на localhost:1540.1645, перенаправляющую команды на localhost:1640.Создание второй службы в Windows будет выглядеть следующим образом:
sc create "1C_Enterprise_RAS_Test_1645" binPath= "\"C:\Program Files\1cv8\8.3.24.1368\bin\ras.exe\" cluster --service --port=1645 localhost:1640" start= auto displayname= "Сервер администрирования 1С Тестовый (1645)"
Важным преимуществом использования сервера удаленного администрирования RAS является безопасность корпоративной сети. Если вам необходимо управлять сервером 1С удаленно с вашего рабочего места (например, запускать внешнюю обработку очистки сеансов с локального компьютера), вам больше не нужно открывать в сетевом экране сервера весь небезопасный диапазон рабочих портов кластера (1540, 1541, 1560-1591).
Достаточно открыть в брандмауэре всего один входящий TCP-порт службы RAS — по умолчанию 1545. Вся дальнейшая коммуникация будет инкапсулирована внутри сервера через локальные петлевые интерфейсы, что минимизирует сетевые риски.
Теперь, когда мы полностью разобрались со службой RAS и успешно запустили ее, давайте посмотрим на практический пример использования объекта АдминистрированиеСервера во встроенном языке 1С. Напишем надежный код, который подключается к серверу и выводит список всех зарегистрированных кластеров:
&НаСервере
Процедура ПолучитьСписокКластеровНаСервере()
ИмяСервера = "localhost";
ПортRAS = 1545; // Указываем настроенный нами порт RAS
Попытка
// Создаем подключение к RAS
АдминистраторКластера = Новый АдминистрированиеСервера(ИмяСервера, ПортRAS);
// Получаем массив объектов типа КластерСерверов
МассивКластеров = АдминистраторКластера.ПолучитьКластеры();
Если МассивКластеров.Количество() = 0 Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("На сервере не найдено активных кластеров.");
Возврат;
КонецЕсли;
Для Каждого ТекущийКластер Из МассивКластеров Цикл
ИнформацияОКластере = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
"Кластер: %1 (ИД: %2), Порт: %3",
ТекущийКластер.ИмяКластера,
ТекущийКластер.Идентификатор,
Формат(ТекущийКластер.Порт, "ЧГ=0")
);
Сообщить(ИнформацияОКластере);
КонецЦикла;
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации(
"АдминистрированиеКластера",
УровеньЖурналаРегистрации.Ошибка,
,,
"Не удалось подключиться к RAS: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)
);
ВызватьИсключение "Ошибка подключения к серверу администрирования. Подробности записаны в журнал регистрации.";
КонецПопытки;
КонецПроцедуры
Используя этот подход, мы можем автоматизировать любые регламентные операции с кластером 1С — от программного создания резервных копий с отключением пользователей до динамического управления рабочими процессами непосредственно из кода информационной базы. При необходимости регулярно выполнять архивирование, тестирование и обновление нескольких информационных баз в фоновом режиме используется программа для автоматического обслуживания баз 1С.