Доброго времени суток, меня зовут Тимур. Я являюсь разработчиком на 1С платформе и так получилось что я разбираюсь в Web технологиях, моим любимым языком является PHP, и я подумал почему бы не сделать программное средство для администрирования 1С через web.
Администрировать 1С сервер можно через командную строку при помощи компоненты RAC которая предоставляет только терминальный интерфейс, что немного не удобно.
Например, чтобы проверить включены ли регламентные базы вам постребуется выполнить несколько команд
//Получаем список всех кластеров и находим нужный идентификатор
rac cluster list
//Получаем список баз и также ищем идентификатор базы в списке
rac localhost:1545 infobase summary list --cluster=123179cb-ec79-45c5-853d-e8570c1235f8 --cluster-user=admin --cluster-pwd=password
//И только после этого получаем состояние базы
rac localhost:1545 infobase info --cluster=123179cb-ec79-45c5-853d-e8570c1235f8 --infobase=e34feedc-f813-4e83-af69-7a3214beb111 --cluster-user=admin --cluster-pwd=password --infobase-user=user --infobase-pwd=password
Быстрее войти в Администрирование и посмотреть в программе эти параметры.
О компоненте я задумался чтобы самому администрировать 1С немного удобнее, а через Web интерфейс было бы вообще идеально. Вот список возможностей которые я реализовал в своей библиотеке:
Просмотр, создание, изменение, удаление кластеров
Просмотр списка, добавление и изменение баз данных
Возможность управление администраторами кластера
Просмотр соединений и их удаление
Просмотр сеансов с базой данных и их удаление
Блокировка и включение выполнения регламентных заданий
-
Блокировка и включение на новые сеансы с базой данных
И это еще не весь список
Установка RacWorker
Установить её можно с помощью команды composer
composer require timurikvx/rac-worker
также дистрибутив доступен на Github по ссылке
https://github.com/timurikvx/rac-worker
Использование
Вообще вся документация описана на Github, здесь я приведу пару примеров работы с ней
Для начала работы нужно инициализировать классы аутентификации в кластере (если нужно) и в базе данных
//Создание администратора кластера
$clusterAgent = new ClusterAgent('name', 'password');
//Создание администратора базы данных
$infobaseUser = new InfobaseUser('name', 'password');
Далее создаем экземпляр класса RacWorker именно через него осуществляется все взаимодействие с компонентой RAC
$version = '8.3.23.2137'; //Версия 1С платформы
$host = 'localhost'
$port = 1545
//Требуется указать архитектуру приложения
//RacArchitecture::X86_64
//RacArchitecture::X64
$worker = new RacWorker($version, $host, $port, RacArchitecture::X86_64);
//$worker->cluster - функции для управления кластерами
//$worker->connection - функции для управления соединениями
//$worker->process - функции для управления процессами кластера
//$worker->server - функции для управления рабочими серверами кластера
//$worker->infobase - функции для управления базами данных
//$worker->session - функции для управления саенсами баз данных
//$worker->agent - функции для управления администраторами сервера
Теперь мы можем получить кластеры сервера
//Получение всех кластеров сервера
$clusters = $worker->cluster->list(); //array<ClusterEntity::class>
//Получение первого кластера, на случай если он единственный
$cluster = $worker->cluster->first(); //ClusterEntity::class|null
//Получаем кластер по его имени
$cluster = $worker->cluster->getByName('Имя кластера'); //ClusterEntity::class|null
И вот теперь нам пригодится авторизация администратора если он имеется
//Устанавливаем авторизацию созданную ранее на экземпляр кластера класса ClusterEntity
$cluster->setUser($clusterUser);
После этого мы можем перейти к базам данных
//Получаем список баз кластера
$error = '' //Выходной параметр ошибки
$infobases = $worker->infobase->list($cluster, $error); //array<InfobaseShortEntity::class>
//Ищем базу по имени
$error = '';
$infobase = $worker->infobase->getByName('Имя базы данных', $cluster, $error); //InfobaseShortEntity::class|null
//Поучаем первую базу из списка
$error = '';
$infobase = $worker->infobase->first($cluster, $error); //InfobaseShortEntity::class|null
//Подробная информация о базе
$error = '';
$infobase = $worker->infobase->info($cluster, $infobase, $error); //InfobaseEntity::class|null
После получения нудной базы требуется установить аутентификацию базы данных
$infobase->setUser($infobaseUser); //$infobaseUser - мы создали ранее (см. выше)
Получаем список сеансов базы данных и удаляем их
$error = '';
//Список сеансов с базой данных
$list = $worker->session->list($cluster, $infobase, $error);
//Список сеансов с базой данных по идентификатору приложения
$list = $worker->session->getByAppID('1CV8', $cluster, $infobase, $error);
//Список сеансов с базой данных по имени хоста
$list = $worker->session->getByHost('host', $cluster, $infobase, $error);
foreach ($list as $session){
$worker->session->remove($cluster, $session, 'Сообщение пользователю', $error);
}
Вот краткий список возможностей библиотеки, я не описал работу с серверами, соединениями и процессами. Полная документация доступна на Github по ссылке в начале статьи
По сути это базовая библиотека для администрирования серверов и баз данных 1С, с помощью нее возможно уже делать приложения более высокого уровня, например обновление баз данных, удобный просмотр баз данных через web интерфейс и т.д.
В будущем планирую на основе этой библиотеки сделать удобный обновлятор баз данных как через web интерфейс так и через командный
Спасибо что дочитали, буду рад комментариям, всего наилучшего
XLeshiy
А спящие сеансы автоматически может удалять?
timmy88 Автор
Любые))
XLeshiy
О, супер, посмотрю. Стопитцот тебе в карму, добрый человек)
timmy88 Автор
Уже катаю обновлятор 1С через php
XLeshiy
Удаление сеансов с базой данных
Это все, а как отобрать спящие?
timmy88 Автор
Смотря что значит спящие, у которых нет соединения или зависли? Если по времени, получаешь полный список и отбираешь которые нужно удалить, там есть поле ДатаНачала
XLeshiy
timmy88 Автор
А вот оно как, слушай надо посмотреть самому, по идее я брал все поля которые доступны сеансам
XLeshiy
Это поле в консоли по умолчанию отключено, как и многие другие
timmy88 Автор
Я посмотрю на днях, если не все поля, я новый релиз выпущу
timmy88 Автор
метод isHypernate получает это у сеанса
XLeshiy
Осталось разобраться, как этим пользоваться) Не силен в php(
Можно на гитхабе инструкцию хотя бы в общих словах?)