В процессе разработки конфигураций на платформе 1С нередко возникает необходимость выяснить, когда именно в последний раз редактировалась конкретная запись в регистре сведений. Попробуем разобраться, возможно ли получить эту информацию простым запросом и какие способы решения существуют в платформе 1С.
Проанализируем техническую устройство регистров сведений. В отличие от справочников или документов, записи регистра сведений являются необъектными данными. На уровне базы данных платформа 1С не создаёт служебных полей с фиксацией момента модификации или создания конкретной строки.
Кроме того, при сохранении набора записей регистра платформа физически удаляет существующий набор по ключу уникальности (измерения и период) и записывает новые строки. По этой причине штатным запросом к регистру сведений невозможно узнать дату или время последнего редактирования записи, если разработчик заранее не предусмотрел специальный механизм.
Разберем наиболее распространенный подход, когда дату изменения необходимо фиксировать прямо в таблице регистра. Для этого выполним следующие шаги:
ДатаИзменения (тип Дата, состав даты: Дата и время).ПодпискаНаСобытие. В качестве источника укажем набор записей нашего регистра сведений, а в качестве события выбираем ПередЗаписью.Рассмотрим пример кода в модуле подписки на событие:
Процедура ЗаполнитьДатуМодификацииПередЗаписью(Источник, Отказ, Замещение) Экспорт
ТекущийМомент = ТекущаяДатаСеанса();
Для Каждого Запись Из Источник Цикл
Запись.ДатаИзменения = ТекущийМомент;
КонецЦикла;
КонецПроцедуры
Теперь при любом изменении или добавлении данных через менеджер записи или набор записей реквизит ДатаИзменения будет содержать точный момент записи. Получить эту дату можно простым запросом к регистру.
Начиная с версии платформы 8.3.11, доступен встроенный механизм версионирования — История данных. Он позволяет отслеживать изменения объектов и регистров без изменения структуры их реквизитов.
Рассмотрим порядок настройки и использования истории данных:
ИсторияДанных.Если менять структуру конфигурации нельзя, а узнать время изменения конкретной записи необходимо разово, обратимся к Журналу регистрации.
Посмотрим на порядок действий при работе с журналом:
Запись и по имени нашего регистра сведений.Этот вариант подходит для аудита действий пользователей, однако использовать его в алгоритмах или запросах для автоматической обработки данных не рекомендуется из-за высокой нагрузки на систему.
Часто необходимость знать дату редактирования записи указывает на проблемы в архитектуре расчета данных. Например, если ресурсы регистра хранят вычисленные значения с коэффициентами, зависящими от текущего календарного года, при наступлении следующего года данные теряют актуальность.
Проанализируем варианты правильной организации структуры данных:
ГОД(ТЕКУЩАЯДАТА()).В пределах года). В этом случае получить актуальную цену на любой момент времени можно с помощью виртуальной таблицы СрезПоследних.