Какой объект 1С лучше выбрать для ведения журнала операций?

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

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

Вариант 1. Использование Справочника

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

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

  1. Установим длину Наименование в 0.
  2. Перейдем на закладку "Поля ввода" в окне редактирования метаданных.
  3. В правой таблице "Ввод по строке" удалим Наименование.

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

Вариант 2. Использование Документа

С точки зрения методологии 1С, документ — это событие. Лог операции также является событием, поэтому объект Документ кажется наиболее естественным выбором. Рассмотрим особенности этого подхода:

Часто возникает вопрос равноправия дат (например, время начала и время окончания операции). В документе есть стандартный реквизит Дата. Мы можем использовать его как время создания записи (или время окончания), а для времени начала создать отдельный дополнительный реквизит типа Дата (состав даты — Дата и время). Проанализируем преимущества:

Вариант 3. Использование Регистров Сведений

Если нам требуется «плоский» журнал, где каждая строка операции должна быть видна сразу без захода в карточку объекта, лучше всего использовать Регистры Сведений. Это наиболее производительный вариант для хранения больших объемов данных.

Рассмотрим схему с двумя регистрами, предложенную опытными разработчиками: один регистр хранит заголовки операций (шапку), а второй — детали (строки). Сопоставление идет по уникальному идентификатору (GUID). Это позволяет имитировать структуру «шапка-табличная часть», но с гораздо более высокой скоростью записи.

Пример кода для записи в независимый регистр сведений:


МенеджерЗаписи = РегистрыСведений.ЖурналОпераций.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.ИдентификаторОперации = Новый УникальныйИдентификатор();
МенеджерЗаписи.Описание = "Выгрузка данных в ERP";
МенеджерЗаписи.Записать();

Вариант 4. Проблема транзакционности и запись в файл

Критически важный нюанс при ведении журнала внутри 1С — это поведение системы при ошибках. Если вы записываете лог в справочник или регистр внутри транзакции основной операции, и эта операция завершается ошибкой (происходит ОтменаТранзакции()), то ваш лог также сотрется. Это делает журналирование ошибок бессмысленным.

Выясним причины и способы решения этой проблемы:

  1. Запись во внешний файл. Использование объекта ЗаписьТекста позволяет дописывать строки в файл на диске. Файловая система не подчиняется транзакциям 1С, поэтому лог сохранится даже при «падении» базы.
  2. Использование Журнала регистрации. Стандартный метод ЗаписьЖурналаРегистрации() записывает данные в системный лог 1С. Это быстро, надежно и не раздувает основную базу данных (таблицы SQL).
  3. Фоновые задания. Для сохранения лога в базу данных без риска отката транзакции можно использовать запуск фонового задания. Данные передаются в фоновый поток, который выполняется в отдельном сеансе и фиксирует запись в справочнике или регистре независимо от основной транзакции.

Методы оптимизации хранения данных

Проанализируем ситуацию, когда журнал начинает занимать слишком много места. Чтобы база не «раздувалась», рассмотрим следующие рекомендации:

Хранение в формате JSON или XML. Вместо создания громоздких табличных частей, которые физически являются отдельными таблицами в СУБД, детали операции можно упаковать в одну строку неограниченной длины в формате JSON. Это значительно ускоряет запись объекта.


// Пример упаковки данных в JSON перед записью в реквизит лога
ПараметрыЛога = Новый Структура;
ПараметрыЛога.Вставить("Статус", "Успех");
ПараметрыЛога.Вставить("КоличествоСтрок", 150);

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЛога);
РезультатСтрокой = ЗаписьJSON.Закрыть();
// Записываем РезультатСтрокой в реквизит справочника

Регламентная очистка. Любой журнал должен иметь «срок годности». Проанализируем необходимость создания регламентного задания, которое раз в сутки будет удалять записи старше 30 (или 90) дней. Для регистров сведений с периодом это делается максимально просто через удаление набора записей за период.

Выводы и рекомендации

Подведем итог нашему анализу:

Выбор конкретного инструмента зависит от ваших задач, но помните: хороший журнал — это тот, который не мешает основной работе системы и легко очищается.

← На главную