К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как перезаписать запись регистра сведений в 1С

Как перезаписать запись регистра сведений в 1С: менеджер записи, набор записей, типовые команды, проверка результата, частые ошибки и FAQ.

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

Выбор способа зависит от структуры регистра. Для независимого непериодического регистра запись однозначно определяется значениями измерений. Для периодического добавляется период, а для подчинённого регистратору запись существует только внутри набора записей конкретного документа — тогда перезаписывать нужно весь набор.

Ниже разобраны рабочие варианты кода, условия их применения, проверка результата и ошибки, из-за которых перезапись «молча» не срабатывает или затирает лишние данные.

Как устроена запись регистра сведений и что значит «перезаписать»

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

Из этого следует важное практическое правило: чтобы «обновить» запись, достаточно записать её заново с теми же измерениями. А чтобы изменить само значение измерения, нужно сначала удалить старую запись и записать новую — простого «переименования ключа» не существует.

Перезапись одной записи через МенеджерЗаписи

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

bsl
Менеджер = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
Менеджер.Номенклатура = НоменклатураСсылка;
Менеджер.ТипЦен = ТипЦенСсылка;
Менеджер.Период = ДатаНачала;
Менеджер.Прочитать();
Если Менеджер.Выбран() Тогда
    Менеджер.Цена = НоваяЦена;
    Менеджер.Записать(Истина);
Иначе
    // записи с таким ключом нет — при Записать() она будет создана
КонецЕсли;

Обратите внимание на проверку Выбран(): если записи с заданным ключом нет, Прочитать() оставит менеджер пустым, а Записать() создаст новую запись. Это не всегда желаемое поведение — при корректировке данных важно различать «обновить существующую» и «создать новую».

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

Перезапись через набор записей с отбором

Набор записей нужен, когда требуется перезаписать несколько записей сразу или когда регистр подчинён регистратору. Набор создаётся, на него накладывается отбор по измерениям (или по регистратору), затем набор читается, изменяется и записывается.

bsl
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(НужнаяДата);
Набор.Отбор.Валюта.Установить(ВалютаСсылка);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
    Запись.Курс = НовыйКурс;
КонецЦикла;
Набор.Записать(Истина);

Критический момент: набор записывает ровно то, что содержит. Если вы не вызвали Прочитать() и сразу добавили записи вручную, Записать() заменит все записи, попадающие под отбор, содержимым набора. Пустой набор с отбором — это команда «удалить всё по отбору». Поэтому схема «прочитать → изменить → записать» обязательна, если нужно сохранить остальные поля и записи.

Параметр Записать(Истина) означает замещение существующих записей. Записать(Ложь) при совпадении ключей вызовет ошибку — этот режим используют, когда нужно гарантировать отсутствие дублей.

Особенности для периодических и подчинённых регистров

Периодический регистр сведений

Ключ записи включает период. Чтобы перезаписать значение на конкретную дату, период в отборе или в менеджере записи должен совпадать с точностью до секунды (или до той точности, что задана в свойствах регистра). Частая причина «не перезаписывается» — расхождение периода на одну секунду: вместо замены создаётся вторая запись.

Регистр, подчинённый регистратору

Менеджер записи здесь недоступен. Записи принадлежат набору документа-регистратора, поэтому отбор накладывается по регистратору. После изменения набора запись выполняется в контексте этого документа. Учтите: при перепроведении документа платформа может сама перезаписать набор и затереть ручные правки, если движения формируются в обработчике проведения.

Интерактивная перезапись без программирования

Если задача разовая, код писать не обязательно. В пользовательском режиме запись редактируется прямо в форме списка регистра: откройте регистр (через «Ещё» → нужный регистр в разделе настроек или через функциональность «Все функции» → «Регистры сведений»), найдите запись отбором, откройте её, измените поля и нажмите «Записать и закрыть».

Для массовой правки без кода используют типовые обработки вроде «Групповое изменение реквизитов» (в конфигурациях на БСП) — она умеет изменять ресурсы регистров сведений по отбору. Универсальные обработки «поиск и замена значений» тоже подходят, но применяйте их с отбором и на копии.

