Разработка и Конфигурация · 10 мин
Как перезаписать регистр сведений в 1С 8
Как перезаписать регистр сведений в 1С 8.3: через набор записей, менеджер записи, запрос и обработку. Примеры кода, очистка, типичные ошибки и проверка результата.
Перезапись регистра сведений — типовая задача при исправлении ошибочных данных, загрузке курсов валют, цен, штрихкодов или при переносе информации между базами. В зависимости от объёма и цели применяются разные инструменты: набор записей, менеджер записи, запрос или внешняя обработка. Выбор способа влияет на скорость, безопасность транзакции и риск потери данных.
Главное правило: регистр сведений хранит данные без документов-регистраторов (если он независимый) либо подчинён регистратору (тогда перезаписывать его нужно через документ). Перед любой массовой перезаписью обязательно делается резервная копия — обратного восстановления после «Записать» без копии не существует.
Ниже разобраны рабочие способы перезаписи с примерами кода на встроенном языке, ограничения каждого подхода и контрольные точки для проверки результата.
Способы перезаписи: что выбрать под задачу
В 1С 8.3 существует четыре основных способа изменить содержимое регистра сведений. Первый — набор записей с установленным отбором и методом Записать(Истина): он полностью замещает записи, попадающие под отбор. Второй — менеджер записи (РегистрыСведений.Имя.СоздатьМенеджерЗаписи()), который работает с одной строкой по полному ключу измерений.
Третий способ — запрос с конструкцией выборки и последующей записью через набор: подходит для массовой обработки, когда нужно изменить тысячи строк. Четвёртый — интерактивная перезапись через форму списка регистра или универсальные обработки вроде «Групповое изменение реквизитов» (доступна в конфигурациях на БСП).
Сравнение способов перезаписи
Замещает все записи по отбору. Быстро, но при пустом наборе и Записать(Истина) удалит данные по отбору.
Точечная работа с одной строкой по ключу измерений. Безопасен, но медленен для массовых операций.
Оптимален для массовых изменений с условиями. Требует аккуратной транзакции.
Без программирования, но только в конфигурациях на БСП и с ограниченной логикой.
Перезапись через набор записей
Набор записей — основной инструмент. Логика такова: создаётся набор, устанавливается отбор по измерениям (и периоду для периодических регистров), набор заполняется новыми строками и записывается с замещением. Всё, что было в базе по этому отбору, будет заменено содержимым набора.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(НужнаяНоменклатура);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Номенклатура = НужнаяНоменклатура;
НоваяЗапись.ВидЦены = ВидЦены;
НоваяЗапись.Цена = 1500;
НаборЗаписей.Записать(Истина); // Истина = замещение существующих записей
Параметр Истина в методе Записать() означает замещение: платформа удаляет все строки, попадающие под отбор, и записывает новые. Если передать Ложь (или не указывать параметр), набор попытается добавить записи — при совпадении ключа измерений возникнет ошибка уникальности.
Если записать пустой набор с замещением — все записи по отбору будут удалены. Это легальный способ очистки, но и частая причина случайной потери данных, когда отбор забыли установить: тогда очищается весь регистр целиком.
Точечная перезапись одной записи
Когда нужно изменить одну конкретную строку, удобнее менеджер записи. Он работает по полному ключу: все измерения плюс период для периодического регистра. Если ключ задан неточно — запись не найдётся и будет создана новая строка вместо изменения существующей.
Менеджер = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
Менеджер.Штрихкод = "4601234567890";
Менеджер.Прочитать();
Если Менеджер.Выбран() Тогда
Менеджер.Владелец = НовыйВладелец;
Менеджер.Записать();
КонецЕсли;
Метод Прочитать() загружает существующую запись, Выбран() показывает, найдена ли она. Запись менеджера замещает строку с тем же ключом — это безопасная точечная перезапись без риска задеть соседние данные.
Массовая перезапись через запрос
Для пересчёта или исправления большого массива строк сначала выбирают данные запросом, затем пишут их обратно наборами, сгруппированными по отбору. Важно выполнять операцию в транзакции, чтобы при сбое база не осталась в полуизменённом состоянии.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Курсы.Валюта КАК Валюта,
| Курсы.Период КАК Период,
| Курсы.Курс КАК Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК Курсы
|ГДЕ
| Курсы.Курс = 0";
Выборка = Запрос.Выполнить().Выбрать();
НачатьТранзакцию();
Пока Выборка.Следующий() Цикл
Менеджер = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Менеджер.Валюта = Выборка.Валюта;
Менеджер.Период = Выборка.Период;
Менеджер.Курс = НовыйКурсПоУсловию;
Менеджер.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Для очень больших объёмов (сотни тысяч строк) поштучная запись менеджером медленная. В этом случае группируйте данные по значению отбора и пишите наборами — один набор на группу. Это сокращает число обращений к базе в разы.
Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей();
Набор.Отбор.Номенклатура.Установить(ТекНоменклатура);
Набор.Прочитать();
Для Каждого Строка Из Набор Цикл
Строка.Цена = Строка.Цена * 1.1;
КонецЦикла;
Набор.Записать(Истина);Перезапись подчинённого регистра
Если регистр сведений подчинён регистратору (режим «Подчинение регистратору»), перезаписывать его напрямую нельзя — записи создаются и изменяются только движениями документа. Попытка записать набор без отбора по регистратору завершится ошибкой.
Правильный путь: получить набор записей через объект документа (ДокументОбъект.Движения.ИмяРегистра), изменить строки и записать документ или сам набор движений с замещением. Альтернатива — перепровести документ, если движения формируются кодом проведения.
Полная очистка и перезапись регистра
Иногда требуется полностью очистить регистр и загрузить данные заново — например, при повторной миграции. Для очистки достаточно записать пустой набор без отбора с замещением. Операция необратима, поэтому выполняйте её только после выгрузки копии (через выгрузку в файл, выгрузку данных в XML или копию базы).
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать(Истина); // регистр полностью очищен
После очистки загружайте новые данные порциями: один набор на логическую группу записей внутри транзакции. Это снижает нагрузку на СУБД и позволяет откатиться при ошибке загрузки.
- 1Сделайте резервную копию базы или выгрузите регистр в файл
- 2Определите режим регистра: независимый или подчинён регистратору
- 3Напишите код с отбором и транзакцией, протестируйте на копии
- 4Выполните перезапись в рабочей базе в монопольном или малонагруженном режиме
- 5Проверьте количество записей и контрольные значения до и после
Типичные ошибки и как их избежать
Наиболее разрушительная ошибка — запись пустого набора без отбора, которая стирает весь регистр. Вторая по частоте — неверный ключ измерений при работе менеджером записи: вместо изменения строки создаётся дубль. Третья — попытка записать набор подчинённого регистра без указания регистратора.
Также часто забывают, что у периодического регистра ключ включает период: две записи с одинаковыми измерениями, но разными датами — это разные строки. При перезаписи без учёта периода данные «схлопываются» или дублируются.
Проверка результата после перезаписи
После выполнения кода сравните количество записей до и после операции — простой запрос ВЫБРАТЬ КОЛИЧЕСТВО(*) по регистру покажет, не пропало ли лишнее. Выборочно откройте несколько строк через форму списка регистра и сверьте значения ресурсов с ожидаемыми.
Если регистр участвует в отчётах (цены, курсы, остатки по штрихкодам), сформируйте связанный отчёт и убедитесь, что цифры согласуются с данными до перезаписи — с учётом внесённых изменений.
Как проверить результат
Совпадает с ожидаемым после операции
Резко уменьшилось — вероятна потеря данных из-за неверного отбора
Значения ресурсов изменены как задумано
Появились дубли по ключу измерений
Показатели согласованы с данными
Отчёт пустой или с аномальными значениями
Частые вопросы
Чем отличается Записать(Истина) от Записать(Ложь)?
Параметр Истина включает режим замещения: все записи по установленному отбору удаляются и заменяются содержимым набора. При Ложь набор добавляет строки, и при совпадении ключа измерений возникает ошибка нарушения уникальности индекса.
Можно ли перезаписать регистр сведений без программирования?
Да, в конфигурациях на Библиотеке стандартных подсистем есть обработка «Групповое изменение реквизитов», которая умеет массово менять значения в регистрах сведений. Также одиночные записи редактируются вручную через форму списка регистра в режиме предприятия.
Как перезаписать только часть записей, а не весь регистр?
Установите отбор набора записей по нужным измерениям (например, по конкретной номенклатуре или организации) и выполните Записать(Истина). Замещение затронет только строки, попадающие под отбор, остальные данные не изменятся.
Почему после перезаписи появились дубли записей?
Чаще всего причина — запись менеджером без предварительного чтения существующей строки или с неточно заданным ключом измерений. Платформа воспринимает такую запись как новую. Проверьте, что все измерения и период заполнены точно как у целевой строки.
Как восстановить регистр, если данные были стёрты ошибочно?
Только из резервной копии: восстановлением всей базы или выборочной загрузкой данных регистра через обработку выгрузки/загрузки XML. Журнал регистрации зафиксирует факт изменения, но не восстановит сами данные.
Что важно запомнить
Перезапись регистра сведений выполняется набором записей с Записать(Истина) по отбору или менеджером записи для одиночной строки. Подчинённые регистры меняются только через документы-регистраторы. Всегда проверяйте отбор, используйте транзакцию и делайте резервную копию перед массовыми операциями.