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