Как исправить ошибку «Запись с такими ключевыми полями существует!» при записи в регистр 1С?

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

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

Выясним причину возникновения ошибки

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

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

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

Вариант 1. Свертка данных перед записью в регистр

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

Рассмотрим пример использования метода Свернуть для таблицы значений. Для этого объединим строки по измерениям и применим функцию агрегации к ресурсам (например, суммирование или получение максимального показания):


ТаблицаДвижений = ТабличнаяЧасть.Выгрузить();
ТаблицаДвижений.Свернуть("Контрагент, Договор, Счетчик", "Показания");

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

Вариант 2. Корректировка периодичности и состава измерений

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

  1. Установка периодичности «По позиции регистратора»: Если регистр сведений подчинен регистратору, данная настройка позволяет учитывать точный момент времени документа в последовательности. Это позволяет проводить документы с одинаковыми измерениями в один и тот же день или секунду.
  2. Учет времени снятия показаний: Если регистр независимый и периодический, убедитесь, что в поле Период передается не просто дата (без времени), а точная дата и время проведения замера.
  3. Добавление разделителя или уникального измерения: Для подчиненных регистров сведений в состав измерений можно включить поле НомерСтроки или ИдентификаторСтроки. Для независимых регистров при необходимости фиксации абсолютно всех событий добавляют измерение с типом УникальныйИдентификатор.

Вариант 3. Изменение архитектуры: переход на регистр накопления

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

В отличие от регистра сведений, регистр накопления (вида «Обороты») не накладывает жестких ограничений на уникальность комбинаций измерений в рамках одного документа или периода. Если вам требуется хранить историю всех внесенных показаний без ограничения уникальности строк, рекомендуется заменить регистр сведений на оборотный регистр накопления.

← На главную