Какой режим записи и период выбрать для регистра сведений при частой фиксации документов?

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

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

В чем заключается проблема коллизии записей

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

  1. В независимом регистре: ключ уникальности состоит из всех измерений регистра, а также поля Период (если регистр периодический). Если по одному и тому же набору измерений поступит два события с одинаковым значением периода (например, две записи в одну и ту же секунду при периодичности «По секунде» или в один день при периодичности «По дням»), платформа выдаст исключительную блокирующую ошибку нарушения уникальности: «Запись с такими ключевыми полями существует».
  2. В подчиненном регистру с периодичностью по дням или секундам: платформа накладывает дополнительный контроль уникальности по измерениям и периоду. Если провести два документа с одинаковым набором измерений на одну и ту же дату/секунду, проведение второго документа завершится ошибкой дублирования записей.

Оптимальное решение: Подчинение регистратору с периодичностью «Позиция регистратора»

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

  1. Режим записи: Подчинение регистратору.
  2. Периодичность: Позиция регистратора.

Разберем ключевые преимущества такой архитектуры:

  1. Гарантия уникальности записей: в таком режиме уникальность строк обеспечивается системной связкой полей Регистратор и НомерСтроки. Даже если несколько документов проводятся на одну и ту же секунду или один документ формирует несколько записей с совпадающими измерениями, ошибка дублирования ключа не возникает.
  2. Точное упорядочивание событий: момент времени документа в платформе 1С включает дату, время (с точностью до секунды) и уникальную ссылку на сам документ. Виртуальная таблица СрезПоследних при периодичности «Позиция регистратора» упорядочивает события не только по времени, но и по ссылке документа-регистратора, что гарантирует однозначное определение актуального состояния.
  3. Автоматическое управление жизненным циклом данных: при стандартной настройке свойства «Удаление движений: Удалять автоматически» платформа берет на себя очистку движений при отмене проведения документа, пометке на удаление или физическом удалении.
  4. Транзакционная целостность: изменение состояния объекта происходит строго в рамках проведения документа в модуле объекта через коллекцию Движения.

Пример формирования движений в подчиненном регистре

Посмотрим на пример кода в модуле документа-регистратора при записи данных в подчиненный регистр сведений СтатусыДокументов:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Инициализируем набор записей регистра сведений
    Движение = Движения.СтатусыДокументов.Добавить();
    Движение.Период = Дата;
    Движение.Контрагент = ЭтотОбъект.Контрагент;
    Движение.ДокументОснование = ЭтотОбъект.ДокументОснование;
    Движение.Статус = ЭтотОбъект.Статус;
    
    // Запись движений будет выполнена платформой автоматически при завершении транзакции
    Движения.СтатусыДокументов.Записывать = Истина;
    
КонецПроцедуры

Альтернативные варианты реализации

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

  1. Добавление ссылки на документ или идентификатора в измерения: если включить ссылку на документ или реквизит типа УникальныйИдентификатор в состав измерений независимого регистра сведений, ключ уникальности не будет нарушаться даже при совпадении секунды.
  2. Использование числового нумератора версий: в независимый регистр добавляется числовое измерение НомерВерсии. Перед записью программно вычисляется максимальный номер версии для объекта, что исключает зависимость от системного времени.
  3. Использование регистра накопления: если помимо актуального статуса требуется аналитика по оборотам или остаткам необработанных объектов, целесообразно использовать регистр накопления вместо регистра сведений.
← На главную