Как программно получить доступ к журналам регистрации из разных баз 1С?

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

Перед разработчиками 1С часто встает задача централизованного анализа данных из нескольких информационных баз. Одна из таких задач — сбор и анализ событий из журналов регистрации (ЖР) для сбора и анализа ошибок или организации централизованного аудита действий пользователей во всей экосистеме предприятия. В этой статье мы подробно разберем, как, находясь в одной базе 1С, программно подключиться к другим базам (как файловым, так и клиент-серверным) и получить из них данные ЖР для автоматизированного отслеживания критических ошибок в режиме реального времени.

Рассмотрим два основных подхода: классический метод с использованием COM-соединения и более современный, масштабируемый способ с применением централизованного хранилища логов, такого как Elasticsearch. Проанализируем преимущества и недостатки каждого из них, чтобы вы могли выбрать оптимальное решение для вашей задачи.

Способ 1: Использование COM-соединения для выгрузки журнала регистрации

Это стандартный и наиболее прямой способ взаимодействия между базами 1С, позволяющий организовать простой обмен данными между разными базами и реализовать программный экспорт и фильтрацию данных из внешнего журнала регистрации — для этого подойдёт инструмент быстрого ведения журнала изменений объектов. Суть метода заключается в том, что из основной базы мы программно устанавливаем соединение с целевой базой, выполняем там команду выгрузки журнала регистрации во временный файл, а затем читаем и обрабатываем этот файл.

Разберем процесс по шагам.

  1. Установка COM-соединения

    Для подключения к другой базе используется внешний объект COMObject с программным идентификатором V83.COMConnector (или другой версии, например, V82.COMConnector). Изучив техническое руководство по настройке COM-соединения, вы сможете правильно настроить права доступа DCOM и решить проблемы с регистрацией компонентов разных версий платформ. Ключевым моментом является формирование правильной строки подключения, которая различается для файловых и клиент-серверных баз.

    • Для файловой базы: Строка подключения содержит путь к каталогу с базой данных. Пример: File="C:\InfoBases\MyBase";. Важно, чтобы у пользователя, от имени которого исполняется код, были права доступа к этому каталогу по сети (если база на другом компьютере).
    • Для клиент-серверной базы: Строка подключения содержит адрес сервера 1С:Предприятия и имя информационной базы на этом сервере. Пример: Srvr="server-1c";Ref="trade_base";.

    Для аутентификации в строке подключения также указываются имя пользователя и пароль: Usr="Admin";Pwd="123";.

  2. Выгрузка данных журнала регистрации

    После успешного подключения мы можем вызывать методы, доступные в глобальном контексте удаленной базы. Для нашей задачи нужен метод ВыгрузитьЖурналРегистрации(). Этот метод очень удобен, так как позволяет не только выгрузить весь журнал, но и предварительно отфильтровать его по нужным критериям, что существенно сокращает объем передаваемых данных. В некоторых случаях полезной может оказаться выгрузка журнала регистрации в Excel с группировкой для последующего ручного анализа.

    Синтаксис метода: ВыгрузитьЖурналРегистрации(<ИмяФайла>, <Отбор>, <Колонки>, ...)

    С помощью параметра Отбор можно установить фильтр по периоду, пользователю, событию, приложению и другим полям журнала. Это именно то, что нужно для решения исходной задачи — отобрать информацию по созданным документам конкретного пользователя.

  3. Чтение и обработка выгруженных данных

    Метод ВыгрузитьЖурналРегистрации() сохраняет данные в XML-файл. Нам остается прочитать этот файл и разобрать его (спарсить) для получения нужной информации. В 1С для этого есть встроенные инструменты, например, объект ЧтениеXML. При работе с большими объемами данных крайне важна оптимизация производительности, а для глубокого изучения проблем может пригодиться внешняя обработка для анализа записей журнала регистрации (см. инструмент администрирования и анализа журнала регистрации).

Посмотрим на пример кода, который объединяет все эти шаги в одной функции:


