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