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

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

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

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

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

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

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

Чем отличаются способы перезаписи регистра сведений

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

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

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

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

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

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

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

Запрос с последующей записью

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

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

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

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

Для Каждого Запись Из НаборЗаписей Цикл
    Запись.Цена = НоваяЦена;
КонецЦикла;

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

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

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

Точечная перезапись через менеджер записи

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

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

Если МенеджерЗаписи.Выбран() Тогда
    МенеджерЗаписи.Курс = НовыйКурс;
    МенеджерЗаписи.Записать();
КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

Совпадает с ожидаемым числом изменённых строк

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

Записей больше или меньше — возможно, отбор был шире или уже нужного

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

Новые значения стоят у нужных ключей измерений

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

Изменились записи, которые не должны были затрагиваться

Отчёты, использующие регистр
Норма

Показывают актуальные данные

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

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

Типичные ошибки при перезаписи

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

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

Когда перезапись лучше доверить специалисту

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

Итог

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

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

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

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

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

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

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

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

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

Почему после перезаписи появились дубли записей?

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

Как перезаписать записи регистра, подчинённого регистратору?

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

Уйдут ли перезаписанные данные в обмен с другой базой?

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