Как зафиксировать реальное время создания и заполнения документа в 1С?

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

При решении задач по хронометражу работы операторов программисты часто сталкиваются с проблемой: стандартный Журнал регистрации фиксирует время записи документа, но не дает информации о том, сколько времени пользователь потратил на его заполнение. Если оператор открыл форму нового документа в 10:00, а нажал кнопку «ОК» только в 10:15, в журнале отобразится лишь момент записи (10:15). Разберем, как программно зафиксировать момент начала работы, не создавая лишнего «мусора» в базе данных.

Способ 1. Использование Журнала регистрации при открытии формы

Самый простой и распространенный метод — программная запись события в Журнал регистрации в момент открытия формы нового документа. Поскольку у нового объекта еще нет ссылки и номера, нам нужно передать какой-то уникальный признак, который позволит позже сопоставить это событие с фактом записи.

Проанализируем алгоритм: в обработчике ПриОткрытии (для обычных форм) или ПриСозданииНаСервере (для управляемых форм) мы проверяем, является ли объект новым. Если да, фиксируем событие.


Процедура ПриОткрытии()
    Если ЭтоНовый() Тогда
        УникальныйИдентификаторФормы = Новый УникальныйИдентификатор;
        // Сохраняем ID в переменной формы, чтобы использовать при записи
        ИдентификаторЗамера = Строка(УникальныйИдентификаторФормы);
        
        ЗаписатьСобытиеЖурналаРегистрации(
            "Хронометраж.НачалоСоздания",
            УровеньЖурналаРегистрации.Информация,
            Метаданные.Документы.ЗаказПокупателя,
            ,
            "Пользователь начал создание документа. ID сессии: " + ИдентификаторЗамера
        );
    КонецЕсли;
КонецПроцедуры

При записи документа мы можем повторно вызвать ЗаписатьСобытиеЖурналаРегистрации, указав тот же ID сессии. Это позволит при анализе логов вычислить разницу во времени между началом и концом операции.

Способ 2. Метод УстановитьСсылкуНового()

Рассмотрим более элегантный способ, который позволяет связать событие открытия с конкретным объектом базы данных еще до того, как он будет физически записан. Для этого используется метод УстановитьСсылкуНового(). Это позволяет заранее сгенерировать GUID (уникальный идентификатор), который будет присвоен документу при сохранении.

Разберем, как это реализовать. В коде формы при создании нового объекта мы генерируем ссылку:


Если ЭтоНовый() Тогда
    НоваяСсылка = Документы.ЗаказПокупателя.ПолучитьСсылку(Новый УникальныйИдентификатор);
    ЭтаФорма.УстановитьСсылкуНового(НоваяСсылка);
    
    // Теперь мы можем писать в Журнал регистрации не просто текст, 
    // а передавать ссылку на будущий объект
    ЗаписатьСобытиеЖурналаРегистрации(
        "Хронометраж.НачалоСоздания",
        УровеньЖурналаРегистрации.Информация,
        НоваяСсылка.Метаданные(),
        НоваяСсылка,
        "Начало заполнения формы"
    );
КонецЕсли;

Важный нюанс: если пользователь закроет форму без сохранения, в базе данных объект не появится, но в Журнале регистрации останется запись с «битой» ссылкой (Объект не найден). Это полезно для аналитики: вы увидите, сколько документов было начато, но не доведено до записи.

Способ 3. Добавление реквизита «Дата создания»

Если задача требует частого формирования отчетов внутри самой 1С (без парсинга тяжелого Журнала регистрации), рассмотрим вариант добавления реквизита. Чтобы не изменять структуру сотен видов документов, рекомендуется использовать Общий реквизит (если версия платформы и режим совместимости позволяют) или механизм Дополнительных свойств.

Посмотрим на пример с использованием дополнительных свойств в УПП:

  1. В обработчике формы ПриОткрытии записываем текущую дату в переменную.
  2. В обработчике ПередЗаписью передаем эту дату в ДополнительныеСвойства объекта.
  3. В модуле объекта в процедуре ПриЗаписи сохраняем данные в специальный регистр сведений «ЛогРаботыПользователей».

Такой подход позволяет хранить данные в структурированном виде, что значительно ускоряет работу отчетов по сравнению с чтением ЖР.

Способ 4. Использование подсистемы «Оценка производительности»

В современных конфигурациях (на базе БСП) реализован механизм Apdex. Мы можем использовать его для замера длительности любых операций. Проанализируем, как это работает программно:

При открытии формы вызываем начало замера:

ОценкаПроизводительностиКлиент.НачатьЗамерВремени("ОформлениеДокументаЗаказ");

При успешной записи — завершаем замер. Платформа сама рассчитает длительность и сохранит её в регистр ЗамерыВремени. Это наиболее «штатный» способ для систем на платформе 8.3.

Способ 5. Технологический журнал и ключ /UILogRecorder

Если вмешательство в код конфигурации нежелательно, можно рассмотреть административные методы. Существует ключ запуска платформы /UILogRecorder. Он записывает все интерактивные действия пользователя (нажатия кнопок, открытие форм) в специальные лог-файлы.

Выясним причину, почему этот способ используется редко:

Однако для разового исследования работы конкретного оператора (выявления причин «зависания» или бездействия) этот инструмент незаменим.

Проблема «простоя» (Idle Time)

Важно помнить, что фиксация времени «Открыл — Записал» не всегда объективна. Оператор мог открыть форму и уйти на перерыв. Чтобы получить чистый хронометраж, профессионалы рекомендуют использовать ПодключитьОбработчикОжидания. Раз в несколько минут система может проверять свойство Модифицированность формы. Если форма изменена, значит, работа ведется. Если нет — время можно считать простоем.

Подводя итог, для реализации задачи в 1С:УПП наиболее оптимальным сочетанием будет использование УстановитьСсылкуНового() и запись события в Журнал регистрации при открытии. Это обеспечит надежную связь между действиями пользователя и конкретным документом без замусоривания базы данных лишними записями.

← На главную