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