Как перенести журнал регистрации 1С из нового формата (.lgd) в старый (.lgf) без потери данных?

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

При администрировании крупных информационных баз на платформе 1С:Предприятие 8.3 многие технические специалисты сталкиваются с серьезной проблемой производительности нового формата журнала регистрации. Этот формат, использующий СУБД SQLite (файлы с расширением .lgd), задумывался как быстрое и современное решение. Однако на практике в многопользовательских и высоконагруженных системах (например, на базе решений от 1С-Рарус или ERP) он часто приводит к взаимным блокировкам, критическим ошибкам динамического чтения и даже полному зависанию всей системы.

В таких ситуациях официальная техподдержка разработчиков рекомендует вернуть журнал регистрации к классическому последовательному текстовому формату (файлы с расширениями .lgf и .lgp). Но как поступить, если главному бухгалтеру или службе безопасности критически важна накопленная история действий пользователей? Как осуществить обратную конвертацию и «подружить» старые данные с новым (точнее, возвращенным старым) форматом работы? Разберем все доступные способы решения этой задачи по шагам.

Выясняем причину проблемы: почему зависает база?

Прежде чем приступать к переносу, проанализируем, почему происходит сбой. В файле SQLite (1Cv8.lgd) при интенсивной параллельной записи возникают проблемы блокировок таблиц. Если в этот момент происходит аварийное завершение работы процесса rphost или сервера 1С, база данных SQLite повреждается. В технологическом журнале при этом фиксируется классическая ошибка sqlite3_step failed: database disk image is malformed.

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

Шаг 1. Восстановление поврежденного файла SQLite (.lgd)

Для восстановления поврежденного лога нам понадобится официальная консольная утилита SQLite. Выполним следующие действия:

  1. Остановим службу сервера «1С:Предприятие» через консоль служб Windows или команду systemctl stop srv1cv83 на Linux.
  2. Перейдем в каталог журнала регистрации нужной информационной базы (в папку 1Cv8Log внутри каталога базы данных на сервере).
  3. Скопируем файл 1Cv8.lgd во временную папку, например, C:\LogRestore\.
  4. Скачаем утилиту sqlite3.exe с официального сайта СУБД и поместим в ту же папку.
  5. Запустим командную строку и выполним утилиту для экспорта структуры и данных в текстовый SQL-дамп:
    
    cd C:\LogRestore
    sqlite3 1Cv8.lgd ".recover" > backup.sql
    
  6. Откроем полученный файл backup.sql в любом мощном текстовом редакторе (например, Notepad++). Прокрутим файл в самый конец. Если последняя строка содержит команду ROLLBACK;, обязательно заменим ее на COMMIT; и сохраним изменения.
  7. Сгенерируем новый, чистый и полностью исправный файл базы данных журнала регистрации: sqlite3 fixed_1Cv8.gd < backup.sql

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

Способ А. Программная конвертация через встроенный метод СкопироватьЖурналРегистрации()

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

Для выполнения этой процедуры создадим внешнюю обработку и напишем следующий код на стороне сервера:


&НаСервере
Процедура СконвертироватьЛогНаСервере()
    
    // Указываем путь к нашему восстановленному файлу SQLite
    ИмяВходногоФайла = "C:\LogRestore\fixed_1Cv8.lgd";
    
    // Указываем путь, куда платформа должна сохранить старый формат лога
    // Папка 1Cv8Log должна существовать, а расширение должно быть именно .lgf
    ИмяВыходногоФайла = "C:\LogRestore\ConvertedLog\1Cv8Log\1Cv8.lgf";
    
    // При необходимости можно задать отбор за определенный период, 
    // чтобы не тащить в рабочую базу гигабайты старых и ненужных записей
    ПараметрыОтбора = Новый Структура;
    // Пример ограничения периода (переносим только данные за последние 3 месяца):
    // ПараметрыОтбора.Вставить("ДатаНачала", НачалоДня(ДобавитьМесяц(ТекущаяДата(), -3)));
    
    Попытка
        Сообщить("Начался процесс конвертации. Это может занять длительное время...");
        
        // Запуск встроенного механизма копирования и конвертации
        СкопироватьЖурналРегистрации(ИмяВходногоФайла, ИмяВыходногоФайла, ПараметрыОтбора);
        
        Сообщить("Конвертация успешно завершена!");
        Сообщить("В каталоге C:\LogRestore\ConvertedLog\1Cv8Log\ созданы файлы .lgp");
    Исключение
        ЗаписатьПеременнуюВЛог = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
        Сообщить("Во время конвертации произошла ошибка: " + ЗаписатьПеременнуюВЛог);
    КонецПопытки;
    
