При переходе платформы «1С:Предприятие 8.3» на новый формат журнала регистрации — .lgd (база данных SQLite) — многие специалисты столкнулись с неочевидными проблемами. Самые острые из них: появление нечитаемых символов («кракозябр») при переносе базы на другой сервер и лавинообразный рост объема файла лога, достигающий сотен гигабайт. В этой статье мы подробно разберем причины возникновения этих ситуаций и найдем способы их решения, используя системные настройки и инструменты работы с базами данных.
Рассмотрим ситуацию, когда при переносе журнала регистрации на новый сервер старые записи отображаются некорректно, а новые читаются нормально. Выясним причину этого явления. Платформа 1С при записи данных в таблицу EventLog (поле data) использует системные вызовы для формирования JSON. Особенность заключается в том, что эти данные сериализуются в однобайтовой кодировке (ANSI), которая напрямую зависит от настройки операционной системы «System Locale» (локаль для программ, не поддерживающих Юникод).
Проанализируем механизм ошибки:
Windows-1252.Windows-1251, или же SQLite пытается интерпретировать их как UTF-8.Важное наблюдение: 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.
Проанализируем последовательность действий для полной очистки:
1Cv8.lgd.sqlite3.exe и подключаемся к базе.
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 года), проанализируем следующие рекомендации:
.lgd, которые проще архивировать и перемещать.System Locale. Оптимально использовать Russian (Russia) для исключения проблем с кириллицей в JSON-полях SQLite.lgd сторонними скриптами, так как сама платформа 1С не выполняет дефрагментацию и сжатие базы SQLite автоматически.Соблюдение этих правил позволит вам поддерживать журнал регистрации в рабочем состоянии, обеспечивая высокую скорость поиска и корректное отображение данных даже на больших объемах информации.