Журнал регистрации 1С на 35 миллиардов событий: как заставить его открываться за 0,11 секунды

14.08.26

База данных - Журнал регистрации

Журнал регистрации на нагруженной базе перестаёт открываться: файлы растут на гигабайты в день, просмотр виснет, история недоступна. Рассказываю, как мы вынесли журнал трёх продуктивных баз в ClickHouse: 35 млрд событий, поиск всех ошибок за сутки — 0,11 секунды, привычная форма журнала для пользователей и падение числа ошибок в проде в 23 раза за полгода. Архитектура, схема таблицы, грабли интеграции и все цифры с прода.

Журнал регистрации — первое, куда лезешь при разборе инцидента: кто изменил документ, почему упало фоновое задание, что было перед сбоем. Пока база небольшая, это работает. На нагруженной — перестаёт: файловый журнал разрастается на гигабайты в день, просмотр через конфигуратор виснет на любом отборе, а история глубже пары недель просто недоступна.

Расскажу, как мы вынесли журнал регистрации трёх продуктивных баз в ClickHouse и что из этого вышло: 35 миллиардов событий онлайн-истории, поиск всех ошибок за сутки — 0,11 секунды, привычная форма журнала для пользователей и падение числа ошибок в проде в 23 раза за полгода. Решение работает в промышленной эксплуатации больше двух лет. Все цифры — реальные, сняты прямыми запросами к боевому серверу.

 

Почему штатный журнал не тянет

Журнал регистрации хранится в файлах .lgp (плюс словарь .lgf) в каталоге 1Cv8Log каждой базы. Формат последовательный: платформа дописывает события в конец. Для записи это дёшево, для чтения с отбором — худший из возможных вариантов: чтобы найти «все ошибки за вчера», просмотрщику надо пройти файл насквозь.

Дальше — арифметика. Основная база этого внедрения пишет 150–194 млн событий в сутки, в пике — до 11 300 событий в секунду. Это гигабайты прироста в день на дисках боевого сервера. Просмотр «за неделю» превращается в чтение десятков гигабайт последовательного формата — отсюда зависания и знаменитое «журнал не открывается вообще».

Это не баг и не кривая настройка. Формат ЖР спроектирован под дешёвую запись, а не под аналитику. Штатные меры (периодичность файлов, отбор событий, регламентное сокращение) проблему отсрочивают, но фундаментальный конфликт «формат для записи против запросов на чтение» не убирают. Если журнал нужен как рабочий инструмент — данные надо унести туда, где чтение стоит дёшево.

 

Архитектура: три части и один принцип

Принцип — разделить запись и чтение. Боевой сервер пишет журнал как писал; рядом работает конвейер, который в реальном времени переливает события во внешнее аналитическое хранилище.

Кластер 1С (файлы .lgp/.lgf)
        ^74; tail-чтение хвоста файлов в реальном времени
        `60;
Служба-экспортёр (.NET, Windows)
  • читает реестр кластера, по маске имени поднимает экспортёр на каждую базу
  • парсит .lgp, батчи по 10 000 событий каждые 3–5 секунд
  • хранит позицию в файле → докатка после любого рестарта
        ^74; HTTP :8123, батч-вставка
        `60;
