Как программно подсчитать количество использованных лицензий КОРП и ПРОФ в кластере 1С?

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

При администрировании крупных инсталляций «1С:Предприятия» часто возникает задача оперативного мониторинга используемых лицензий. Особенно это актуально, когда выстраивается защищенная IT инфраструктура на базе Linux и 1С в смешанных средах, где одновременно могут использоваться лицензии уровней ПРОФ и КОРП. В рамках данной статьи мы подробно разберем, как создать инструменты для автоматического подсчета лицензий, проанализируем программные методы доступа к кластеру и выясним, как обойти типичные технические ограничения.

Метод 1: Использование встроенного языка и COM-соединения

Рассмотрим наиболее прямой способ получения данных — использование объекта АдминистрированиеСервера. Этот метод позволяет подключиться к агенту сервера и обойти все активные кластеры и сеансы.

Для начала нам необходимо инициализировать соединение с агентом сервера. Мы создаем объект, выполняем аутентификацию и переходим к перебору доступных кластеров. Посмотрим на пример кода, который реализует сбор информации о лицензиях из каждого активного сеанса:


// Создаем объект администрирования
Агент = Новый АдминистрированиеСервера();
Агент.ВыполнитьАутентификацию();

// Получаем список всех кластеров на сервере
Кластеры = Агент.ПолучитьКластеры();

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

Проанализируем этот код. Основная сложность заключается в том, что свойство Сеанс.Лицензия (в некоторых версиях API — массив Сеанс.Лицензии) возвращает текстовую строку или объект с описанием. Для того чтобы понять, является ли лицензия КОРП или ПРОФ, нам придется заняться парсингом этой строки.

Метод 2: Работа через утилиту RAC и службу RAS

Если ваша задача — создать внешний Web-service (WS) или скрипт, работающий за пределами среды 1С (например, когда требуется автоматическая установка комьюнити-лицензии на сервер 1С без графического интерфейса), удобнее будет использовать связку из службы ras (Remote Administration Server) и консольной утилиты rac. Этот метод не требует наличия установленной платформы на стороне клиента, достаточно сетевого доступа к порту службы администрирования (по умолчанию 1545).

Рассмотрим команду, которая позволяет получить список лицензий через консоль:


rac session --cluster=<ID_вашего_кластера> list --licenses

В выводе данной команды нас интересует поле license. Выясним причину, почему этот способ часто надежнее: он позволяет получить структурированный текст, где указан не только тип ключа, но и путь к файлу лицензии (в случае программных лицензий) или сетевой адрес менеджера лицензий HASP.

Как отличить КОРП от ПРОФ программно?

Выясним, по каким признакам можно классифицировать полученную информацию. В стандартных свойствах объекта Сеанс нет прямого флага ЭтоКОРП, поэтому мы будем использовать косвенные признаки:

  1. Маркировка в строке описания: Программные лицензии уровня КОРП в своем описании содержат подстроку "КОРП" или "Enterprise".
  2. Серийные номера: Проанализируем серийные номера программных лицензий. Лицензии КОРП обычно начинаются со специфических цифровых последовательностей (например, серии 8100...). Если у вас есть реестр закупленных лицензий, вы можете сопоставить первые 5-7 цифр номера для точной идентификации.
  3. Анализ пути к файлу: В выводе rac для программных лицензий указывается путь к файлу .lic. Часто системные администраторы разносят КОРП и ПРОФ лицензии по разным папкам на сервере, что позволяет легко их группировать при парсинге пути.

Решение проблемы «Сервер не является центральным для кластера»

При попытке выполнить код администрирования в многосерверном кластере часто возникает ошибка: «Сервер app-01 не является центральным для кластера...». Разберем, как правильно организовать подключение в такой ситуации.

Эта ошибка возникает, когда запрос на получение списка сеансов отправляется рабочему серверу, который не несет в данный момент роль Центрального сервера (на котором запущен основной менеджер кластера rmngr). Для решения этой задачи реализуем следующий алгоритм:

  1. Подключаемся к любому агенту сервера в составе кластера.
  2. Получаем список рабочих серверов через метод Кластер.ПолучитьРабочиеСерверы().
  3. Проверяем свойство, отвечающее за статус сервера (в разных версиях API это может быть MainServer или ЦентральныйСервер).
  4. Переподключаем объект АдминистрированиеСервера именно к адресу того сервера, который является центральным.

Только после переподключения к центральному серверу выполнение методов ПолучитьСеансы() или ПолучитьПроцессы() будет стабильным и безопасным.

Альтернативные способы мониторинга

Посмотрим на ситуацию шире. Если прямой опрос кластера через API по каким-то причинам затруднен (например, из-за политик безопасности), мы можем использовать альтернативные источники данных:

Технологический журнал (ТЖ): Это наиболее глубокий способ анализа. Настроив сбор событий LEvent, мы получим лог всех выдач лицензий. Чтобы упростить последующий анализ логов, можно использовать конвертер технологического журнала в JSON. Также полезно будет применить инструменты, которые убирают лишние переносы строк в событиях ТЖ, что значительно ускоряет автоматизированный парсинг. В событиях ТЖ фиксируется подробная информация, включая тип лицензии и её серийный номер.

Счетчики производительности (PerfMon): В операционной системе Windows сервер 1С транслирует данные в системные счетчики. Мы можем получить общие цифры занятых лицензий, однако разделение на КОРП и ПРОФ через этот механизм недоступно — он подходит только для общего мониторинга «занято/свободно».

Резюме для реализации Web-сервиса

Для создания качественного сервиса подсчета лицензий рекомендуем объединить подходы. Ваш сервис должен:

  1. Автоматически определять центральный сервер кластера во избежание ошибок доступа.
  2. Использовать либо библиотеку COM, либо парсинг вывода утилиты rac.
  3. Применять регулярные выражения для поиска ключевых слов ("CORP", "Enterprise") в строках лицензий.
  4. Кэшировать результат на небольшое время (например, 30 секунд), чтобы не создавать избыточную нагрузку на менеджер кластера при частых запросах к WS.

Таким образом, комбинируя штатные средства администрирования и небольшую программную логику парсинга, мы получаем мощный инструмент контроля лицензионной чистоты и оптимизации затрат на ПО.

← На главную