Разработка и Конфигурация · 9 мин
Как перезаписать регистр сведений в 1С
Как перезаписать регистр сведений в 1С: набор записей, менеджер записи, перезапись по измерениям и периоду. Примеры кода, проверка результата и типичные ошибки.
Перезапись регистра сведений — частая задача при внедрении и сопровождении 1С: нужно заменить устаревшие значения, очистить ошибочные записи или массово обновить данные после загрузки из внешней системы. В зависимости от того, подчинён регистр регистратору или независим, периодический он или нет, применяются разные механизмы платформы.
Основных способа два: работа через набор записей (РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей) и через менеджер записи (СоздатьМенеджерЗаписи). Набор записей подходит для массовой замены и удаления групп записей, менеджер — для точечного изменения одной строки по полному ключу измерений.
Ошибки при перезаписи регистра сведений могут привести к потере данных: например, запись пустого набора без отбора удалит все записи регистра. Поэтому перед любыми массовыми операциями необходимо сделать резервную копию информационной базы и проверить логику на копии базы.
Чем отличаются способы перезаписи регистра сведений
Набор записей — это коллекция строк регистра, которая читается и записывается целиком. Вы устанавливаете отбор по измерениям (и по регистратору или периоду, если они есть), читаете данные, изменяете их и записываете обратно. Метод Записать() без параметра замещает все записи, попадающие под отбор, содержимым набора.
Менеджер записи работает с одной строкой регистра. Вы заполняете значения измерений (и периода для периодического регистра), вызываете Прочитать(), меняете ресурсы и записываете. Этот способ безопаснее для точечных правок, потому что не затрагивает соседние записи, но медленнее при массовой обработке.
Сравнение вариантов
Подходит для массовой замены или удаления группы записей. Ограничение: ошибка в отборе может затронуть лишние данные.
Подходит для точечного изменения одной записи по ключу измерений. Ограничение: медленно при обработке тысяч строк.
Подходит, когда сначала нужно выбрать записи по сложному условию, а потом перезаписать. Требует аккуратной работы с ключами записей.
Перезапись через набор записей
Типовой сценарий: нужно заменить все записи по конкретному значению измерения, например перезаписать цены для одного товара или ответственных для одной организации. Создаётся набор записей, устанавливается отбор, набор читается, модифицируется и записывается.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Товар);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Запись.Цена = НоваяЦена;
КонецЦикла;
НаборЗаписей.Записать();Если нужно полностью заменить записи по отбору новыми данными, читать набор не обязательно: достаточно установить отбор, добавить новые строки методом Добавить() и вызвать Записать(). Старые записи, попадающие под отбор, будут замещены.
Важный нюанс: метод Записать(Ложь) записывает набор без замещения — добавляет строки к существующим. Для перезаписи используется именно Записать() или Записать(Истина), то есть режим замещения. Перепутав параметр, вы получите дубли или ошибку уникальности ключа.
Точечная перезапись через менеджер записи
Когда известен полный ключ записи — все измерения и период для периодического регистра — удобнее менеджер записи. Он не требует чтения всей выборки и не рискует затронуть чужие строки.
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ДатаКурса;
МенеджерЗаписи.Валюта = ВалютаСсылка;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Курс = НовыйКурс;
МенеджерЗаписи.Записать();
КонецЕсли;Если запись с таким ключом не существует, менеджер после Прочитать() вернёт Выбран() = Ложь. В этом случае заполните все поля и вызовите Записать() — будет создана новая запись. Тот же приём используют, когда нужно гарантированно создать или обновить запись без проверки существования.
Особенности периодических и подчинённых регистров
Для периодического регистра сведений период входит в ключ записи. При перезаписи через набор записей отбор по периоду устанавливается через Отбор.Период.Установить(Дата). Если отбор по периоду не задан, набор будет охватывать всю историю по указанным измерениям — учитывайте это при замещении.
Регистр, подчинённый регистратору, нельзя изменить напрямую: записи создаются и перезаписываются только движениями документа. Чтобы перезаписать такой регистр, нужно перепровести документ-регистратор или программно изменить его набор движений и записать документ. Попытка записать набор без отбора по регистратору вызовет ошибку.
Массовая перезапись и транзакции
При перезаписи большого объёма записей обрабатывайте данные порциями: выберите запросом ключи записей, затем в цикле обновляйте их пакетами, например по 500–1000 штук. Это снижает время блокировки таблицы и риск конфликтов в многопользовательском режиме.
Если перезапись должна быть атомарной — либо всё, либо ничего — оберните операции в транзакцию: НачатьТранзакцию(), ЗафиксироватьТранзакцию(), ОтменитьТранзакцию() в блоке Исключение. Помните, что длинная транзакция блокирует таблицу регистра для других пользователей, поэтому массовые обработки лучше запускать в нерабочее время или в монопольном режиме на копии.
Проверка результата после перезаписи
После записи убедитесь, что количество и содержимое записей соответствуют ожиданиям. Простой способ — выполнить запрос с подсчётом количества записей по отбору до и после операции, а также выборочно просмотреть несколько строк в режиме предприятия через список регистра.
Как проверить результат
Совпадает с ожидаемым числом изменённых строк
Записей больше или меньше — возможно, отбор был шире или уже нужного
Новые значения стоят у нужных ключей измерений
Изменились записи, которые не должны были затрагиваться
Показывают актуальные данные
Устаревшие или пустые значения — записи не перезаписались либо удалены
Типичные ошибки при перезаписи
Отдельная группа проблем — обмены данными. Если регистр участвует в плане обмена, программная перезапись может зарегистрировать изменения к выгрузке и разослать их по всем узлам. При загрузке данных из обмена используйте параметр ОтправкаДанных или отключайте регистрацию изменений осознанно.
Когда перезапись лучше доверить специалисту
Безопасная самостоятельная работа ограничивается тестовой базой и простыми точечными правками через менеджер записи. Если требуется массовая перезапись регистра, влияющего на учётные данные, исправление после сбоя обмена или восстановление удалённых записей — это зона ответственности разработчика или администратора 1С с доступом к резервным копиям.
Что важно запомнить
Массовую перезапись выполняйте набором записей с отбором и замещением, точечную — менеджером записи. Подчинённый регистратору регистр меняется только через документ. Перед любыми массовыми операциями — резервная копия и проверка на тестовой базе.
Частые вопросы
Как удалить все записи регистра сведений?
Создайте набор записей без отбора и вызовите Записать() — пустой набор заместит все существующие записи. Это необратимая операция: перед ней обязательно сделайте резервную копию. Для подчинённого регистратору регистра такой способ не работает — нужно отменять проведение документов.
Чем отличается Записать() от Записать(Ложь)?
Записать() или Записать(Истина) замещает записи под отбором содержимым набора — это режим перезаписи. Записать(Ложь) добавляет строки набора к существующим без замещения, что при совпадении ключей вызовет ошибку уникальности.
Можно ли перезаписать регистр сведений без программирования?
Для независимых регистров — частично: в режиме предприятия можно редактировать записи вручную через форму списка, а в некоторых конфигурациях есть обработки группового изменения реквизитов. Массовая перезапись по сложным условиям без кода невозможна.
Почему после перезаписи появились дубли записей?
Чаще всего использовался режим Записать(Ложь) без замещения, либо в набор добавлялись строки с уже существующими ключами. В независимом регистре дубли по полному ключу измерений невозможны физически — платформа выдаст ошибку, поэтому проверьте, не различаются ли записи по периоду или регистратору.
Как перезаписать записи регистра, подчинённого регистратору?
Напрямую — никак. Нужно получить документ-регистратор, изменить его набор движений (через Движения.ИмяРегистра) и записать документ в режиме проведения, либо перепровести документы пакетно через обработку проведения.
Уйдут ли перезаписанные данные в обмен с другой базой?
Если регистр включён в план обмена и изменения регистрируются автоматически — да, при следующей выгрузке. Чтобы этого избежать при служебной загрузке, отключайте регистрацию изменений для узлов через ПланыОбмена.УдалитьРегистрациюИзменений или используйте параметры обмена данными.