При работе с журналом регистрации 1С многие сталкиваются с ситуацией, когда без фильтрации данные открываются быстро, но стоит задать интервал дат и времени, как система уходит в бесконечное формирование. Из-за этого перестают работать и типовые сервисные отчеты (например, Активность пользователя), зависая на выполнении встроенного метода ВыгрузитьЖурналРегистрации. Разберем детально, почему это происходит и какие шаги необходимо предпринять для восстановления быстродействия.
Проанализируем механику работы текстового формата журнала регистрации .lgp. При поиске записей в заданном диапазоне времени платформа 1С рассчитывает на строгую последовательность и монотонность временных меток. Однако на практике возникают следующие проблемы:
.lgf содержит соответствия внутренних идентификаторов метаданных, пользователей и событий. При его повреждении или разрастании сопоставление данных при фильтрации кратно замедляется.rphost пытается прочитать большой файл журнала для формирования отбора, другие потоки непрерывно пишут в этот же файл новые события, вызывая блокировки на уровне файловой системы.Рассмотрим первоочередное системное решение. Если журнал регистрации ведется в старом текстовом формате, его категорически нельзя хранить единым бесконечным файлом. Необходимо включить разделение по дням или месяцам.
После включения разделения платформа перестает писать в один гигантский файл и начинает создавать отдельные суточные файлы вида ГГГГММДДHHMMSS.lgp. При установке отбора по времени за конкретный день платформа считывает только соответствующий компактный файл, не затрагивая историю за предыдущие месяцы и годы.
Выясним, действительно ли необходимо хранить в оперативной базе журнал объемом в десятки гигабайт за несколько лет. Оптимальная практика администрирования — оставлять в рабочей базе только актуальные события (например, за последние 1–3 месяца), а устаревшие записи выгружать в архивные файлы.
Посмотрим на пример программного сокращения журнала с помощью встроенного метода СократитьЖурналРегистрации. Данный код можно вынести в отдельную обработку или запускать регламентным фоновым заданием по расписанию:
// Определим границу хранения: удаляем события старше 60 дней
ГраницаХранения = НачалоДня(ТекущаяДата() - 60 * 86400);
ПутьАрхива = "D:\1C_Logs_Archive\Log_Archive_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".lgp";
// Выполняем усечение с выгрузкой в архивный файл
СократитьЖурналРегистрации(ГраницаХранения, ПутьАрхива);
Метод СократитьЖурналРегистрации принимает параметры: дату окончания сохраняемого периода, имя файла для архива и флаг формата. После его выполнения размер рабочего каталога 1Cv8Log уменьшается, а скорость выборок нормализуется.
Разберем ситуацию, когда отчеты зависают из-за некорректного вызова метода выгрузки в коде конфигурации. Метод имеет сигнатуру:
ВыгрузитьЖурналРегистрации(<ТаблицаВыгрузки>, <Фильтр>, <Колонки>, <События>, <Количество>)
Если в структуре Фильтр заданы только даты, но пятый параметр <Количество> оставлен пустым, платформа пытается поместить в оперативную память абсолютно все строки за указанный промежуток. Если записей сотни тысяч, процесс сервера исчерпывает оперативную память и зависает.
Посмотрим, как правильно ограничить выборку и отбирать только необходимые поля:
// Задаем строгий фильтр
СтруктураФильтра = Новый Структура;
СтруктураФильтра.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
СтруктураФильтра.Вставить("ДатаОкончания", КонецДня(ТекущаяДата()));
СтруктураФильтра.Вставить("Пользователь", ТекущийПользователь());
// Создаем приемник данных
ТаблицаЛога = Новый ТаблицаЗначений;
// Выгружаем только необходимые колонки и ограничиваем максимальное число записей
Колонки = "Дата, Пользователь, Событие, ПредставлениеДанных";
МаксКоличество = 1000;
ВыгрузитьЖурналРегистрации(ТаблицаЛога, СтруктураФильтра, Колонки, , МаксКоличество);
Проанализируем избыточность логирования. Часто журнал регистрации раздувается до критических объемов из-за фиксации всех транзакционных событий. Для снижения нагрузки настроим уровень детализации:
УстановитьИспользованиеЖурналаРегистрации().srvinfo, где находится папка 1Cv8Log, должен располагаться на высокоскоростных SSD/NVMe-накопителях.