Задача фиксации времени работы пользователя с конкретным объектом часто возникает при необходимости аудита действий или анализа нагрузки. В данной статье мы разберем, как грамотно реализовать логирование времени открытия и закрытия формы справочника, учитывая технические особенности платформы 1С.
Прежде всего, проанализируем текущую структуру. Если у вас уже используется РегистрСведений с периодичностью, важно понимать, что периодический регистр фиксирует данные в привязке к моменту времени записи. Пытаться втиснуть «время открытия» в стандартный Период регистра — не лучшая идея, так как этот период занят моментом записи изменения объекта.
Для решения задачи мы предлагаем следующие шаги:
ДатаОткрытия и ДатаЗакрытия. Это позволит хранить временные отметки независимо от факта изменения данных.Разберем процесс поэтапно. Нам потребуется переменная уровня модуля формы, чтобы «запомнить» момент, когда пользователь открыл справочник.
В модуле формы объявим переменную:
Перем ВремяОткрытия;
Далее, в процедуре ПриОткрытии (или ПриСозданииНаСервере) фиксируем момент запуска:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ВремяОткрытия = ТекущаяДатаСеанса();
КонецПроцедуры
Использование ТекущаяДатаСеанса() является предпочтительным, так как оно учитывает часовой пояс текущего пользователя, что делает отчеты по активности более точными.
Теперь рассмотрим, как передать эти данные в регистр. Существует два основных подхода:
Это самый надежный способ. Когда пользователь нажимает «Записать» или «Записать и закрыть», данные передаются на сервер. Вы можете передать переменную ВремяОткрытия в процедуру записи. Если вы хотите зафиксировать и время закрытия, его можно вычислить на сервере в момент завершения операции.
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
// Поиск записи в регистре по ссылке на объект
// Дозапись или создание новой записи с параметрами:
// Объект, ДатаОткрытия, ДатаЗакрытия (ТекущаяДатаСеанса())
КонецПроцедуры
Если запись в регистр уже была создана стандартным механизмом, вы можете выполнить поиск этой записи (например, по регистратору или ссылке) и обновить значения ресурсов. Это удобно, если вы не хотите вмешиваться в стандартные механизмы обмена, а лишь дополняете существующую аналитику.
ПриЗакрытии формы не всегда отрабатывают при аварийном завершении сеанса (например, при сбое питания или принудительном завершении процесса 1С через диспетчер задач). Поэтому полагаться исключительно на событие закрытия для фиксации «времени работы» рискованно. Лучше всего комбинировать фиксацию начала работы с расчетом по моменту записи.РегистрСведений — это транзакция. Если справочник открывается очень часто, интенсивная запись может привести к блокировкам таблиц. В высоконагруженных системах лучше записывать логи через РегламентныеЗадания или использовать очередь сообщений.ЖурналаРегистрации. Он уже умеет фиксировать события доступа к объектам без необходимости написания сложного кода и создания дополнительных регистров.Подводя итог, для начинающего программиста оптимальным путем будет создание непериодического регистра сведений с измерениями Пользователь и СсылкаНаСправочник. Это позволит избежать конфликтов с обменами данными и обеспечит чистоту хранения логов активности.