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

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

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

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

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

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

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

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

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

Перезаписать запись — значит сохранить запись с уже существующим ключом, но с новыми значениями ресурсов или реквизитов. Платформа при этом физически обновляет строку в таблице регистра, а не добавляет новую. Если же вы записываете данные с ключом, которого ещё нет, выполняется добавление — внешне операция выглядит так же, поэтому перед перезаписью полезно убедиться, что запись существует.

Способ 1. Перезапись через менеджер записи

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

МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Период = Дата(2026, 3, 15);

МенеджерЗаписи.Валюта = ВалютаСсылка;

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

Если МенеджерЗаписи.Выбран() Тогда

МенеджерЗаписи.Курс = 92.5;

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

Иначе

Сообщить("Запись с таким ключом не найдена");

КонецЕсли;

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

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

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

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

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Номенклатура.Установить(НоменклатураСсылка);

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

Для Каждого Запись Из НаборЗаписей Цикл

Запись.Цена = Запись.Цена * 1.1;

КонецЦикла;

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

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

Способ 3. Интерактивная перезапись через форму

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

Для регистров, подчинённых регистратору, ручное редактирование недоступно: записи создаются и изменяются только при проведении документа-регистратора. Чтобы перезаписать такую запись, нужно открыть документ, скорректировать данные и перепровести его. Попытка изменить записи программно в обход регистратора нарушит связь документа с движениями.

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

Перезапись в периодических регистрах и режим «Подчинение регистратору»

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

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

НаборЗаписей = РегистрыСведений.СтатусыДокументов.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);

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

Если НаборЗаписей.Количество() > 0 Тогда

НаборЗаписей[0].Статус = Перечисления.Статусы.Согласован;

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

КонецЕсли;

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

Сравнение способов перезаписи

Менеджер записи

Одна запись по известному ключу. Простой и безопасный код, но не подходит для массовых изменений.

Набор записей с отбором

Группа записей или работа через регистратор. Требует обязательного отбора и чтения перед записью.

Интерактивное редактирование

Разовое исправление вручную. Не работает для регистров, подчинённых регистратору.

Перепроведение документа

Единственный корректный способ для регистров с режимом подчинения регистратору.

Массовая перезапись и транзакции

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

НачатьТранзакцию();

Попытка

// чтение, изменение и запись наборов

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение ОписаниеОшибки();

КонецПопытки;

В клиент-серверном режиме длинные транзакции удерживают блокировки и мешают работе пользователей. Разбивайте обработку на порции (например, по 500–1000 записей) с фиксацией каждой порции, либо выполняйте обработку в фоновом задании в нерабочее время.

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

Проверка результата и типичные ошибки

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

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

Отдельная группа проблем — блокировки при конкурентной работе. Если перезапись выполняется в многопользовательской базе и запись в этот момент редактирует другой пользователь или фоновое задание, вы получите ошибку конфликта блокировок. Обрабатывайте её через попытку/исключение и повторяйте операцию с паузой, а не принудительным снятием блокировок.

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

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

Запрос по ключу записи
Норма

Возвращается одна запись с новыми значениями ресурсов

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

Записей две и больше или значения старые

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

Не изменилось после перезаписи

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

Увеличилось — создана лишняя запись, уменьшилось — что-то удалено

СрезПоследних для периодического регистра
Норма

Показывает обновлённое значение на нужную дату

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

Возвращает старое значение или пусто

FAQ

Чем перезапись отличается от добавления записи?

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

Как перезаписать запись, не зная точного ключа?

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

Можно ли перезаписать записи регистра, подчинённого регистратору, вручную?

Интерактивно — нет, форма набора записей такого регистра доступна только из документа-регистратора. Корректный путь — изменить документ и перепровести его. Программная правка в обход документа возможна, но будет потеряна при следующем перепроведении.

Что произойдёт, если вызвать Записать(Ложь) для существующей записи?

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

Как безопасно перезаписать тысячи записей в рабочей базе?

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

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

Чаще всего отчёт использует кэшированные данные или виртуальную таблицу с другими параметрами отбора. Обновите отчёт и проверьте, что перезаписана запись именно с тем периодом и измерениями, которые попадают в отбор отчёта.

Итог

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

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