ClickHouse (отдельный сервер)
  • таблица EventLogItems на каждую базу 1С
  • MergeTree, партиции по месяцам, сжатие 6,7–9,2×
        ^74; внешний источник данных (ODBC)
        `60;
1С:Предприятие
  • обработка-интерфейс: привычный журнал со всеми отборами
  • мониторинг живости конвейера + Telegram-алерты
  • метод анализа ошибок для AI-ассистента

1. Экспортёр

Служба Windows на .NET (за основу взят открытый проект OneSTools.EventLog). Три свойства, которые делают её пригодной для прода:

  • Автообнаружение баз. Служба читает реестр кластера и по regex-маске имени (^PROD$ → база prod_el) сама поднимает экспортёр на каждую нужную базу. Добавили базу в кластер — выгрузка началась без ручной настройки.
  • Потоковое чтение. Парсер читает .lgp «хвостом», как tail -f: событие попадает в ClickHouse через секунды после записи в файл.
  • Гарантия доставки. В каждой строке хранится имя файла и позиция чтения. После рестарта службы или сервера выгрузка продолжается ровно с того места, где остановилась, — без потерь и дублей. За два года эксплуатации потеряно 0 событий.

2. ClickHouse: почему именно он и как настроена таблица

ClickHouse — колоночная СУБД, созданная ровно под логовый профиль: массовая вставка, редкие точечные обновления, быстрые агрегаты. Ключевые решения по схеме (одна таблица EventLogItems на базу):

  • Ключ сортировки (DateTime, EndPosition) — запросы «за период» (99 % сценариев журнала) читают только нужные гранулы индекса, а не всю таблицу.
  • Партиции по месяцам (PARTITION BY toYYYYMM) — ретеншн реализуется удалением партиции целиком, мгновенно, без тяжёлых DELETE.
  • Кодеки под тип данных. LowCardinality на словарных полях (пользователь, компьютер, событие, метаданные — значения повторяются), DoubleDelta на монотонных счётчиках, ZSTD на текстах. Итог — 2,5 ТБ сырых журналов лежат в 380 ГБ (сжатие 6,7×, на складских базах до 9,2×).

3. Интерфейс в 1С

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

 

Цифры с продуктива

 

Показатель Штатный ЖР ЖР в ClickHouse
Поиск всех ошибок за сутки минуты, зависает 0,11 с (158,5 млн строк)
Аналитика по всей истории (30,5 млрд строк) невозможна 61 с
Глубина онлайн-истории дни–недели 7+ месяцев
Место под журналы ~2,97 ТБ на боевых серверах 440 ГБ на отдельном
Задержка появления события в аналитике секунды
Потеряно событий за 2+ года (рестарты) 0

 

Скорость сканирования — около 500 млн строк в секунду. За типовые сутки система принимает 163 млн событий от 602 пользователей и 186 компьютеров, 1,3 млн сеансов, 75 видов событий. Разрез по приложениям показателен: 98,3 % потока — фоновые задания, и именно они в файловом журнале тонут первыми.

 

Главный эффект — не скорость, а поведение системы

Самая важная таблица проекта — не про миллисекунды, а про качество. Динамика ошибок уровня «Ошибка» в основной базе по месяцам:

 

Месяц Ошибок
Январь 2026 1 403 721
Март 2026 440 849
Май 2026 348 608
Июль 2026 60 097

 

 

С 1,4 млн ошибок в январе до 60 тысяч в июле — в 23 раза меньше за полгода (на пятимиллиардном месячном потоке это 0,001 %). Это прямое следствие наблюдаемости: когда каждая ошибка видна, считается, попадает в тренды и алерты — их начинают системно чинить, а не «замечать, когда пользователи пожалуются». Журнал перестал быть архивом «на всякий случай» и стал метрикой качества.

 

Самообслуживание конвейера

Отдельный инженерный слой — чтобы всё это жило без ручного присмотра. Регламентные задания в 1С следят за самим конвейером:

  • Контроль актуальности. Задание запрашивает дату последнего события в ClickHouse; если поток остановился — алерт в Telegram и автоматический перезапуск службы экспортёра удалённо.
  • Фикс полуночного бага платформы. После смены суток 1С иногда не обновляет отметку времени нового файла журнала, и экспортёр его «не видит». Мониторинг сам «трогает» файл на всех рабочих серверах кластера, чтобы платформа обновила метаданные.
  • Очистка. Локальные файлы старше периода хранения удаляются со всех серверов — но только после проверки, что их содержимое уже в ClickHouse. Диск боевого сервера перестаёт расти.

 

Три неочевидные проблемы интеграции 1С ↔ ClickHouse

Если будете повторять — вот три места, на которых уходит время:

1. CONVERT() в агрегатах. 1С транслирует КОЛИЧЕСТВО(*) к внешнему источнику как CONVERT(COUNT(*), SQL_NUMERIC) — ClickHouse такой синтаксис не понимает. Решение: лёгкие выборки строк делаются запросом 1С, а тяжёлые агрегаты — нативным SQL ClickHouse; счётчики при необходимости собираются в BSL по выборке.

2. Перестановка GUID. В журнале 1С хранит идентификатор объекта в переставленном формате — не как Строка(УникальныйИдентификатор). Обработка преобразует ссылку в формат журнала на лету (перестановка частей GUID), поэтому отбор «Данные = конкретный документ» работает так же, как в штатном журнале, включая префикс вида ссылки.

3. UTC против местного времени. ClickHouse хранит время в UTC; во всех пользовательских выборках применяется сдвиг в местную зону. Мелочь, которая при пропуске даёт «события из будущего» и часовые расхождения в отборах.

 

Почему ClickHouse, а не Elasticsearch или PostgreSQL

Вопрос закономерный — выгружать журнал можно в разные хранилища, и у популярных экспортёров (тот же OneSTools) есть режим Elasticsearch. Почему в итоге ClickHouse:

  • Против Elasticsearch. ES отлично ищет полнотекстово, но журнал регистрации — это не полнотекстовый поиск, а аналитика по структурированным полям с отборами и агрегатами. На тех же объёмах ES требует кратно больше памяти и диска (инвертированные индексы против колоночного сжатия), а агрегаты по миллиардам строк отдаёт медленнее. Для «посчитай ошибки по месяцам за всю историю» ClickHouse выигрывает и по скорости, и по железу.
  • Против PostgreSQL. Postgres — прекрасная строчная СУБД, но 35 млрд строк логов — это не её профиль: вставка такого потока упрётся в WAL, а аналитические сканы без колоночного хранения будут читать всю таблицу. Партиционирование помогает, но не заменяет колоночный движок.
  • За ClickHouse. Массовая batch-вставка «из коробки», колоночное сжатие 7–9×, гранулярный индекс по времени, удаление истории партициями за миллисекунды и агрегаты со скоростью сотен миллионов строк в секунду. Это ровно тот профиль нагрузки, что даёт журнал регистрации: пишем много, обновляем никогда, читаем аналитикой по периоду.

Оговорка: если у вас уже развёрнут и обслуживается ES-кластер под другие задачи — тащить в него журнал разумно, чтобы не плодить технологии. Но с нуля под эту задачу ClickHouse дешевле и по железу, и по сопровождению.

 

Поверх — слой для AI

Раз журнал стал быстрым, на нём заработал метод анализа ошибок для ИИ-ассистента: счётчики, тренд к предыдущему периоду, топ событий и метаданных, распределение по часам, последние ошибки. Вопрос «что сломалось за ночь?» получает ответ за секунды, без ручного копания. Это и есть разница между «архивом на всякий случай» и живым инструментом наблюдаемости.

 

Стоимость и когда это оправдано

Стек полностью открытый: ClickHouse, открытый экспортёр, обработки 1С — лицензионных платежей ноль. Из железа — один сервер (можно виртуальный) под хранилище; за счёт сжатия в 7–9 раз ему нужно на порядок меньше диска, чем занимали бы сырые журналы. Основные трудозатраты — первичная настройка конвейера, мониторинга живости и интерфейсной обработки.

Нужно это не всем. Если журнал открывается быстро, истории хватает и вопросов «кто это сделал» не возникает — достаточно штатной гигиены. Задумываться о выносе стоит, когда просмотр начал мешать работе или бизнесу нужна история глубже, чем влезает на диск. Практический порог — единицы миллионов событий в сутки.

 

Частые вопросы

А нагрузка на боевой сервер от чтения журнала не вырастет? Наоборот, падает. Экспортёр читает файлы последовательно, «хвостом» — это дешёвая операция, несравнимая с тем, как штатный просмотрщик гоняет весь журнал при каждом отборе. Плюс локальные файлы после выгрузки удаляются, и диск боевого сервера перестаёт расти. Аналитическая нагрузка целиком уходит на отдельный сервер ClickHouse.

Что с задержкой — данные «онлайн» или с лагом? Практически онлайн: батч в 10 000 событий уходит каждые 3–5 секунд, так что событие доступно для запроса через секунды после записи в файл. Для расследований и алертов этого более чем достаточно.

Отбор по конкретному документу работает? Да, это принципиально важный сценарий («кто и когда трогал вот эту накладную»). Работает благодаря преобразованию GUID в формат журнала на лету — см. раздел про перестановку GUID выше.

Что с правами доступа к журналу? Права разграничиваются на стороне обработки-интерфейса и учётной записи ODBC-подключения так же, как вы разграничили бы доступ к любому внешнему источнику данных. Сам ClickHouse при этом не торчит наружу — только на сервер 1С.

Сколько времени на внедрение? Базовый конвейер (экспортёр + ClickHouse + форма журнала) поднимается за несколько дней. Больше времени уходит на «взрослую» обвязку: мониторинг живости, автоперезапуск, очистку файлов, разграничение прав, тонкую настройку кодеков под ваши данные.

А если у вас, как у нас, сотни миллионов событий в сутки — вопрос не «нужно ли», а «почему ещё не сделали». Поделитесь в комментариях, как вы держите журнал регистрации на нагруженных базах: сокращаете, отключаете события, выносите во внешнее хранилище — интересно собрать реальные практики, а не советы из справки.

 

Про окна хранения. Здесь журнал регистрации складывается в отдельное хранилище и живёт там годами. В интеграционном слое всё наоборот: у шины сообщения доступны около шести часов, у приёмника две недели, и через сутки после сбоя расследовать уже не по чему. Как это выглядит на живом контуре - Год с 1С:Шиной в проде: что ломается на длинном аптайме.

Другие наши инструменты диагностики 1С:

Вступайте в нашу телеграмм-группу Инфостарт

журнал регистрации ClickHouse EventLog наблюдаемость лог 1С аудит внешний источник данных OneSTools MergeTree экспортёр мониторинг Telegram-алерт LowCardinality сжатие HighLoad ODBC аналитика логов производительность администрирование EventLogExporter

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Администрирование СУБД Системный администратор Программист Бесплатно (free)

5,5 тысячи пользователей в единой базе 1С, розница в режиме 24/7 и SLA 99,98% – в таких условиях любая авария быстро превращается в очереди на кассах, потерю денег и давление со стороны бизнеса. Показываем, как выстроить процесс аварийно-восстановительных работ: от первых алертов и базового скрининга системы до подключения команды, проверки гипотез и дебрифа после инцидента. Разбираем, как метрики, дашборды, техжурнал, Zabbix, Prometheus, Grafana, Telegram-боты и скрипты помогают не гадать, а быстро находить причину проблемы. На реальных авариях объясняем, почему «быстро» не должно означать «рискованно», как работа над ошибками снижает панику и почему каждая авария может сделать систему надежнее.

11.08.2026    1836    jul.dolganova    8    

22

Администрирование СУБД Системный администратор Программист Бесплатно (free)

Статья рассказывает об опыте перевода больших баз с MSSQL на Postgres и годовой эксплуатации после перехода. Показано, с какими ограничениями утилиты ibcmd можно столкнуться при миграции больших баз и какие подходы помогают безопасно обходить эти проблемы. Приведены наиболее интересные кейсы, выявленные в эксплуатации: особенности настроек Postgres, поведение оптимизатора, тонкости работы логики и статистики, а также редкие, но критичные ситуации с производительностью. Материал будет полезен тем, кто планирует переход на Postgres и хочет заранее понимать реальные риски, подводные камни и проверенные практики их преодоления.

20.04.2026    9173    berserg    12    

27

HighLoad оптимизация Администрирование СУБД Системный администратор Программист 1С:Предприятие 8 Бесплатно (free)

Во второй статье по докладу «Дамп – не приговор, а повод задуматься», с которым выступили на конференции INFOSTART TECH EVENT 2024, рассмотрим, какую информацию содержат файлы дампа, чем она полезна и как ее анализировать.

14.04.2025    5594    it-expertise    7    

20

Журнал регистрации Программист Россия Бесплатно (free)

В материале рассматривается сравнение двух инструментов для работы с журналом регистрации 1С: утилиты ibcmd и платформы Vector. Описаны их функциональные возможности, тестирование производительности и практическое применение для преобразования логов в формат JSON.

20.11.2024    8789    user1913000    13    

26

HighLoad оптимизация Администрирование СУБД Системный администратор Программист 1С:Предприятие 8 Россия Бесплатно (free)

Мы исследуем проблему долгого выполнения запросов PostgreSQL при использовании конструкции VALUES: когда она возникает, как на нее можно повлиять, а главное, почему ее продуманная отработка важна для более быстрого функционирования решений на базе 1С

12.11.2024    4415    Tantor    20    

20

HighLoad оптимизация Администрирование СУБД Механизмы платформы 1С Программист 1С:Предприятие 8 ИТ-компания Россия Бесплатно (free)

В данной статье мы рассмотрим, как работает механизм временных таблиц на postgres на платформе 8.3.23 и что изменилось в нем при добавлении новых возможностей в платформе 8.3.25. А также на примере покажу, как понимание работы платформы позволяет оптимизировать СУБД для работы с 1С.

29.10.2024    11642    Tantor    38    

37

Журнал регистрации Тестирование QA Программист Бесплатно (free)

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

21.10.2024    9656    leemuar    8    

25
Для отправки сообщения требуется регистрация/авторизация