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

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

В платформе «1С:Предприятие» элементы справочников, в отличие от документов, по умолчанию не содержат системного реквизита Дата. В связи с этим при разработке логики или выгрузок часто возникает необходимость определить, когда именно элемент справочника был создан или отредактирован. Разберем основные способы решения этой задачи — от получения даты из Уникального Идентификатора (GUID) до использования стандартных механизмов платформы и БСП.

Способ 1. Получение даты создания из уникального идентификатора (GUID)

Если справочник уже наполнен данными, а реквизиты для хранения даты ранее не предусматривались, то дату создания ссылки можно попытаться вычислить из самого УникальныйИдентификатор. По умолчанию платформа 1С генерирует идентификаторы формата UUID v1, в структуру которых зашит временной штамп (timestamp).

Рассмотрим алгоритм и готовую функцию для извлечения даты создания из ссылки объекта:


Функция ДатаСозданияСсылки(Ссылка) Экспорт
    
    Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
        Возврат Неопределено;
    КонецЕсли;    
        
    Момент = Дата(1, 1, 1);
    Попытка
        
        УИ = Строка(Ссылка.УникальныйИдентификатор());
        УИ = ВРег(СтрЗаменить(УИ, "-", ""));
        
        Если Сред(УИ, 13, 1) = "1" Тогда
            
            Значение16 = ВРег(Сред(УИ, 14, 3) + Сред(УИ, 9, 4) + Сред(УИ, 1, 8));
            Цифры16    = "123456789ABCDEF";
            Значение10 = 0;
            Длина16    = СтрДлина(Значение16);
            
            Для Ном = 1 По Длина16 Цикл
                Значение10 = Значение10 + Pow(16, Длина16 - Ном) * Найти(Цифры16, Сред(Значение16, Ном, 1));
            КонецЦикла;
            
            Значение10 = Значение10 / 10000000;
            Момент     = Дата(1582, 10, 15, 3, 0, 0) + Значение10;
            
        КонецЕсли;
        
    Исключение
        // В случае ошибки обработки GUID возвращаем пустую дату
    КонецПопытки;
    
    Возврат Момент;
        
КонецФункции

Ограничения и нюансы использования этого метода:

  1. Момент генерации ссылки != момент записи в БД: Если ссылка создавалась программно методом ПолучитьСсылку() заранее, а записана в базу данных позже, функция вернет время генерации ссылки.
  2. Сторонние или загруженные UUID: Если элемент загружен из внешней базы (через XML, JSON, EnterpriseData) или GUID создан вручную конструктором Новый УникальныйИдентификатор (формат UUID v4), то в идентификаторе может не быть корректной временной метки.
  3. Погрешность времени: Из-за особенности перевода байтов и разницы часовых поясов расхождение может составлять от нескольких минут до пары часов, поэтому метод подходит для сравнения дат (например, Дата < '20171027'), но не для точного хронологического аудита.

Способ 2. Добавление реквизита и заполнение при записи

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

Вариант А. Реквизит в объекте справочника

Добавляем в справочник реквизит ДатаСоздания (тип Дата, состав дат: Дата и время). В модуле объекта справочника в обработчике события ПередЗаписью прописываем проверку:


Процедура ПередЗаписью(Отказ)
    
    Если ЭтоНовый() Тогда
        ДатаСоздания = ТекущаяДатаСеанса();
    КонецЕсли;
    
КонецПроцедуры

Если требуется хранить дату последнего изменения, а не создания, убираем проверку ЭтоНовый():


Процедура ПередЗаписью(Отказ)
    
    ДатаПоследнегоИзменения = ТекущаяДатаСеанса();
    
КонецПроцедуры

Вариант Б. Общий реквизит и подписка на событие

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

Способ 3. Использование подсистемы «Версионирование объектов» (БСП)

В типовых конфигурациях 1С (ERP, УТ, КА, БП, ЗУП), построенных на базе Библиотеки Стандартных Подсистем, доступен встроенный механизм версионирования.

Как это работает:

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

Программно получить дату первой или последней версии можно запросом к регистру сведений ВерсииОбъектов по полю Объект.

Способ 4. Использование системного механизма «История данных»

Начиная с версии платформы 8.3.11, доступен нативный механизм История данных. В отличие от версионирования БСП, он работает на уровне платформы и не нагружает базу данными хранилища значений в таком объеме.

Чтобы задействовать историю данных:

  1. В дереве метаданных у справочника устанавливаем свойство История данных в значение Использовать.
  2. Платформа автоматически начинает регистрировать все версии объекта.
  3. Получить историю изменений и дату создания объекта программно можно с помощью менеджера истории данных: ИсторияДанных.ПолучитьИсторию().

Резюме и рекомендации

Проанализировав все варианты, выберем оптимальный под конкретную задачу:

← На главную