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

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

В процессе разработки конфигураций на платформе 1С нередко возникает необходимость выяснить, когда именно в последний раз редактировалась конкретная запись в регистре сведений. Попробуем разобраться, возможно ли получить эту информацию простым запросом и какие способы решения существуют в платформе 1С.

Выясним особенности хранения данных в регистрах сведений

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

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

Вариант 1. Добавление дополнительного реквизита и использование подписки на событие

Разберем наиболее распространенный подход, когда дату изменения необходимо фиксировать прямо в таблице регистра. Для этого выполним следующие шаги:

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

Рассмотрим пример кода в модуле подписки на событие:


Процедура ЗаполнитьДатуМодификацииПередЗаписью(Источник, Отказ, Замещение) Экспорт
	
	ТекущийМомент = ТекущаяДатаСеанса();
	
	Для Каждого Запись Из Источник Цикл
		Запись.ДатаИзменения = ТекущийМомент;
	КонецЦикла;

КонецПроцедуры

Теперь при любом изменении или добавлении данных через менеджер записи или набор записей реквизит ДатаИзменения будет содержать точный момент записи. Получить эту дату можно простым запросом к регистру.

Вариант 2. Использование механизма «История данных»

Начиная с версии платформы 8.3.11, доступен встроенный механизм версионирования — История данных. Он позволяет отслеживать изменения объектов и регистров без изменения структуры их реквизитов.

Рассмотрим порядок настройки и использования истории данных:

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

Вариант 3. Анализ Журнала регистрации

Если менять структуру конфигурации нельзя, а узнать время изменения конкретной записи необходимо разово, обратимся к Журналу регистрации.

Посмотрим на порядок действий при работе с журналом:

  1. Откроем Журнал регистрации в режиме 1С:Предприятие.
  2. Установим отбор по событию Запись и по имени нашего регистра сведений.
  3. В представлении событий найдём интересующий набор измерений и определим точное время выполнения операции.

Этот вариант подходит для аудита действий пользователей, однако использовать его в алгоритмах или запросах для автоматической обработки данных не рекомендуется из-за высокой нагрузки на систему.

Альтернативные архитектурные решения бизнес-задачи

Часто необходимость знать дату редактирования записи указывает на проблемы в архитектуре расчета данных. Например, если ресурсы регистра хранят вычисленные значения с коэффициентами, зависящими от текущего календарного года, при наступлении следующего года данные теряют актуальность.

Проанализируем варианты правильной организации структуры данных:

  1. Динамический расчет: храним в регистре сведений только базовые цены и коэффициенты. Итоговые стоимости рассчитываем динамически в запросе или при выводе на форму с использованием функции ГОД(ТЕКУЩАЯДАТА()).
  2. Использование периодичности: делаем регистр сведений периодическим (периодичность В пределах года). В этом случае получить актуальную цену на любой момент времени можно с помощью виртуальной таблицы СрезПоследних.
  3. Регламентный перерасчет: запускаем фоновое задание в начале каждого периода для актуализации рассчитанных ресурсов.
← На главную