В типовых конфигурациях 1С стандартный реквизит Дата документа часто не совпадает с реальным временем его проведения. Пользователи могут менять дату документа вручную, проводить его «задним числом» или перепроводить спустя долгое время. Если перед нами стоит задача построить отчет по KPI (например, замерить скорость обработки заказа), нам необходимо знать именно момент первого проведения. В этой статье мы разберем несколько эффективных способов получения этой информации, начиная от стандартных инструментов платформы и заканчивая программными доработками.
Первое, что приходит на ум — это Журнал регистрации (ЖР). Платформа автоматически фиксирует все события записи и проведения объектов. Рассмотрим, как это работает и какие есть нюансы.
В журнале регистрации фиксируется событие «Документ.Проведение». Мы можем программно прочитать этот лог, отфильтровав записи по конкретной ссылке на документ. Самая ранняя запись с этим событием и будет временем первого проведения.
Преимущества:
Недостатки:
Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), скорее всего, в ней включена подсистема «Версионирование объектов». Данные хранятся в регистре сведений ВерсииОбъектов.
Проанализируем этот механизм. Каждая версия документа сохраняется в виде XML-файла. Чтобы найти дату первого проведения, нам нужно:
ВерсииОбъектов по интересующему документу.Проведен (в XML) равен Истина.Пример программного перебора версий может выглядеть так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии,
| ВерсииОбъектов.ОбъектВерсионирования КАК Ссылка
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
|ГДЕ
| ВерсииОбъектов.ОбъектВерсионирования = &ДокументСсылка
|УПОРЯДОЧИТЬ ПО
| ДатаВерсии ВОЗРАСТАНИЕ";
Запрос.УстановитьПараметр("ДокументСсылка", НужныйДокумент);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
// Здесь логика распаковки XML и проверки статуса проведения
// Данный метод требует значительных ресурсов при массовой обработке
КонецЦикла;
Начиная с версии платформы 8.3.11, появился встроенный механизм История данных. Он работает быстрее классического версионирования БСП, так как оптимизирован на уровне СУБД.
Разберем, как получить данные через этот механизм. Мы можем использовать менеджер истории данных для программного доступа к версиям. Первая версия, где статус документа изменился на «Проведен», и станет нашей искомой точкой.
Для работы с этим методом убедитесь, что в свойствах документа включено использование истории данных. Получить данные можно с помощью метода ИсторияДанных.Выбрать().
Если задача стоит остро и данные нужны для оперативных отчетов, лучшим решением будет создание собственного небольшого регистра сведений (например, СобытияДокументов или ДатаПервогоПроведения).
Порядок реализации:
Документ и ресурсом ДатаПроведения.ОбработкаПроведения для нужных типов документов.Рассмотрим пример кода в модуле подписки:
Процедура ПриПроведенииДокумента(Источник, Отказ, РежимПроведения) Экспорт
Если Отказ Или Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем, не было ли проведение зафиксировано ранее
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.ДатаПервогоПроведения
|ГДЕ Документ = &Документ";
Запрос.УстановитьПараметр("Документ", Источник.Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
// Записываем дату текущего сеанса как дату первого проведения
МенеджерЗаписи = РегистрыСведений.ДатаПервогоПроведения.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = Источник.Ссылка;
МенеджерЗаписи.ДатаПроведения = ТекущаяДатаСеанса();
МенеджерЗаписи.Записать();
КонецЕсли;
КонецПроцедуры
Иногда программисты пытаются получить время создания документа из его уникального идентификатора (GUID). В 1С используется UUID версии 1, который генерируется на основе меток времени.
Важное уточнение: Из GUID можно вытащить время создания (первой записи) объекта, но не время его проведения. Однако этот метод полезен как «нижняя граница» времени — документ точно не мог быть проведен раньше, чем был создан. Если вам достаточно времени создания, можно воспользоваться специализированными функциями преобразования GUID в дату (учитывая, что 1С хранит байты UUID в инвертированном виде).
Проанализируем ситуацию: когда документ проводится, он делает записи в регистры накопления или бухгалтерии. Если в системе не практикуется ручная правка периодов в движениях, мы можем попытаться найти самую раннюю запись в регистрах, связанную с этим документом.
Однако здесь есть ловушка: поле Период в регистрах накопления обычно равно дате документа, а не времени нажатия кнопки «Провести». Тем не менее, в некоторых служебных регистрах сведений (например, в подсистеме статусов документов в ERP или УТ 11) фиксируется реальное время изменения статуса заказа на «К выполнению» или «Закрыт», что часто совпадает с моментом проведения.
Выясним, какой метод выбрать в зависимости от ситуации:
ВерсииОбъектов.Таким образом, хотя платформа 1С не хранит время первого проведения в явном виде в стандартных реквизитах, мы имеем широкий арсенал инструментов для решения этой задачи.