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

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

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

Способ 1. Использование подсистемы версионирования БСП

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

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	СведенияОВерсияхОбъектов.Объект КАК ИзмененныйДокумент,
    |	СведенияОВерсияхОбъектов.ДатаОформления КАК ДатаИзменения
    |ИЗ
    |	РегистрСведений.СведенияОВерсияхОбъектов КАК СведенияОВерсияхОбъектов
    |ГДЕ
    |	СведенияОВерсияхОбъектов.ДатаОформления МЕЖДУ &НачалоДня И &КонецДня";

Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецДня", КонецДня(ТекущаяДатаСеанса()));

Результат = Запрос.Выполнить().Выгрузить();

Обратите внимание: Этот метод работает только для тех документов, у которых в настройках версионирования установлен режим сохранения («При записи» или «При проведении»).

Способ 2. Использование таблиц изменений планов обмена

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

Проанализируем пример запроса к таблице изменений документа:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Изменения.Ссылка КАК ДокументСсылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг.Изменения КАК Изменения
    |ГДЕ
    |	Изменения.Узел = &УзелОбмена";

Запрос.УстановитьПараметр("УзелОбмена", ПланОбмена.МойПланОбмена.НайтиПоКоду("Служебный"));

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // Обработка измененного документа
КонецЦикла;

Способ 3. Программное чтение Журнала регистрации

Платформа 1С фиксирует события записи данных в системном журнале. Мы можем программно прочитать данные за текущие сутки с помощью функции ВыгрузкаЖурналаРегистрации().

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


ТаблицаЖурнала = Новый ТаблицаЗначений;

ОтборЖурнала = Новый Структура;
ОтборЖурнала.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса()));
ОтборЖурнала.Вставить("ДатаОкончания", КонецДня(ТекущаяДатаСеанса()));

// Фильтруем по событиям изменения и проведения данных
События = Новый Массив;
События.Добавить("_$Data$_.Update");
События.Добавить("_$Data$_.Post");
ОтборЖурнала.Вставить("Событие", События);

ВыгрузкаЖурналаРегистрации(ТаблицаЖурнала, ОтборЖурнала, "Данные, Дата, Пользователь");

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

Способ 4. Создание собственной подписки на событие и регистра сведений

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

Разберем реализацию этого способа по шагам:

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

Процедура ФиксироватьИзменениеДокументаПриЗаписи(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

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

После этого список измененных документов за сегодня выбирается обычным быстрым запросом к регистру сведений за интервал текущих суток.

Способ 5. Встроенный механизм «История данных»

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

Таким образом, выбор конкретного способа зависит от задач: для типовых конфигураций удобнее всего использовать регистр версионирования БСП, а для произвольных решений — подписку на событие со служебным регистром сведений.

← На главную