Почему возникает ошибка «Запись с такими ключевыми полями существует» при записи в регистр сведений?

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

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

Понимание природы ключевых полей

Первое, что необходимо усвоить — это архитектурное отличие Измерений от Ресурсов и Реквизитов. В 1С уникальность записи в регистре сведений определяется исключительно набором его измерений.

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

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

Правильная архитектура движений документа

Часто ошибки возникают из-за попытки записи в регистр из внешней обработки или произвольной функции. Это нарушает принцип транзакционности платформы 1С. Рассмотрим, как это сделать правильно.

  1. Используйте процедуру ОбработкаПроведения: Весь код по формированию движений должен находиться в модуле объекта документа в предопределенной процедуре ОбработкаПроведения. Это гарантирует, что движения будут созданы в рамках одной транзакции с документом. Если запись регистра не удастся, проведение документа будет отменено.
  2. Используйте коллекцию Движения: Не стоит создавать набор записей через РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей() в произвольных местах. Вместо этого обращайтесь к коллекции Движения, которая доступна внутри модуля объекта.

Рассмотрим правильный пример реализации кода в модуле объекта документа:


Процедура ОбработкаПроведения(Отказ, Режим)
    // Указываем, что движения данного регистра необходимо записывать
    Движения.ДанныеЗаправок.Записывать = Истина;
    
    // Очистка не требуется, так как при записи набора 
    // с установленным отбором по регистратору 1С сама управляет перезаписью
    
    Для Каждого ТекСтрока Из ДанныеГСМ Цикл
        // Создаем новую запись в наборе
        Движение = Движения.ДанныеЗаправок.Добавить();
        
        // Заполняем поля записи
        Движение.Период = Дата;
        Движение.Регистратор = Ссылка;
        Движение.Водитель = ТекСтрока.Водитель;
        Движение.ГосНомер = ТекСтрока.ГосНомер;
        // Здесь должны быть поля, которые вы добавили в измерения
        Движение.ИдентификаторСтроки = ТекСтрока.НомерСтроки; 
        
        // Заполняем ресурсы
        Движение.Объем = ТекСтрока.Объем;
        Движение.Количество = ТекСтрока.Количество;
    КонецЦикла;
КонецПроцедуры

Почему перенос данных в ресурсы не решил проблему?

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

Итоговый чек-лист для исправления ошибки:

Если вы столкнулись с ошибкой записи в регистр, выполните следующие шаги:

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

← На главную