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