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