К статье
Практический материал

Разработка и Конфигурация · 10 мин

Какие поля определяют ключ уникальности регистра накопления 1С

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

Ключ уникальности записи в регистре накопления 1С — это не измерения, как часто ошибочно полагают начинающие разработчики. Физически уникальность строки таблицы движений определяется комбинацией регистратора и номера строки внутри набора записей этого регистратора. Измерения, период, вид движения и ресурсы в ключ не входят — они лишь атрибуты конкретной записи.

Это принципиальное отличие от регистра сведений, где уникальность действительно строится на измерениях (в пределах периода и регистратора, если они заданы). Понимание разницы критично при проектировании конфигурации: попытка «защититься» от дублей с помощью состава измерений регистра накопления не работает — платформа позволит записать сколько угодно строк с полностью одинаковыми измерениями.

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

Из каких полей состоит запись регистра накопления

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

  • Регистратор — ссылка на документ, сформировавший движение. Обязательное системное поле.
  • Номер строки — порядковый номер записи в наборе записей регистратора. Заполняется платформой автоматически.
  • Период — дата и время записи, обычно совпадает с датой документа, но может быть изменено программно.
  • Вид движения — «Приход» или «Расход» (только для регистров вида «Остатки»).
  • Активность — булев признак, участвует ли запись в расчёте итогов.
  • Измерения — аналитические разрезы (номенклатура, склад, организация и т. д.).
  • Ресурсы — числовые показатели (количество, сумма).
  • Реквизиты — дополнительные данные, не влияющие на итоги.

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

Почему регистратор и номер строки — настоящий ключ

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

Именно поэтому при перепроведении документа платформа не «обновляет» старые строки по какому-то ключу, а удаляет весь набор и записывает новый. Это быстрее и надёжнее: не нужно сопоставлять старые и новые строки по составу измерений.

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

Роль измерений: аналитика, а не уникальность

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

Типичная ситуация: документ «Реализация товаров» содержит две строки табличной части с одной и той же номенклатурой и складом. В регистре накопления появятся две записи с идентичными измерениями, но разными номерами строк. Остатки при этом посчитаются корректно — виртуальная таблица сгруппирует обе строки.

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

Отличие от регистра сведений: где измерения действительно ключ

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

КритерийРегистр накопленияРегистр сведений
Что формирует уникальностьРегистратор + номер строкиИзмерения (+ период, + регистратор для подчинённых)
Записи с одинаковыми измерениямиДопустимы без ограниченийЗапрещены (ошибка платформы)
Обязательность регистратораВсегда обязателенТолько для режима «Подчинение регистратору»
Способ замены данныхВесь набор записей перезаписывается целикомОтдельная запись перезаписывается по ключу измерений

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

Как проверить регистр на наличие логических дублей

Физических дублей по ключу «регистратор + номер строки» в базе быть не может — платформа это гарантирует. Проверять имеет смысл логические дубли: записи с совпадающими измерениями, которые по замыслу должны быть уникальны.

Запрос для поиска таких совпадений выглядит следующим образом (пример для регистра с измерениями «Номенклатура» и «Склад»):

ВЫБРАТЬ

Движения.Номенклатура,

Движения.Склад,

Движения.Регистратор,

КОЛИЧЕСТВО(*) КАК ЧислоЗаписей

ИЗ

РегистрНакопления.ТоварыНаСкладах КАК Движения

СГРУППИРОВАТЬ ПО

Движения.Регистратор,

Движения.Номенклатура,

Движения.Склад

ИМЕЮЩИЕ

КОЛИЧЕСТВО(*) > 1

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

Порядок проверки дублей
  1. 1
    Определите состав измерений, по которым записи должны быть уникальны
  2. 2
    Выполните запрос с группировкой по регистратору и измерениям с условием ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
  3. 3
    Откройте найденные документы и проверьте табличные части на повторяющиеся строки
  4. 4
    Решите: свернуть движения в модуле проведения или добавить контроль дублей при записи документа
  5. 5
    Перепроведите исправленные документы и повторите запрос для контроля

Типичные ошибки при работе с ключом уникальности

Первая ошибка — проектирование регистра накопления с расчётом на то, что измерения не дадут записать дубли. Когда выясняется, что дубли записываются свободно, приходится переделывать логику проведения и чистить данные.

Вторая ошибка — попытка программно сформировать «свой» номер строки или удалить отдельную запись из чужого набора. Набор записей редактируется только целиком и только от имени своего регистратора; точечное изменение одной строки чужого документа нарушает целостность учёта.

Третья ошибка — использование запроса к физической таблице регистра без учёта активности. Неактивные записи (например, после отмены проведения с сохранением движений) не участвуют в итогах, но присутствуют в таблице и искажают ручные проверки, если не добавить отбор ГДЕ Активность.

Типичные ошибки
01
Ожидание, что измерения регистра накопления запретят дубли — платформа таких ограничений не накладывает
02
Проверка дублей без фильтра по активности — в выборку попадают отменённые движения
03
Ручная правка отдельных строк движений вместо перепроведения документа — набор записей становится рассинхронизированным
04
Использование регистра накопления там, где нужна уникальность по аналитикам, — правильный инструмент здесь регистр сведений

Практические рекомендации по проектированию

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

Минимизируйте состав измерений: каждое измерение увеличивает таблицы итогов и замедляет расчёт остатков. Данные, которые нужны только для расшифровки, но не для итогов, выносите в реквизиты регистра.

Для аудита существующей конфигурации полезно один раз выполнить проверочный запрос по ключевым регистрам и зафиксировать, какие документы порождают совпадающие по измерениям строки. Это даст фактическую картину вместо предположений о том, «как проводятся документы».

Итог

Что важно запомнить

Уникальность записи регистра накопления обеспечивают регистратор и номер строки, а не измерения. Движения хранятся и перезаписываются целым набором от документа. Логическую уникальность по аналитикам реализуйте в алгоритме проведения или используйте регистр сведений. Проверку дублей выполняйте запросом с группировкой и фильтром по активности.

Частые вопросы

Можно ли создать уникальный индекс по измерениям регистра накопления?

Штатными средствами конфигуратора — нет. Платформа не предоставляет настройки уникальности по измерениям для регистров накопления. Контроль реализуется программно: свёрткой движений в обработке проведения или проверкой в обработчике ПередЗаписью документа.

Что произойдёт, если у документа две строки с полностью одинаковыми данными?

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

Участвует ли период в ключе уникальности записи?

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

Как удалить одну конкретную запись из движений документа?

Точечно — никак, корректного штатного способа нет. Нужно загрузить набор записей документа, удалить из него нужную строку и записать набор целиком. Однако правильнее исправить данные документа и перепровести его, чтобы движения соответствовали содержимому документа.

Почему в запросе по регистру видны записи отменённого документа?

Вероятно, движения сохранены с признаком активности «Ложь» либо документ не был перепроведён после отмены. Добавьте в запрос условие по полю Активность и проверьте состояние проведения самого документа. Неактивные записи в итогах не участвуют, но в физической таблице присутствуют.

Чем регистр накопления отличается от регистра бухгалтерии по части уникальности?

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