При администрировании крупных инсталляций «1С:Предприятия» часто возникает задача оперативного мониторинга используемых лицензий. Особенно это актуально, когда выстраивается защищенная IT инфраструктура на базе Linux и 1С в смешанных средах, где одновременно могут использоваться лицензии уровней ПРОФ и КОРП. В рамках данной статьи мы подробно разберем, как создать инструменты для автоматического подсчета лицензий, проанализируем программные методы доступа к кластеру и выясним, как обойти типичные технические ограничения.
Рассмотрим наиболее прямой способ получения данных — использование объекта АдминистрированиеСервера. Этот метод позволяет подключиться к агенту сервера и обойти все активные кластеры и сеансы.
Для начала нам необходимо инициализировать соединение с агентом сервера. Мы создаем объект, выполняем аутентификацию и переходим к перебору доступных кластеров. Посмотрим на пример кода, который реализует сбор информации о лицензиях из каждого активного сеанса:
// Создаем объект администрирования
Агент = Новый АдминистрированиеСервера();
Агент.ВыполнитьАутентификацию();
// Получаем список всех кластеров на сервере
Кластеры = Агент.ПолучитьКластеры();
Для Каждого Кластер из Кластеры Цикл
// Важно: аутентификация требуется для каждого конкретного кластера
Кластер.ВыполнитьАутентификацию();
// Получаем массив всех активных сеансов
Сеансы = Кластер.ПолучитьСеансы();
Для Каждого Сеанс из Сеансы Цикл
// Свойство Лицензии содержит информацию о выданном ключе
Сообщить("Сеанс №" + Сеанс.НомерСеанса + ", Лицензия: " + Сеанс.Лицензия);
КонецЦикла;
КонецЦикла;
Проанализируем этот код. Основная сложность заключается в том, что свойство Сеанс.Лицензия (в некоторых версиях API — массив Сеанс.Лицензии) возвращает текстовую строку или объект с описанием. Для того чтобы понять, является ли лицензия КОРП или ПРОФ, нам придется заняться парсингом этой строки.
Если ваша задача — создать внешний Web-service (WS) или скрипт, работающий за пределами среды 1С (например, когда требуется автоматическая установка комьюнити-лицензии на сервер 1С без графического интерфейса), удобнее будет использовать связку из службы ras (Remote Administration Server) и консольной утилиты rac. Этот метод не требует наличия установленной платформы на стороне клиента, достаточно сетевого доступа к порту службы администрирования (по умолчанию 1545).
Рассмотрим команду, которая позволяет получить список лицензий через консоль:
rac session --cluster=<ID_вашего_кластера> list --licenses
В выводе данной команды нас интересует поле license. Выясним причину, почему этот способ часто надежнее: он позволяет получить структурированный текст, где указан не только тип ключа, но и путь к файлу лицензии (в случае программных лицензий) или сетевой адрес менеджера лицензий HASP.
Выясним, по каким признакам можно классифицировать полученную информацию. В стандартных свойствах объекта Сеанс нет прямого флага ЭтоКОРП, поэтому мы будем использовать косвенные признаки:
rac для программных лицензий указывается путь к файлу .lic. Часто системные администраторы разносят КОРП и ПРОФ лицензии по разным папкам на сервере, что позволяет легко их группировать при парсинге пути.При попытке выполнить код администрирования в многосерверном кластере часто возникает ошибка: «Сервер app-01 не является центральным для кластера...». Разберем, как правильно организовать подключение в такой ситуации.
Эта ошибка возникает, когда запрос на получение списка сеансов отправляется рабочему серверу, который не несет в данный момент роль Центрального сервера (на котором запущен основной менеджер кластера rmngr). Для решения этой задачи реализуем следующий алгоритм:
Кластер.ПолучитьРабочиеСерверы().MainServer или ЦентральныйСервер).АдминистрированиеСервера именно к адресу того сервера, который является центральным.Только после переподключения к центральному серверу выполнение методов ПолучитьСеансы() или ПолучитьПроцессы() будет стабильным и безопасным.
Посмотрим на ситуацию шире. Если прямой опрос кластера через API по каким-то причинам затруднен (например, из-за политик безопасности), мы можем использовать альтернативные источники данных:
Технологический журнал (ТЖ): Это наиболее глубокий способ анализа. Настроив сбор событий LEvent, мы получим лог всех выдач лицензий. Чтобы упростить последующий анализ логов, можно использовать конвертер технологического журнала в JSON. Также полезно будет применить инструменты, которые убирают лишние переносы строк в событиях ТЖ, что значительно ускоряет автоматизированный парсинг. В событиях ТЖ фиксируется подробная информация, включая тип лицензии и её серийный номер.
Счетчики производительности (PerfMon): В операционной системе Windows сервер 1С транслирует данные в системные счетчики. Мы можем получить общие цифры занятых лицензий, однако разделение на КОРП и ПРОФ через этот механизм недоступно — он подходит только для общего мониторинга «занято/свободно».
Для создания качественного сервиса подсчета лицензий рекомендуем объединить подходы. Ваш сервис должен:
rac.Таким образом, комбинируя штатные средства администрирования и небольшую программную логику парсинга, мы получаем мощный инструмент контроля лицензионной чистоты и оптимизации затрат на ПО.