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