Как исправить кодировку и оптимизировать размер журнала регистрации 1С в формате .lgd

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

При переходе платформы «1С:Предприятие 8.3» на новый формат журнала регистрации — .lgd (база данных SQLite) — многие специалисты столкнулись с неочевидными проблемами. Самые острые из них: появление нечитаемых символов («кракозябр») при переносе базы на другой сервер и лавинообразный рост объема файла лога, достигающий сотен гигабайт. В этой статье мы подробно разберем причины возникновения этих ситуаций и найдем способы их решения, используя системные настройки и инструменты работы с базами данных.

Разбор проблемы с кодировкой: почему появляются «кракозябры»

Рассмотрим ситуацию, когда при переносе журнала регистрации на новый сервер старые записи отображаются некорректно, а новые читаются нормально. Выясним причину этого явления. Платформа 1С при записи данных в таблицу EventLog (поле data) использует системные вызовы для формирования JSON. Особенность заключается в том, что эти данные сериализуются в однобайтовой кодировке (ANSI), которая напрямую зависит от настройки операционной системы «System Locale» (локаль для программ, не поддерживающих Юникод).

Проанализируем механизм ошибки:

  1. На старом сервере была установлена локаль English. Платформа записывала строковые данные в кодировке Windows-1252.
  2. На новом сервере установлена локаль Russian. Платформа пытается читать данные, ожидая кодировку Windows-1251, или же SQLite пытается интерпретировать их как UTF-8.
  3. В результате возникает конфликт интерпретации байтов, и в журнале регистрации мы видим нечитаемый текст.

Важное наблюдение: SQLite в формате lgd по стандарту ожидает данные в UTF-8, однако платформа 1С в некоторых версиях записывает данные в поле data без предварительной конвертации из системной ANSI-кодировки. Это приводит к тому, что при смене локали сервера данные «ломаются».

Для исправления ситуации на уровне сервера необходимо привести настройки локали к единообразию. Проверим настройки в Windows: Region -> Administrative -> Language for non-Unicode programs. Установка локали, идентичной старому серверу, позволяет платформе корректно интерпретировать старые записи.

Оптимизация объема журнала регистрации: удаление транзакций

Часто журнал регистрации разрастается до огромных размеров (например, 210 ГБ), что делает работу с ним практически невозможной. Основной объем занимают события типов _$Transaction$_.Begin и _$Transaction$_.Commit. Рассмотрим, как можно сократить размер файла, если стандартные средства фильтрации 1С не позволяют отключить только эти события.

Посмотрим на структуру SQLite и определим план действий. Мы можем напрямую подключиться к файлу 1Cv8.lgd через консоль SQLite или любой менеджер БД (например, DB Browser for SQLite) и выполнить удаление лишних записей. Внимание: перед любыми операциями с файлом лога обязательно остановите службу сервера «1С:Предприятия»!

Разберем пример SQL-запроса для очистки транзакционных записей, которые не несут бизнес-ценности, но занимают 80-90% объема:


-- Удаление записей о начале и завершении транзакций
DELETE FROM EventLog 
WHERE EventID IN (
    SELECT ID FROM EventID WHERE Name IN ('_$Transaction$_.Begin', '_$Transaction$_.Commit')
);

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

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

  1. Останавливаем службу сервера 1С.
  2. Делаем резервную копию файла 1Cv8.lgd.
  3. Запускаем утилиту sqlite3.exe и подключаемся к базе.
  4. Выполняем команды очистки и сжатия:

sqlite3 1Cv8.lgd
sqlite> DELETE FROM EventLog WHERE EventID IN (SELECT ID FROM EventID WHERE Name LIKE '_$Transaction$%');
sqlite> VACUUM;
sqlite> .quit

Этот метод позволяет сократить файл объемом 210 ГБ до приемлемых 10–20 ГБ без потери важной информации о действиях пользователей с документами.

Автоматизация и программное исправление кодировки

Если смена локали сервера невозможна или нежелательна, можно прибегнуть к программному исправлению кодировки внутри базы SQLite. Рассмотрим пример логики на языке Python, который обладает мощными библиотеками для работы с кодировками. Мы можем прочитать «битые» строки, принудительно интерпретировать их как latin1 (или другую исходную кодировку) и перекодировать в корректный UTF-8.

Примерный алгоритм для исправления поля data:


import sqlite3

# Подключение к логу
conn = sqlite3.connect('1Cv8.lgd')
cursor = conn.cursor()

# Выбираем проблемные записи
cursor.execute("SELECT RowID, data FROM EventLog WHERE RowID < 1000") # для примера
rows = cursor.fetchall()

for rowid, raw_data in rows:
    try:
        # Пытаемся восстановить строку из ошибочной кодировки
        # Предполагаем, что данные были записаны как latin1, но лежат в поле UTF-8
        corrected_data = raw_data.encode('cp1252').decode('cp1251')
        cursor.execute("UPDATE EventLog SET data = ? WHERE RowID = ?", (corrected_data, rowid))
    except:
        continue

conn.commit()
conn.close()

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

Рекомендации по долгосрочному обслуживанию

Для предотвращения подобных проблем в будущем и обеспечения требований бизнеса (например, хранение истории за 3 года), проанализируем следующие рекомендации:

  1. Разделение файлов: В настройках журнала регистрации (через Конфигуратор) установите разделение по периодам (месяц или год). Это создаст цепочку файлов .lgd, которые проще архивировать и перемещать.
  2. Версионирование объектов: Если основной целью логов является контроль изменения документов («кто и что поменял»), лучше использовать встроенную подсистему «Версионирование объектов» из библиотеки стандартных подсистем (БСП). Данные там хранятся в сжатом виде непосредственно в основной базе данных SQL, что гораздо удобнее для конечного пользователя (бухгалтера).
  3. Единый стандарт серверов: Все серверы в кластере «1С» должны иметь идентичные настройки System Locale. Оптимально использовать Russian (Russia) для исключения проблем с кириллицей в JSON-полях SQLite.
  4. Регулярный Vacuum: Если вы активно используете журнал регистрации, запланируйте регламентное обслуживание файла lgd сторонними скриптами, так как сама платформа 1С не выполняет дефрагментацию и сжатие базы SQLite автоматически.

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

← На главную