EndПроцедуры

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

Способ Б. Интерактивное сохранение копии журнала

Если размер восстановленного файла fixed_1Cv8.lgd относительно невелик (в пределах 1–3 гигабайт), мы можем воспользоваться интерактивными возможностями платформы 1С без написания программного кода.

Проанализируем шаги выполнения этой операции:

  1. Запустим любую базу данных 1С в режиме «1С:Предприятие» под пользователем с полными правами.
  2. Перейдем в главное меню: Сервис и настройки -> Файл -> Открыть (или воспользуемся сочетанием клавиш Ctrl + O).
  3. В открывшемся диалоговом окне выберем наш исправленный файл fixed_1Cv8.lgd.
  4. Платформа считает данные и откроет их в виде привычной стандартной таблицы журнала регистрации. Здесь будут работать все встроенные отборы и сортировки.
  5. В главном меню выберем команду Файл -> Сохранить копию...
  6. В поле «Тип файла» из выпадающего списка выберем вариант Журнал регистрации (*.lgf).
  7. Укажем путь для сохранения и нажмем кнопку «Сохранить». Платформа автоматически переведет данные в текстовый формат.

Способ В. Создание архивной базы для просмотра логов (Административный обход)

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

В этой ситуации лучшим решением будет разделение логов на «активный» и «архивный»:

  1. На сервере 1С создадим пустую базу-пустышку с аналогичной конфигурацией (можно просто развернуть чистую копию базы без данных). Назовем ее, например, «Архив логов базы Рарус».
  2. Поместим наш вылеченный файл fixed_1Cv8.lgd в каталог 1Cv8Log этой архивной базы.
  3. Предоставим главному бухгалтеру и аудиторам доступ к этой архивной базе. Когда возникнет необходимость расследовать инцидент полугодовой давности, они смогут зайти в нее и изучить историю изменений, не нагружая рабочую базу.
  4. В основной рабочей базе удалим проблемный файл 1Cv8.gd, настроим ведение лога в старом формате .lgf и начнем вести журнал регистрации с чистого листа. Это обеспечит максимальное быстродействие системы.

Как правильно переключить формат лога в живой базе?

Чтобы рабочая база 1С гарантированно начала использовать старый текстовый формат .lgf, выполним следующие действия:

  1. Завершим работу всех пользователей и остановим службу сервера 1С.
  2. В консоли администрирования серверов 1С откроем свойства нашей информационной базы.
  3. В параметре Формат журнала регистрации выберем значение Текстовый файл (старый формат).
  4. Перейдем в каталог 1Cv8Log нашей рабочей базы на сервере. Удалим или перенесем в бэкап все файлы с расширением .lgd (включая временные файлы транзакций СУБД SQLite).
  5. Если мы конвертировали старый лог способом А или Б, скопируем полученные файлы 1Cv8.lgf и сопутствующие файлы .lgp в эту папку. Если мы решили начать лог с чистого листа, оставим папку пустой (или создадим пустой текстовый файл 1Cv8.lgf).
  6. Запустим службу сервера 1С:Предприятие. При первом же входе пользователей платформа инициализирует журнал и начнет писать события в файлы старого формата.

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

← На главную