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

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

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

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

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

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

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

Как устроена перезапись: набор записей и замещение

Регистр в 1С физически представляет собой таблицу, но платформа не даёт «обновить одну строку» напрямую встроенным языком. Вместо этого используется объект «Набор записей», который при записи полностью замещает данные, попадающие под его отбор. Если отбор установлен по регистратору — будут замещены все движения этого документа; если по значениям измерений — конкретные записи.

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

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

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

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

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

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

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

Запись.Количество = 10; // корректируем значение

КонецЦикла;

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

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

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

bsl
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ДатаКурса);
НаборЗаписей.Отбор.Валюта.Установить(ВалютаСсылка);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
    НаборЗаписей[0].Курс = НовыйКурс;
    НаборЗаписей.Записать();
КонецЕсли;

Способ 2. Менеджер записи для независимых регистров сведений

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

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

МенеджерЗаписи.Номенклатура = НоменклатураСсылка;

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

МенеджерЗаписи.Период = ТекущаяДатаСеанса();

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

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

МенеджерЗаписи.Цена = НоваяЦена;

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

КонецЕсли;

Если запись с таким ключом не существует, Выбран() вернёт Ложь, и вызов Записать() создаст новую запись. Это удобно для сценария «обновить или добавить», но требует аккуратности: убедитесь, что заполнены все измерения, входящие в ключ уникальности.

Способ 3. Перепроведение документа-регистратора

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

ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Для массовой обработки используйте обработку «Проведение документов» (в типовых конфигурациях доступна в разделе администрирования) или типовой механизм восстановления последовательностей. Программная пакетная перезапись выполняется циклом с выборкой по периоду и виду документа.

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

Сравнение вариантов

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

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

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

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

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

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

Ручная правка в режиме предприятия

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

Интерактивная перезапись в режиме предприятия

Независимые регистры сведений можно редактировать вручную: откройте регистр через «Все функции» → «Регистры сведений», найдите запись по отбору, измените значения и запишите. Для периодических регистров действие «Перейти к записи» из карточки объекта открывает именно нужную строку истории.

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

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

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

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

Если запись «не появилась», проверьте три вещи: выполнялся ли код в транзакции, которая откатилась из-за исключения; совпадают ли значения отбора с фактическими значениями в регистре (например, пустая ссылка вместо заполненной); не сработала ли подписка на событие, отменившая запись.

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

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

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

Отчёт по регистру с отбором по регистратору
Норма

Движения соответствуют ожидаемым значениям после изменения

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

Движения пустые или содержат старые значения

Количество записей в наборе после Прочитать()
Норма

Число совпадает с ожидаемым количеством строк

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

Ноль записей — отбор не сработал, проверьте значения отбора

Повторное чтение после Записать()
Норма

Прочитанные значения равны записанным

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

Значения отличаются — сработала подписка или откатилась транзакция

Период записи в периодическом регистре
Норма

Дата соответствует нужному периоду

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

Пустая дата или неверный период — не заполнено свойство Период

Частые вопросы

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

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

Что произойдёт, если вызвать Записать() у пустого набора с отбором?

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

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

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

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

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

Нужны ли особые права для перезаписи регистров?

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

Итог

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

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