Функция ПолучитьСобытияЖРЧерезCOM(СтрокаПодключения, ИмяПользователя, Пароль, ОтборДляЖР)

    // 1. Устанавливаем COM-соединение
    Попытка
        V8Connector = Новый COMObject("V83.COMConnector");
        Соединение = V8Connector.Connect(СтрокаПодключения + "Usr=""" + ИмяПользователя + """;Pwd=""" + Пароль + """;");
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка.COM", УровеньЖурналаРегистрации.Ошибка, ,
            "Не удалось подключиться к базе: " + СтрокаПодключения + ". " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;

    // 2. Выгружаем данные ЖР во временный XML-файл
    ИмяФайлаВыгрузки = ПолучитьИмяВременногоФайла("xml");
    
    Попытка
        Соединение.ВыгрузитьЖурналРегистрации(ИмяФайлаВыгрузки, ОтборДляЖР);
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка.COM", УровеньЖурналаРегистрации.Ошибка, ,
            "Ошибка при выгрузке журнала регистрации: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;

    // 3. Читаем и парсим XML-файл
    ТаблицаСобытий = Новый ТаблицаЗначений;
    ТаблицаСобытий.Колонки.Добавить("Дата");
    ТаблицаСобытий.Колонки.Добавить("Пользователь");
    ТаблицаСобытий.Колонки.Добавить("Событие");
    ТаблицаСобытий.Колонки.Добавить("Данные");
    ТаблицаСобытий.Колонки.Добавить("Комментарий");

    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяФайлаВыгрузки);

    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Event" Тогда
            // Здесь логика разбора узла "Event" и его атрибутов
            // для заполнения таблицы значений ТаблицаСобытий
            НоваяСтрока = ТаблицаСобытий.Добавить();
            // ... код парсинга ...
        КонецЕсли;
    КонецЦикла;

    ЧтениеXML.Закрыть();
    УдалитьФайлы(ИмяФайлаВыгрузки);
    
    // Отключаемся от COM-соединения
    Соединение = Неопределено;

    Возврат ТаблицаСобытий;

КонецФункции

Возможные сложности и пути их решения

Несмотря на кажущуюся простоту, у этого метода есть свои подводные камни:

Способ 2: Централизованный сбор логов через Elasticsearch

Это более современный и промышленный подход, который идеально подходит для систем с большим количеством баз или при высоких требованиях к скорости анализа. Идея заключается в том, чтобы не запрашивать данные из каждой базы по отдельности, а настроить автоматическую отправку логов из всех баз в единое, специализированное хранилище. Для реализации этой задачи часто выбирают стек ELK (Elasticsearch, Logstash, Kibana) или рассматривают альтернативы, такие как выгрузка журнала регистрации в Clickhouse с помощью ibcmd — есть готовая выгрузка журнала регистрации в Clickhouse для аудита.

Elasticsearch — это мощная поисковая и аналитическая система, оптимизированная для работы с большими объемами текстовых данных, какими и являются журналы регистрации. В связке с инструментами сбора (Filebeat, Logstash) и визуализации (Kibana) он образует так называемый ELK-стек.

Основные преимущества этого подхода:

Как это работает на практике:

  1. Настройка Elasticsearch. Разворачивается кластер Elasticsearch, который будет принимать и хранить логи.
  2. Настройка доставки логов. На серверах с базами 1С устанавливаются легкие "агенты" (например, Filebeat). Эти агенты следят за файлами журнала регистрации (.lgp, .lgf) и при появлении новых записей отправляют их в Elasticsearch.
  3. Парсинг логов. В Logstash или прямо в Elasticsearch настраиваются правила разбора (парсинга) специфического формата журнала регистрации 1С, чтобы данные корректно раскладывались по полям (Дата, Пользователь, Событие и т.д.).
  4. Анализ данных. После того как данные начинают поступать, вы можете выполнять к ним сложные запросы через API или анализировать их визуально в Kibana.

Сравнение методов и заключение

Какой же способ выбрать? Ответ зависит от масштаба вашей задачи.

COM-соединение — это отличное решение для разовых или нечастых задач, когда нужно быстро получить небольшой объем данных из нескольких баз. Его легко реализовать стандартными средствами 1С без необходимости разворачивать дополнительную инфраструктуру. Это быстрый и дешевый способ решить локальную проблему.

Централизованный сбор логов через Elasticsearch — это стратегическое, масштабируемое решение для постоянного мониторинга и анализа большого количества баз. Оно требует первоначальных вложений времени и ресурсов на настройку, но в долгосрочной перспективе обеспечивает непревзойденную производительность, гибкость и надежность. Если вам нужен полноценный центр мониторинга активности в экосистеме 1С, этот вариант будет наиболее эффективным.

← На главную