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