Как правильно перезаписать запись в периодическом независимом регистре сведений в 1С?

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

Работа с РегистрамиСведений — это базовая задача для любого разработчика 1С. Однако периодические регистры сведений, особенно независимые, часто вызывают затруднения при попытке программного обновления данных. Давайте разберем, как избежать ошибок при поиске, изменении и сохранении записей.

Понимание структуры периодического регистра

Прежде чем приступать к написанию кода, важно помнить: периодический регистр требует обязательного указания Периода для идентификации записи. Если вы используете МенеджерЗаписи, платформа ожидает, что вы передадите полный набор ключевых полей (измерения плюс период), чтобы точно локализовать запись в базе данных.

Решение через МенеджерЗаписи

Использование МенеджерЗаписи — это самый безопасный и прозрачный способ для изменения одной конкретной записи. Рассмотрим пошагово, как это сделать правильно:

  1. Создаем экземпляр менеджера записи.
  2. Заполняем ключевые поля, которые составляют уникальный ключ записи (Измерения + Период).
  3. Вызываем метод Прочитать(), чтобы получить данные из базы в объект менеджера.
  4. Изменяем необходимые поля (ресурсы или реквизиты).
  5. Вызываем метод Записать().

Посмотрим на пример корректного кода:


МенеджерЗаписи = РегистрыСведений.RGS_Оповещения.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = СтруктураЗаписи.Период;
МенеджерЗаписи.Объект = СтруктураЗаписи.Объект;
МенеджерЗаписи.ТипОповещения = СтруктураЗаписи.ТипОповещения;

МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда
    МенеджерЗаписи.Оповещен = Истина;
    МенеджерЗаписи.Записать(Истина);
КонецЕсли;

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

Использование НабораЗаписей для групповой обработки

Если нам необходимо изменить несколько записей за раз, МенеджерЗаписи будет неэффективен. В этом случае мы обращаемся к НаборЗаписей. Здесь критически важно правильно настроить Отбор.

Если вы установите отбор только по одному измерению, платформа воспримет это как команду работать со всеми записями, попадающими под этот фильтр. При вызове Записать() все записи, не вошедшие в текущий набор (но соответствующие отбору), могут быть удалены.

Рассмотрим безопасный подход:


НаборЗаписей = РегистрыСведений.RGS_Оповещения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ТипОповещения.Установить(СтруктураЗаписи.ТипОповещения);
НаборЗаписей.Отбор.Период.Установить(СтруктураЗаписи.Период);
// Обязательно учитывайте все ключевые измерения для точного отбора!
НаборЗаписей.Отбор.Объект.Установить(СтруктураЗаписи.Объект);

НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл
    Запись.Оповещен = Истина;
КонецЦикла;

НаборЗаписей.Записать();

Типичные ошибки при разработке

Проанализируем ситуации, которые приводят к ошибкам:

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

← На главную