При проведении документов или программной записи в регистр сведений разработчики часто сталкиваются с сообщением об ошибке: «Запись с такими ключевыми полями существует!». Проблема возникает из-за того, что платформа 1С строго контролирует уникальность каждой записи на уровне базы данных. Разберем причинно-следственные связи этой ошибки и проанализируем основные варианты её решения.
В регистре сведений ключ уникальности каждой строки формируется из комбинации всех его измерений. Для периодических регистров в этот ключ дополнительно входит значение поля Период. Ошибка возникает в двух основных ситуациях:
Важно помнить, что даже при использовании параметра Замещать = Истина платформа не сможет записать набор, если дублирующиеся по измерениям строки находятся внутри самого записываемого набора.
Проанализируем ситуацию, когда бизнес-логика допускает объединение строк. Если в документе пользователь может ввести несколько строк по одному и тому же счетчику за один период, перед формированием движений необходимо выполнить сгруппирование или свертку табличной части.
Рассмотрим пример использования метода Свернуть для таблицы значений. Для этого объединим строки по измерениям и применим функцию агрегации к ресурсам (например, суммирование или получение максимального показания):
ТаблицаДвижений = ТабличнаяЧасть.Выгрузить();
ТаблицаДвижений.Свернуть("Контрагент, Договор, Счетчик", "Показания");
После свертки в наборе останутся только уникальные комбинации измерений, что полностью исключит возникновение ошибки уникальности при записи.
Если каждая строка документа отражает замер в конкретный момент времени, необходимо привязать периодичность регистра к точной дате и времени. Рассмотрим возможные варианты настройки регистра в конфигураторе:
Период передается не просто дата (без времени), а точная дата и время проведения замера.НомерСтроки или ИдентификаторСтроки. Для независимых регистров при необходимости фиксации абсолютно всех событий добавляют измерение с типом УникальныйИдентификатор.Проанализируем случай, когда данные представляют собой постоянный поток событий или историю фиксации показателей, где допустимы дублирующиеся комбинации измерений. В таких сценариях использовать регистр сведений архитектурно неверно.
В отличие от регистра сведений, регистр накопления (вида «Обороты») не накладывает жестких ограничений на уникальность комбинаций измерений в рамках одного документа или периода. Если вам требуется хранить историю всех внесенных показаний без ограничения уникальности строк, рекомендуется заменить регистр сведений на оборотный регистр накопления.