Как получить время первого проведения документа в 1С: способы и реализация

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

В типовых конфигурациях 1С, таких как Управление торговлей 11.3, стандартное поле Дата документа часто не отражает реальное физическое время, когда документ был впервые проведен. Пользователи могут менять дату документа «задним числом», что делает невозможным точный расчет KPI или анализ операционных процессов (например, разницы во времени между заказом и реализацией). Рассмотрим подробно все доступные способы получения даты первого проведения, от системных логов до программной доработки.

Метод 1: Использование Журнала регистрации

Журнал регистрации (ЖР) — это основной системный механизм, который фиксирует все значимые события в базе данных, включая проведение документов. Событие проведения записывается как Данные.Проведение. Разберем, как программно извлечь эту информацию.

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


ПараметрыФильтра = Новый Структура;
ПараметрыФильтра.Вставить("Данные", СсылкаНаДокумент);
ПараметрыФильтра.Вставить("Событие", "_$Data$_.Post"); // Внутреннее имя события проведения

ТаблицаСобытий = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТаблицаСобытий, ПараметрыФильтра, "Дата");

Если ТаблицаСобытий.Количество() > 0 Тогда
    ТаблицаСобытий.Сортировать("Дата Возр");
    ДатаПервогоПроведения = ТаблицаСобытий[0].Дата;
КонецЕсли;

Важные нюансы:

  1. Очистка ЖР: Если в компании настроена ротация логов (например, хранение только за последние 3 месяца), то информацию о документах годовой давности получить не удастся.
  2. Производительность: Прямой запрос к ЖР из отчета «на лету» будет работать медленно. Рекомендуется использовать этот метод для разового заполнения реквизитов или в фоновых заданиях.

Метод 2: Подсистема «Версионирование объектов» (БСП)

Если в вашей конфигурации включена подсистема версионирования (Библиотека стандартных подсистем), то задача значительно упрощается. Система хранит снимки состояний объекта в регистре сведений ВерсииОбъектов.

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

  1. Найдем все записи в регистре ВерсииОбъектов, относящиеся к нашему документу.
  2. Отсортируем их по номеру версии или дате возникновения.
  3. Проверим содержимое версии. Нам нужна самая ранняя версия, где признак Проведен равен Истина.

Данные версии хранятся в сжатом виде (в хранилище значений), поэтому для массового анализа потребуется распаковка XML, что также может быть ресурсоемко. Однако, если отчет строится по небольшому количеству документов, это самый надежный «типовой» метод.

Метод 3: Извлечение даты создания из уникального идентификатора (GUID)

Выясним интересный технический факт: в 1С используются UUID версии 1. Это означает, что в самом идентификаторе ссылки зашифровано время создания объекта (момент первой записи черновика в базу). Это не совсем дата проведения, но во многих бизнес-процессах дата создания черновика и дата первого проведения очень близки.

Рассмотрим, как преобразовать УникальныйИдентификатор в дату. Посмотрим на алгоритм парсинга строки GUID:


Функция ПолучитьДатуИзGUID(Ссылка) Экспорт
    Идентификатор = Строка(Ссылка.УникальныйИдентификатор());
    
    // UUID v1 имеет структуру, где временные метки распределены по блокам
    Часть1 = Сред(Идентификатор, 16, 3);
    Часть2 = Сред(Идентификатор, 10, 4);
    Часть3 = Сред(Идентификатор, 1, 8);
    
    СтрHex = "1" + Часть1 + Часть2 + Часть3;
    
    // Далее следует перевод из 16-ричной системы (число 100-наносекундных интервалов)
    // Данный метод позволяет получить дату с точностью до миллисекунд
    // (реализация перевода из Hex в Число опускается для краткости)
    Возврат ДатаСоздания; 
КонецФункции

Этот метод незаменим для ретроспективного анализа старых данных, когда журнал регистрации уже очищен, а версионирование не было включено.

Метод 4: Анализ регистров накопления и статусов

В конфигурациях УТ 11, КА 2, ERP проведение документа часто связано с изменением его статуса. Например, «Заказ клиента» считается фактически «проведенным» для выполнения, когда он переходит в статус К выполнению.

Проанализируем регистры сведений, хранящие историю статусов (если такие доработки есть в системе) или периоды первых движений в регистрах накопления (например, ЗаказыКлиентов или ВыручкаИПродажи). Поле Период в движениях при оперативном проведении фиксирует текущее время. Но помните: при перепроведении задним числом Период изменится на дату документа.

Метод 5: Оптимальное решение (разработка «на будущее»)

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

Разберем шаги реализации:

  1. Добавим в нужные документы (например, ЗаказКлиента и РеализацияТоваровУслуг) новый реквизит ДатаПервогоПроведения с типом Дата (состав даты: Дата и время).
  2. Создадим подписку на событие ПриЗаписи (или ПередЗаписью) для этих документов.
  3. В обработчике события пропишем логику заполнения.

Пример кода для подписки на событие:


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

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

Резюме

Мы проанализировали ситуацию и выяснили, что стандартно 1С не хранит дату первого проведения в явном виде. Для решения задачи выберите подходящий путь:

Совмещение этих подходов позволит вам построить точный отчет о разнице во времени между ключевыми этапами цепочки продаж.

← На главную