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

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

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

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

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

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

Ниже разобраны оба подхода с примерами кода, особенности периодических и подчинённых регистратору регистров, проверка результата и типичные ошибки, из-за которых данные «не меняются» или портятся.

Чем набор записей отличается от менеджера записи

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

Из этого следует ключевое правило безопасности: набор записей без установленного отбора при записи заменит всё содержимое регистра. Если вы создали набор, добавили одну строку и записали без отбора — все прочие данные регистра будут удалены. Это одна из самых разрушительных ошибок при работе с регистрами сведений.

Изменение одной записи через менеджер записи

Точечное изменение выполняется в четыре шага: создать менеджер, заполнить значения измерений (и период для периодического регистра), прочитать запись, изменить ресурсы и записать. Проверка Менеджер.Выбран() после чтения показывает, существовала ли запись — без неё легко не заметить, что отбор не сработал.

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

МенеджерЗаписи.Период = Дата(2026, 6, 1);

МенеджерЗаписи.Валюта = ВалютаСсылка;

МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда

МенеджерЗаписи.Курс = 95.5;

МенеджерЗаписи.Записать();

Иначе

Сообщить("Запись не найдена — проверьте измерения");

КонецЕсли;

Если запись нужно создать при отсутствии, ветку Иначе дополняют заполнением ресурсов и записью — менеджер после неуспешного чтения остаётся инициализированным измерениями, и Записать() создаст новую запись. Для удаления записи вместо изменения используется метод Удалить() у того же прочитанного менеджера.

Массовое изменение через набор записей

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

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

Набор.Отбор.ТипЦен.Установить(ТипЦенСсылка);

Набор.Прочитать();

Для Каждого Запись Из Набор Цикл

Запись.Цена = Запись.Цена * 1.1;

КонецЦикла;

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

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

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

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

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

Подходит для точечного изменения одной записи по известным измерениям. Безопасен: не затрагивает другие записи. Не подходит для массовых операций из-за обращений к БД в цикле.

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

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

Запрос + менеджер записи

Подходит для очень больших объёмов, когда набор не помещается в память. Медленнее набора на малых объёмах, требует больше кода.

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

В периодическом регистре сведений изменение «текущего» значения означает изменение записи на конкретную дату. Попытка записать новое значение на уже занятый период с теми же измерениями перезапишет существующую запись, а не создаст вторую — ключ уникальности включает период и измерения. Если нужна история, новое значение пишут на новую дату, а не правят старую.

Регистры сведений, подчинённые регистратору (режим записи «Подчинение регистратору»), нельзя корректно изменять напрямую менеджером записи или отдельным набором: их движения принадлежат документу-регистратору. Программное изменение делается через набор записей с отбором по регистратору, который затем записывается в составе ДокументОбъект.Движения, либо через перепроведение документа. Прямая правка в обход документа нарушает связность данных и считается аварийной мерой.

Маршрут решения

Как выбрать действие

Нужно изменить одну запись по известным измерениямИспользуйте менеджер записи: заполнить измерения, Прочитать(), изменить, Записать()
Нужно изменить группу записей по одному признакуНабор записей с отбором по этому признаку, Прочитать(), цикл изменений, Записать()
Регистр подчинён регистраторуИзменяйте движения через ДокументОбъект.Движения или перепроведите документ
Записей очень много и набор не помещается в памятьВыборка запросом по ключам и изменение каждой записи менеджером записи

Проверка результата и работа в транзакции

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

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

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

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

Существование записи после изменения
Норма

Менеджер записи с теми же измерениями возвращает Выбран() = Истина

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

Выбран() = Ложь — запись не создана или измерения указаны неверно

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

Совпадает с количеством до изменения

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

Стало меньше или больше — вероятно, запись выполнялась с неверным отбором

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

Повторное чтение возвращает новые значения

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

Старые значения — запись не выполнялась или откатилась транзакция

Типичные ошибки и ограничения

Самая частая причина «код отработал, но ничего не изменилось» — несовпадение типов или значений измерений: например, в отбор передана пустая ссылка вместо реальной, либо строка вместо ссылки на справочник. Вторая по частоте — отсутствие Прочитать() перед изменением: набор записывается пустым или с одной новой строкой, затирая данные в области отбора.

Также учитывайте права: у пользователя, от имени которого выполняется код (в том числе в фоновом задании), должны быть права на чтение и изменение регистра. В управляемом приложении код с обращением к регистрам выполняется на сервере — в клиентском контексте объекты регистров недоступны, поэтому в формах такие операции выносятся в серверные процедуры с директивой &НаСервере.

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

Часто задаваемые вопросы

Как изменить запись, если я не знаю точных значений всех измерений?

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

Можно ли изменить значение измерения у существующей записи?

Напрямую — нет: измерения входят в ключ записи. Нужно прочитать старую запись, создать новую с изменённым значением измерения и теми же ресурсами, записать её, а старую удалить через менеджер записи методом Удалить().

Чем отличается Записать(Истина) от Записать(Ложь) у набора записей?

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

Сработают ли обмены данными при программном изменении регистра?

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

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

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

Почему после записи в форме списка регистра не видно изменений?

Форма списка кэширует данные — обновите её вручную (F5 или команда «Обновить»). Если изменения выполнялись из этой же формы в клиентской процедуре, убедитесь, что запись выполнялась на сервере и транзакция завершилась без отката.

Итог

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

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