При администрировании крупных информационных баз на платформе 1С:Предприятие 8.3 многие технические специалисты сталкиваются с серьезной проблемой производительности нового формата журнала регистрации. Этот формат, использующий СУБД SQLite (файлы с расширением .lgd), задумывался как быстрое и современное решение. Однако на практике в многопользовательских и высоконагруженных системах (например, на базе решений от 1С-Рарус или ERP) он часто приводит к взаимным блокировкам, критическим ошибкам динамического чтения и даже полному зависанию всей системы.
В таких ситуациях официальная техподдержка разработчиков рекомендует вернуть журнал регистрации к классическому последовательному текстовому формату (файлы с расширениями .lgf и .lgp). Но как поступить, если главному бухгалтеру или службе безопасности критически важна накопленная история действий пользователей? Как осуществить обратную конвертацию и «подружить» старые данные с новым (точнее, возвращенным старым) форматом работы? Разберем все доступные способы решения этой задачи по шагам.
Прежде чем приступать к переносу, проанализируем, почему происходит сбой. В файле SQLite (1Cv8.lgd) при интенсивной параллельной записи возникают проблемы блокировок таблиц. Если в этот момент происходит аварийное завершение работы процесса rphost или сервера 1С, база данных SQLite повреждается. В технологическом журнале при этом фиксируется классическая ошибка sqlite3_step failed: database disk image is malformed.
Пока файл поврежден, платформа 1С не сможет корректно прочитать его или выгрузить данные стандартными методами. Поэтому наш первый шаг — обязательное лечение и восстановление исходного файла журнала регистрации.
Для восстановления поврежденного лога нам понадобится официальная консольная утилита SQLite. Выполним следующие действия:
systemctl stop srv1cv83 на Linux.1Cv8Log внутри каталога базы данных на сервере).1Cv8.lgd во временную папку, например, C:\LogRestore\.sqlite3.exe с официального сайта СУБД и поместим в ту же папку.
cd C:\LogRestore
sqlite3 1Cv8.lgd ".recover" > backup.sql
backup.sql в любом мощном текстовом редакторе (например, Notepad++). Прокрутим файл в самый конец. Если последняя строка содержит команду ROLLBACK;, обязательно заменим ее на COMMIT; и сохраним изменения.
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С без написания программного кода.
Проанализируем шаги выполнения этой операции:
Ctrl + O).fixed_1Cv8.lgd.Давайте посмотрим на ситуацию с практической точки зрения. Главбуху или аудиторам старые данные нужны не постоянно, а лишь в исключительных случаях — для точечного анализа («кто изменил старый документ и почему поплыла себестоимость»). Постоянное хранение огромного старого лога в рабочей базе замедляет ее работу и раздувает резервные копии.
В этой ситуации лучшим решением будет разделение логов на «активный» и «архивный»:
fixed_1Cv8.lgd в каталог 1Cv8Log этой архивной базы.1Cv8.gd, настроим ведение лога в старом формате .lgf и начнем вести журнал регистрации с чистого листа. Это обеспечит максимальное быстродействие системы.Чтобы рабочая база 1С гарантированно начала использовать старый текстовый формат .lgf, выполним следующие действия:
1Cv8Log нашей рабочей базы на сервере. Удалим или перенесем в бэкап все файлы с расширением .lgd (включая временные файлы транзакций СУБД SQLite).1Cv8.lgf и сопутствующие файлы .lgp в эту папку. Если мы решили начать лог с чистого листа, оставим папку пустой (или создадим пустой текстовый файл 1Cv8.lgf).Применение этих методик позволит вам не только спасти ценные исторические данные для руководства и бухгалтерии, но и кардинально решить проблему зависаний и критических сбоев в работе СУБД 1С.