Копать с утра и до обеда.. или разбираем внутренний протокол 1С службы RAS (Часть первая)
Для тех, кто любопытен, или есть потребность администрировать много серверов 1С.
- Описание
- Подробнее
Описание
Для чего это нужно?
Потребность автоматизации процессов администрирования и мониторинга серверов 1С, а именно:
- Мониторинг (снятие счетчиков, доступности и блокировки ИБ)
- Добавление/удаление ИБ
- Перемещение ИБ
- Добавление рабочих серверов (настройка их по шаблону)
- Блокировка и отключение сеансов/зависших соединений
- Подсчет количества лицензий
- И прочие рутинные действия
Как это сейчас работает?
Сейчас для автоматизации процессов администрирования серверов 1С используется следующие схемы работы:
- Служба `ras` и клиент `rac`, а так же библиотеки обертки, которые парсят выхлоп клиента `rac`
- Пакеты для oscript:
— v8rac — реализация части функционала для управления серверами 1С
— irac — полноценная реализация управления серверами 1С
— hirac — HTTP интерфейс основанный на oscript.Web и пакете irac
- Различные реализации от 1С в типовых конфигурациях
- Com подключение — и различные обертки для него
Все эти инструменты требуют установленной 1С, что является их существенным недостатком.
В различных проектах используется “зоопарк” из этих решений и его поддержка занимает уже много времени, а переход на один из инструментов требует существенной доработки уже существующих механизмов и доработки самих инструментов, а самое главное не будет масштабируемым из-за общего недостатка всех этих решений, а именно требуется установленная 1С.
Что будем делать?
План решения задачи
- Для начала предлагается сделать описание всех данных, которые необходимы для работы с серверами 1С.
- Научиться их сериализовать в формат RAS и читать из него, для прямого общения с 1С минуя прослойку в виде клиента `rac`, чем мы устраняем основной недостаток — установленная 1С.
- Реализовать единый интерфейс для всех автоматизаций по протоколу HTTP/gRPC с автоматической генерацией клиентов под любой язык программирования.
Например, для веб-сайта необходимо реализовать клиента на JS, для какой-то другой программы, возможно, потребуется требуется клиент на golang или C#, и все должно быть единообразно, клиенты под любой язык программирования должны создаваться с помощью кодогенерации на основе описания протокола RAS
- Создать масштабируемый микросервис для решения задач администрирования и его быстрого развертывания в docker и kubernetes
Как будем описывать формат данных
Для описания данных клиентов и серверов, а также данных получаемых от RAS предлагается использовать protobuf , как единый формат описания
Это позволит нам создавать клиентов (к RAS и/или нашему единому интерфейсу по протоколам HTTP/gRPC) под любые языки разработки с минимальными трудозатратами. C помощью плагина для генерации кодирования/декодирования в формат RAS все описанные форматы данных можно будет легко кодировать и декодировать для прямого общения с RAS.
Немного специфики:
- Сообщение (message) — в формате protobuf — это класс/структура в других языках.
- Для определения специфичности формата RAS мы будет использовать расширение данных сообщений, эти данные указаны как option или выделены в [ …. ]
Описание формата данных RAS
На прямую формат данных описываться не будет, но будут указаны порядок сериализации и кодек который надо применить к тому или иному полю.
Эти данные можно использовать для кодирования в формат RAS в языках разработки.
Здесь будет приведены примеры для языка golang. (для java — можно взять из предоставленной 1С либы)
За основу разработки формата данных взята Java — либа от 1С, и переработана в Golang/protobuf.
Схема работы клиента RAS
В статье будет рассмотрена следующая общая схема работы клиента RAS
Подготовка данных для сериализации в формат RAS
Для начала необходимо понять, что все сообщения к RAS и при получении ответа упакованы в специальный пакет данных. Для его описания мы создадим сообщение `packet`
Для декодирования нам необходимо ввести две дополнительные опции:
type_field — указание на номер поля в котором содержится тип данных
size_field — поле в котором указан размер данных для поля с типом bytes
Packet
Структура данных:

