Как исправить ошибку «Запись уже существует» в регистре сведений с подчинением регистратору?

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

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

Понимание фундаментальной проблемы

Когда вы создаете регистр сведений с установленным свойством «Подчинение регистратору», вы фактически делегируете платформе управление жизненным циклом записей. В такой модели каждая запись в регистре неразрывно связана с конкретным документом-регистратором. Платформа 1С гарантирует уникальность записей на уровне комбинации измерений + регистратор.

Ошибка, с которой вы столкнулись при попытке провести второй документ, возникает потому, что вы пытаетесь записать набор измерений (например, ту же номенклатуру), который уже был создан другим документом. Платформа не позволяет одному документу «затереть» или изменить движения другого документа, так как это нарушило бы логику работы регистров. Стандартной команды «автоматической перезаписи» для таких случаев не существует, так как это противоречит идеологии подчинения регистратору.

Решение №1: Переход к независимым регистрам сведений

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

  1. Откройте конфигуратор и найдите ваш регистр сведений.
  2. В свойствах регистра снимите флажок «Подчинение регистратору».
  3. Если вам необходимо сохранить историю того, какой документ добавил или изменил штрихкод, добавьте в список измерений новое измерение с названием Регистратор (тип данных ДокументСсылка...).

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

Решение №2: Программная коррекция через набор записей

Если логика вашей задачи жестко требует использования подчинения регистратору (например, данные должны удаляться при отмене проведения документа), вам необходимо изменить подход к записи. Вместо попыток просто «записать» данные, мы должны использовать РегистрСведенийНаборЗаписей. Рассмотрим логику действий:

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


// Пример логики работы с набором записей
НаборЗаписей = РегистрыСведений.ВашРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаТекущийДокумент);
// ... добавление записей в набор ...
НаборЗаписей.Записать(Истина);

Данный метод полезен, если вам нужно управлять движениями только внутри одного документа. Если же конфликты возникают между разными документами, мы настоятельно рекомендуем использовать Решение №1.

Почему не стоит пытаться «взломать» логику?

Попытки программно удалять записи другого документа перед записью своих данных (так называемая «логика перехвата») могут привести к серьезным проблемам:

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

← На главную