В платформе «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 возвращаем пустую дату
КонецПопытки;
Возврат Момент;
КонецФункции
Ограничения и нюансы использования этого метода:
ПолучитьСсылку() заранее, а записана в базу данных позже, функция вернет время генерации ссылки.Новый УникальныйИдентификатор (формат UUID v4), то в идентификаторе может не быть корректной временной метки.Дата < '20171027'), но не для точного хронологического аудита.Если есть возможность дорабатывать конфигурацию, наиболее простым и точным способом является добавление нового реквизита. Рассмотрим два варианта реализации:
Вариант А. Реквизит в объекте справочника
Добавляем в справочник реквизит ДатаСоздания (тип Дата, состав дат: Дата и время). В модуле объекта справочника в обработчике события ПередЗаписью прописываем проверку:
Процедура ПередЗаписью(Отказ)
Если ЭтоНовый() Тогда
ДатаСоздания = ТекущаяДатаСеанса();
КонецЕсли;
КонецПроцедуры
Если требуется хранить дату последнего изменения, а не создания, убираем проверку ЭтоНовый():
Процедура ПередЗаписью(Отказ)
ДатаПоследнегоИзменения = ТекущаяДатаСеанса();
КонецПроцедуры
Вариант Б. Общий реквизит и подписка на событие
Чтобы не модифицировать каждый справочник по отдельности, создаем Общий реквизит (например, ДатаСозданияОбъекта) и включаем его для нужных справочников. Для автоматического заполнения создается подписка на событие ПередЗаписью для типа СправочникОбъект.
В типовых конфигурациях 1С (ERP, УТ, КА, БП, ЗУП), построенных на базе Библиотеки Стандартных Подсистем, доступен встроенный механизм версионирования.
Как это работает:
ВерсииОбъектов.Программно получить дату первой или последней версии можно запросом к регистру сведений ВерсииОбъектов по полю Объект.
Начиная с версии платформы 8.3.11, доступен нативный механизм История данных. В отличие от версионирования БСП, он работает на уровне платформы и не нагружает базу данными хранилища значений в таком объеме.
Чтобы задействовать историю данных:
История данных в значение Использовать.ИсторияДанных.ПолучитьИсторию().Проанализировав все варианты, выберем оптимальный под конкретную задачу:
УникальныйИдентификатор (Способ 1).ПередЗаписью (Способ 2).