В платформе 1С:Предприятие по умолчанию не хранится дата последнего изменения документа или справочника. Если потребовалось выяснить, какие объекты редактировались за текущий день, стандартного поля или реквизита в метаданных вы не найдете. Рассмотрим основные программные и архитектурные способы решения этой задачи, начиная от встроенных механизмов БСП и заканчивая собственными доработками.
В типовых конфигурациях, построенных на базе Библиотеки Стандартных Подсистем (БСП), предусмотрен регистр сведений СведенияОВерсияхОбъектов. Если в настройках системы включено версионирование нужных документов, БСП автоматически фиксирует каждое сохранение объекта.
Разберем, как получить список измененных документов за сегодня с помощью запроса к этому регистру:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| СведенияОВерсияхОбъектов.Объект КАК ИзмененныйДокумент,
| СведенияОВерсияхОбъектов.ДатаОформления КАК ДатаИзменения
|ИЗ
| РегистрСведений.СведенияОВерсияхОбъектов КАК СведенияОВерсияхОбъектов
|ГДЕ
| СведенияОВерсияхОбъектов.ДатаОформления МЕЖДУ &НачалоДня И &КонецДня";
Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецДня", КонецДня(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();
Обратите внимание: Этот метод работает только для тех документов, у которых в настройках версионирования установлен режим сохранения («При записи» или «При проведении»).
Если в базе настроен план обмена (например, для синхронизации данных или распределенной информационной базы), платформа автоматически регистрирует изменения объектов в специальных таблицах. В пределах одной конфигурации можно использовать существующий или создать служебный план обмена для фиксации измененных данных.
Проанализируем пример запроса к таблице изменений документа:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Изменения.Ссылка КАК ДокументСсылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Изменения КАК Изменения
|ГДЕ
| Изменения.Узел = &УзелОбмена";
Запрос.УстановитьПараметр("УзелОбмена", ПланОбмена.МойПланОбмена.НайтиПоКоду("Служебный"));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка измененного документа
КонецЦикла;
Платформа 1С фиксирует события записи данных в системном журнале. Мы можем программно прочитать данные за текущие сутки с помощью функции ВыгрузкаЖурналаРегистрации().
Рассмотрим пример кода для выборки измененных документов за день:
ТаблицаЖурнала = Новый ТаблицаЗначений;
ОтборЖурнала = Новый Структура;
ОтборЖурнала.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса()));
ОтборЖурнала.Вставить("ДатаОкончания", КонецДня(ТекущаяДатаСеанса()));
// Фильтруем по событиям изменения и проведения данных
События = Новый Массив;
События.Добавить("_$Data$_.Update");
События.Добавить("_$Data$_.Post");
ОтборЖурнала.Вставить("Событие", События);
ВыгрузкаЖурналаРегистрации(ТаблицаЖурнала, ОтборЖурнала, "Данные, Дата, Пользователь");
Важно: Выгрузка из журнала регистрации на крупной базе данных работает медленно и создает высокую нагрузку на сервер, поэтому данный вариант лучше не использовать в частых оперативных сценариях.
Для быстрого и производительного получения данных без применения сторонних подсистем оптимальным решением является создание собственного регистра сведений и подписки на событие.
Разберем реализацию этого способа по шагам:
ИсторияИзмененияДокументов с измерением Документ (тип: ЛюбаяСсылка) и ресурсом ДатаИзменения (тип: Дата).ДокументОбъект на событие ПриЗаписи.
Процедура ФиксироватьИзменениеДокументаПриЗаписи(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
МенеджерЗаписи = РегистрыСведений.ИсторияИзмененияДокументов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = Источник.Ссылка;
МенеджерЗаписи.ДатаИзменения = ТекущаяДатаСеанса();
МенеджерЗаписи.Записать();
КонецПроцедуры;
После этого список измененных документов за сегодня выбирается обычным быстрым запросом к регистру сведений за интервал текущих суток.
Начиная с версии платформы 8.3.11, доступен встроенный механизм хранения истории объектов. Обращаться к нему можно через менеджер ИсторияДанных или с помощью языка запросов к таблицам вида Документ.ИмяДокумента.ИсторияДанных, если использование механизма включено в конфигурации.
Таким образом, выбор конкретного способа зависит от задач: для типовых конфигураций удобнее всего использовать регистр версионирования БСП, а для произвольных решений — подписку на событие со служебным регистром сведений.