Почему не создается запись в журнале регистрации 1С при программном вызове?

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

В практике разработчика 1С часто встречается ситуация: код написан верно, процедура ЗаписьЖурналаРегистрации вызывается, но при открытии журнала в режиме «Предприятие» заветная строка не обнаруживается. Это может сбивать с толку, особенно когда речь идет о критически важных операциях, таких как удаление файлов или загрузка данных из внешних систем. Проанализируем эту проблему детально, опираясь на технические особенности платформы 1С:Предприятие 8.3.

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

Прежде всего, разберем ситуацию, когда запись не создается из-за того, что выполнение просто не доходит до нужной строки. Рассмотрим пример кода, в котором планируется фиксировать ошибки удаления файла:


Процедура УдалениеФайла(ПолныйПуть)
    Запрос = Новый Запрос;
    Запрос.Текст ="ВЫБРАТЬ
                  | эхНеЗагруженныеФайлыXML_CRM.НазваниеФайла КАК НазваниеФайла
                  |ИЗ
                  | РегистрСведений.эхНеЗагруженныеФайлыXML_CRM КАК эхНеЗагруженныеФайлыXML_CRM
                  |ГДЕ
                  | эхНеЗагруженныеФайлыXML_CRM.НазваниеФайла = &НазваниеФайла";
    Запрос.УстановитьПараметр("НазваниеФайла",ПолныйПуть);
    Результат = Запрос.Выполнить;
    
    Если Результат.Пустой Тогда
        Попытка
            УдалитьФайлы(ПолныйПуть);
        Исключение
            ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
            ЗаписьЖурналаРегистрации(
                "ЗагрузкаДанныхCRMСервер.УдалениеФайла",
                УровеньЖурналаРегистрации.Ошибка,
                ,
                ,
                ТекстОшибки
            );
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Проанализируем этот фрагмент. Первая и самая очевидная причина отсутствия записи — ошибка не возникла. Если метод УдалитьФайлы отработал успешно, управление не передается в блок Исключение, и запись в журнал не производится. Также стоит проверить условие Если Результат.Пустой Тогда. Если в регистре сведений уже есть запись о данном файле, код удаления просто проигнорируется.

Проблема «ошибки наблюдателя» и фильтрация

Часто запись в журнале присутствует, но пользователь ее не видит. Разберем, как правильно проверить наличие данных:

  1. Обновление данных: Нажатие клавиши F5 в окне журнала регистрации не всегда гарантирует отображение самых свежих записей, если включены жесткие фильтры.
  2. Настройка отбора: Проверьте, не установлен ли отбор по конкретному периоду, пользователю или компьютеру. Рекомендуется сбросить все фильтры и установить только один — по «Событию», указав в нем строку ЗагрузкаДанныхCRMСервер.УдалениеФайла.
  3. Уровень важности: В коде указан уровень УровеньЖурналаРегистрации.Ошибка. Если в настройках базы (Администрирование — Настройка журнала регистрации) установлен уровень «Регистрировать только предупреждения», то ошибки могут не фиксироваться (в зависимости от версии платформы и специфики настроек).

Технические особенности формата SQLite (.lgd)

Начиная с версии 8.3.5, 1С по умолчанию использует новый формат журнала регистрации на базе SQLite (файл 1Cv8.lgd). Это внесло ряд нюансов в работу системы логирования:

Блокировки базы данных: SQLite — это файловая база данных. При очень интенсивной записи или большом объеме журнала (десятки гигабайт) файл может блокироваться. Если в момент вызова ЗаписьЖурналаРегистрации файл занят другим процессом (например, фоновым заданием по индексации или другим сеансом), платформа может отложить запись в буфер или, в редких случаях при критических сбоях, потерять ее.

Асинхронность и буферизация: Платформа не всегда сбрасывает данные на диск мгновенно. Существует внутренний механизм кэширования. Если сеанс завершился аварийно сразу после вызова команды, данные из оперативной памяти могли не успеть записаться в файл .lgd.

Проверка прав доступа на уровне операционной системы

Выясним причину, связанную с инфраструктурой сервера. Журнал регистрации хранится в каталоге srvinfo (рабочий каталог кластера сервера 1С). За запись отвечает процесс rphost, который запускается от имени конкретного пользователя ОС (обычно USR1CV8).

Разберем шаги для проверки:

  1. Убедитесь, что у пользователя ОС, под которым запущен «Агент сервера 1С:Предприятия», есть права на «Полный доступ» к папке с данными информационной базы внутри srvinfo.
  2. Иногда после обновления платформы или переноса базы права могут наследоваться некорректно, что приводит к невозможности создания новых фрагментов журнала (файлов логов).

Использование иерархических имен событий

В нашем примере используется имя события "ЗагрузкаДанныхCRMСервер.УдалениеФайла". Использование точек подразумевает иерархическую структуру. Посмотрим на возможные проблемы:

В некоторых версиях платформы (особенно в новых релизах, таких как 8.3.27), механизмы индексации новых событий могут работать с задержкой. Если событие с таким именем регистрируется впервые, попробуйте упростить имя до одного слова без спецсимволов, например, "ОшибкаУдаленияФайла", и проверить результат. Это поможет исключить ошибки парсинга имени события в самой платформе.

Повреждение индексов журнала (.lgp / .lgx)

Если ваша база все еще использует старый формат журнала (текстовые файлы .lgp), то проблема может крыться в повреждении индексных файлов .lgx. Рассмотрим алгоритм исправления:

  1. Остановите службу сервера 1С.
  2. Перейдите в каталог журнала регистрации конкретной базы.
  3. Удалите все файлы с расширением .lgx.
  4. Запустите службу. Платформа автоматически пересоздаст индексы при первом обращении к журналу, и «пропавшие» записи могут появиться в списке.

Альтернативный метод логирования

Если надежность штатного журнала регистрации вызывает сомнения или требуется гарантированная фиксация событий при высокой нагрузке, проанализируем вариант записи в текстовый лог-файл. Это особенно удобно для отладки внешних обработок на сервере.


ТекстЛога = Новый ЗаписьТекста;
ТекстЛога.Открыть("C:\Logs\crm_errors.txt", КодировкаТекста.UTF8, СимволыРазделители.ПС, Истина);
ТекстЛога.ЗаписатьСтроку(ТекущаяДата() + ": Ошибка удаления " + ПолныйПуть + " - " + ТекстОшибки);
ТекстЛога.Закрыть();

Важно: При использовании этого метода убедитесь, что у пользователя USR1CV8 есть права на запись в каталог C:\Logs\. Такой подход позволяет избежать зависимости от состояния базы данных журнала регистрации и блокировок SQLite.

Итоги и рекомендации

Подводя итог, если запись в журнале регистрации не появляется, пройдите по следующему чек-листу:

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

← На главную