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