Разработка и Конфигурация · 10 мин
Какие поля определяют ключ уникальности регистра накопления 1С
Разбираем, какие поля формируют ключ уникальности регистра накопления 1С: регистратор, номер строки, измерения, период. Проверка дублей и типичные ошибки.
Ключ уникальности записи в регистре накопления 1С — это не измерения, как часто ошибочно полагают начинающие разработчики. Физически уникальность строки таблицы движений определяется комбинацией регистратора и номера строки внутри набора записей этого регистратора. Измерения, период, вид движения и ресурсы в ключ не входят — они лишь атрибуты конкретной записи.
Это принципиальное отличие от регистра сведений, где уникальность действительно строится на измерениях (в пределах периода и регистратора, если они заданы). Понимание разницы критично при проектировании конфигурации: попытка «защититься» от дублей с помощью состава измерений регистра накопления не работает — платформа позволит записать сколько угодно строк с полностью одинаковыми измерениями.
Ниже разобрано, из каких полей складывается идентичность записи, как платформа хранит движения, как проверить наличие дублей запросом и какие ошибки проектирования встречаются чаще всего.
Из каких полей состоит запись регистра накопления
Каждая строка таблицы движений регистра накопления содержит системные и прикладные поля. Системные поля платформа заполняет и контролирует сама, прикладные определяются разработчиком в конфигураторе.
- Регистратор — ссылка на документ, сформировавший движение. Обязательное системное поле.
- Номер строки — порядковый номер записи в наборе записей регистратора. Заполняется платформой автоматически.
- Период — дата и время записи, обычно совпадает с датой документа, но может быть изменено программно.
- Вид движения — «Приход» или «Расход» (только для регистров вида «Остатки»).
- Активность — булев признак, участвует ли запись в расчёте итогов.
- Измерения — аналитические разрезы (номенклатура, склад, организация и т. д.).
- Ресурсы — числовые показатели (количество, сумма).
- Реквизиты — дополнительные данные, не влияющие на итоги.
Из всего этого набора уникальность физической строки обеспечивают только два поля: регистратор и номер строки. Все остальные поля могут полностью совпадать у нескольких записей — и это нормальная ситуация, а не ошибка данных.
Почему регистратор и номер строки — настоящий ключ
Механика платформы устроена так: все движения документа хранятся как единый набор записей, отбор по которому выполняется по регистратору. Внутри набора каждая строка получает последовательный номер. Сочетание этих двух значений гарантированно уникально в пределах всей таблицы — физически невозможно создать две записи с одинаковым регистратором и одинаковым номером строки.
Именно поэтому при перепроведении документа платформа не «обновляет» старые строки по какому-то ключу, а удаляет весь набор и записывает новый. Это быстрее и надёжнее: не нужно сопоставлять старые и новые строки по составу измерений.
Следствие для практики: если вам нужна логическая уникальность «одна строка на комбинацию измерений», её должен обеспечивать алгоритм проведения документа или отдельный контрольный механизм, а не структура регистра.
Роль измерений: аналитика, а не уникальность
Измерения определяют, в каких разрезах накапливаются итоги и строятся виртуальные таблицы остатков и оборотов. Добавление измерения расширяет аналитику, но никак не ограничивает состав записей.
Типичная ситуация: документ «Реализация товаров» содержит две строки табличной части с одной и той же номенклатурой и складом. В регистре накопления появятся две записи с идентичными измерениями, но разными номерами строк. Остатки при этом посчитаются корректно — виртуальная таблица сгруппирует обе строки.
Если бизнес-логика требует, чтобы дублей по измерениям не было, варианты такие: сворачивать таблицу значений перед записью движений (метод Свернуть() с суммированием ресурсов), контролировать дубли в табличной части документа при записи или строить проверочный отчёт для поиска уже существующих совпадений.
Отличие от регистра сведений: где измерения действительно ключ
Путаница возникает из-за регистра сведений, где правила другие. В независимом регистре сведений уникальность записи определяется комбинацией измерений (плюс период для периодических регистров). Записать вторую строку с теми же измерениями невозможно — платформа выдаст ошибку нарушения уникальности.
| Критерий | Регистр накопления | Регистр сведений |
|---|---|---|
| Что формирует уникальность | Регистратор + номер строки | Измерения (+ период, + регистратор для подчинённых) |
| Записи с одинаковыми измерениями | Допустимы без ограничений | Запрещены (ошибка платформы) |
| Обязательность регистратора | Всегда обязателен | Только для режима «Подчинение регистратору» |
| Способ замены данных | Весь набор записей перезаписывается целиком | Отдельная запись перезаписывается по ключу измерений |
Если ваша задача — хранить уникальные значения по комбинации аналитик (например, цены номенклатуры на дату), нужен регистр сведений, а не накопления. Регистр накопления предназначен для фиксации фактов движения, и множественность одинаковых фактов — его штатный режим.
Как проверить регистр на наличие логических дублей
Физических дублей по ключу «регистратор + номер строки» в базе быть не может — платформа это гарантирует. Проверять имеет смысл логические дубли: записи с совпадающими измерениями, которые по замыслу должны быть уникальны.
Запрос для поиска таких совпадений выглядит следующим образом (пример для регистра с измерениями «Номенклатура» и «Склад»):
ВЫБРАТЬ
Движения.Номенклатура,
Движения.Склад,
Движения.Регистратор,
КОЛИЧЕСТВО(*) КАК ЧислоЗаписей
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК Движения
СГРУППИРОВАТЬ ПО
Движения.Регистратор,
Движения.Номенклатура,
Движения.Склад
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Если запрос вернул строки, значит, в документах есть повторяющиеся комбинации аналитик. Дальше нужно выяснить, является ли это допустимой ситуацией (несколько строк табличной части с одним товаром) или ошибкой ввода.
- 1Определите состав измерений, по которым записи должны быть уникальны
- 2Выполните запрос с группировкой по регистратору и измерениям с условием ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
- 3Откройте найденные документы и проверьте табличные части на повторяющиеся строки
- 4Решите: свернуть движения в модуле проведения или добавить контроль дублей при записи документа
- 5Перепроведите исправленные документы и повторите запрос для контроля
Типичные ошибки при работе с ключом уникальности
Первая ошибка — проектирование регистра накопления с расчётом на то, что измерения не дадут записать дубли. Когда выясняется, что дубли записываются свободно, приходится переделывать логику проведения и чистить данные.
Вторая ошибка — попытка программно сформировать «свой» номер строки или удалить отдельную запись из чужого набора. Набор записей редактируется только целиком и только от имени своего регистратора; точечное изменение одной строки чужого документа нарушает целостность учёта.
Третья ошибка — использование запроса к физической таблице регистра без учёта активности. Неактивные записи (например, после отмены проведения с сохранением движений) не участвуют в итогах, но присутствуют в таблице и искажают ручные проверки, если не добавить отбор ГДЕ Активность.
Практические рекомендации по проектированию
При создании нового регистра накопления задайте себе вопрос: должна ли комбинация аналитик быть уникальной в рамках одного документа? Если да — заложите свёртку движений в модуль проведения или контроль при записи. Если нет — убедитесь, что отчёты корректно группируют данные и пользователи не воспримут повторяющиеся строки как ошибку.
Минимизируйте состав измерений: каждое измерение увеличивает таблицы итогов и замедляет расчёт остатков. Данные, которые нужны только для расшифровки, но не для итогов, выносите в реквизиты регистра.
Для аудита существующей конфигурации полезно один раз выполнить проверочный запрос по ключевым регистрам и зафиксировать, какие документы порождают совпадающие по измерениям строки. Это даст фактическую картину вместо предположений о том, «как проводятся документы».
Что важно запомнить
Уникальность записи регистра накопления обеспечивают регистратор и номер строки, а не измерения. Движения хранятся и перезаписываются целым набором от документа. Логическую уникальность по аналитикам реализуйте в алгоритме проведения или используйте регистр сведений. Проверку дублей выполняйте запросом с группировкой и фильтром по активности.
Частые вопросы
Можно ли создать уникальный индекс по измерениям регистра накопления?
Штатными средствами конфигуратора — нет. Платформа не предоставляет настройки уникальности по измерениям для регистров накопления. Контроль реализуется программно: свёрткой движений в обработке проведения или проверкой в обработчике ПередЗаписью документа.
Что произойдёт, если у документа две строки с полностью одинаковыми данными?
В регистре появятся две записи с одинаковыми измерениями и ресурсами, но разными номерами строк. Ошибки не будет, итоги посчитаются корректно как сумма обеих строк. Проблема возникнет только если ваша логика отчётов предполагала одну строку на комбинацию аналитик.
Участвует ли период в ключе уникальности записи?
Нет. Период — обычное поле записи, влияющее на попадание в итоги и виртуальные таблицы, но не на уникальность. Две записи одного регистратора могут иметь одинаковый период, и это штатная ситуация: почти все движения документа датируются его датой.
Как удалить одну конкретную запись из движений документа?
Точечно — никак, корректного штатного способа нет. Нужно загрузить набор записей документа, удалить из него нужную строку и записать набор целиком. Однако правильнее исправить данные документа и перепровести его, чтобы движения соответствовали содержимому документа.
Почему в запросе по регистру видны записи отменённого документа?
Вероятно, движения сохранены с признаком активности «Ложь» либо документ не был перепроведён после отмены. Добавьте в запрос условие по полю Активность и проверьте состояние проведения самого документа. Неактивные записи в итогах не участвуют, но в физической таблице присутствуют.
Чем регистр накопления отличается от регистра бухгалтерии по части уникальности?
Принцип тот же: уникальность записи регистра бухгалтерии также определяется регистратором и номером строки. Проводки с одинаковыми счетами и субконто допустимы и не считаются конфликтом — платформа хранит их как отдельные строки набора записей.