Порядок безопасной перезаписи
  1. 1
    Сделайте резервную копию базы или выгрузку в dt
  2. 2
    Определите тип регистра: независимый, периодический или подчинённый регистратору
  3. 3
    Выберите инструмент: менеджер записи, набор записей или интерактивную форму
  4. 4
    Выполните перезапись на копии и проверьте результат запросом
  5. 5
    Повторите в рабочей базе и ещё раз сверьте количество и значения записей

Проверка результата перезаписи

После записи убедитесь, что изменения применились именно так, как задумано. Самый надёжный способ — запрос к регистру с тем же отбором: проверьте количество записей до и после, значения ресурсов и отсутствие дублей по ключу.

В коде полезно обернуть перезапись в транзакцию при пакетной обработке: тогда ошибка на середине не оставит регистр в частично изменённом состоянии. Для разовой правки одной записи транзакция избыточна — платформа сама фиксирует запись атомарно.

Контрольные точки

Как проверить результат

Количество записей по отбору до и после
Норма

Совпадает с ожидаемым: обновление не добавило дублей

Тревожный признак

Записей стало больше — ключ измерений или период не совпал

Значения ресурсов
Норма

Новые значения видны в форме списка и в запросе

Тревожный признак

Старые значения — запись не выполнялась или был другой отбор

Записи, не попадавшие под отбор
Норма

Не изменились

Тревожный признак

Затёрты — вероятно, набор записан без Прочитать() или без отбора

Частые ошибки при перезаписи

Большинство проблем связано не с синтаксисом, а с неверным пониманием ключа записи и поведения набора записей. Ниже — типовые сценарии, которые приводят к потере данных или «молчаливому» отсутствию эффекта.

Типичные ошибки
01
Запись набора без Прочитать() — старые записи по отбору полностью заменяются содержимым набора, несохранённые поля обнуляются
02
Несовпадение периода на секунду в периодическом регистре — вместо замены создаётся дубль с новым ключом
03
Попытка использовать МенеджерЗаписи для регистра, подчинённого регистратору — метод недоступен, нужен набор записей с отбором по регистратору
04
Отсутствие отбора у набора записей — Записать() затрагивает весь регистр, что может уничтожить все данные
05
Изменение измерения через простую перезапись — старая запись остаётся, появляется вторая; старую нужно удалить явно

FAQ

Как перезаписать запись, если нужно изменить само измерение?

Измерение — часть ключа, его нельзя «обновить». Прочитайте старую запись, запомните ресурсы, удалите запись по старому ключу (пустой набор записей с отбором по старому ключу), затем запишите новую запись с изменённым измерением и сохранёнными ресурсами.

Чем отличается Записать(Истина) от Записать(Ложь)?

Записать(Истина) — режим замещения: записи с совпадающими ключами заменяются. Записать(Ложь) — режим добавления: при совпадении ключей возникает ошибка. Для перезаписи используйте замещение, для контроля дублей — добавление.

Можно ли перезаписать запись регистра без прав программиста?

Да, если у пользователя есть права на изменение регистра. Откройте форму списка регистра через «Все функции» → «Регистры сведений», найдите запись отбором и отредактируйте её. Для массовых правок в типовых конфигурациях есть обработка «Групповое изменение реквизитов».

Почему после перезаписи данные снова стали старыми?

Чаще всего регистр подчинён регистратору, и документ был перепроведён — обработчик проведения сформировал движения заново. Проверьте свойство регистра «Режим записи». Если он подчинён регистратору, исправляйте данные через документ, а не напрямую в регистре.

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

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

Опасно ли перезаписывать регистры сведений в рабочей базе?

Риск определяется отбором и режимом записи. Точечная правка одной записи через менеджер записи безопасна. Опасны наборы записей без отбора и без предварительного Прочитать() — они могут затереть весь регистр. Перед массовыми операциями делайте резервную копию.

Итог

Что важно запомнить

Одну запись независимого регистра перезаписывают через МенеджерЗаписи, несколько или подчинённые регистратору — через набор записей с отбором. Всегда читайте набор перед изменением, проверяйте совпадение ключа и периода и делайте резервную копию перед массовой правкой.