Почему возникает ошибка записи в непериодический регистр сведений в 1С?

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

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

Суть проблемы: конфликты уникальности

В платформе 1С Регистр сведений — это объект, структура которого определяется его измерениями. Именно измерения формируют ключ уникальности записи. Если у вас в регистре МойРС измерением является только Договор, то в базе данных для каждого конкретного договора может существовать только одна-единственная запись.

Когда вы пытаетесь добавить новую строку с тем же договором, который уже есть в регистре, система выдает ошибку. Она справедливо считает, что вы нарушаете условие уникальности ключа, так как не понимает, должны ли новые данные заменить старые или вы пытаетесь создать дубль.

Разберем архитектурные способы решения

Прежде чем писать код, важно определить, как именно должны храниться данные. Рассмотрим несколько сценариев:

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

Правильная запись через НаборЗаписей

Частая ошибка — попытка добавлять записи в НаборЗаписей без предварительной настройки отбора. Если вы не установите отбор, набор записей при методе Записать() попытается записать всё, что в нем есть, не учитывая, что в базе уже могут быть конфликтующие данные. Чтобы работать корректно, давайте посмотрим на правильный алгоритм:

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


Процедура ЗаписатьСтатусДоговора(СтрокаТаблицы)
    // Создаем набор записей
    НаборЗаписей = РегистрыСведений.МойРС.СоздатьНаборЗаписей();
    
    // Устанавливаем отбор по измерению Договор
    // Это позволит нам работать только с записями конкретного договора
    НаборЗаписей.Отбор.Договор.Установить(СтрокаТаблицы.Договор);
    
    // Добавляем новую запись
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.Договор = СтрокаТаблицы.Договор;
    НоваяЗапись.Статус = СтрокаТаблицы.Статус;
    НоваяЗапись.Дата = СтрокаТаблицы.ДатаСтатуса;
    НоваяЗапись.Комментарий = СтрокаТаблицы.Комментарий;
    
    // Записываем данные
    // Метод Записать() с параметром Истина при установленном отборе 
    // автоматически перезапишет старые записи новыми для этого договора
    НаборЗаписей.Записать(Истина);
КонецПроцедуры

Использование Менеджера записи для точечных операций

Если вам нужно обработать только одну запись и вы не хотите использовать пакетную обработку через набор записей, воспользуйтесь объектом РегистрСведенийМенеджерЗаписи. Это удобный инструмент для точечной работы.

Алгоритм действий с менеджером записи:

  1. Создаете объект через СоздатьМенеджерЗаписи().
  2. Устанавливаете значения всех измерений (в нашем случае — Договор).
  3. Вызываете метод Прочитать(). Если запись существует, объект заполнится текущими данными из базы.
  4. Вносите изменения в ресурсы.
  5. Вызываете Записать().

Этот способ идеален, если логика программы подразумевает работу с конкретным объектом договора, так как он берет на себя всю рутину по проверке существования записи.

Подведем итоги

Для того чтобы избежать ошибки нарушения уникальности:

Теперь, применив эти знания, вы сможете настроить сохранение статусов договоров надежно и без конфликтов с платформой 1С!

← На главную