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