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

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

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

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

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

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

Ниже разобраны оба механизма с рабочим кодом для управляемого приложения (встроенный язык 1С 8.3), способы массового изменения, контроль результата и ошибки, которые чаще всего приводят к дублям и потере данных.

Как устроена запись регистра сведений и почему это важно

Запись регистра сведений состоит из измерений (ключ), ресурсов (изменяемые данные) и реквизитов (дополнительная информация). Изменять программно имеет смысл ресурсы и реквизиты; изменение измерения фактически означает удаление старой записи и создание новой, потому что измерения — это ключ.

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

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

Стандартный сценарий: создать менеджер записи, заполнить измерения (и период), вызвать Прочитать(), проверить Выбран(), изменить ресурсы и вызвать Записать(). Если запись не найдена, а вы всё равно запишете — будет создана новая.

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

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

МенеджерЗаписи.Номенклатура = НоменклатураСсылка;

МенеджерЗаписи.ТипЦен = ТипЦенСсылка;

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

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

МенеджерЗаписи.Цена = 1500;

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

Иначе

Сообщить("Запись с таким ключом не найдена");

КонецЕсли;

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

Порядок изменения одной записи
  1. 1
    Определите точный ключ: все измерения и период для периодического регистра
  2. 2
    Создайте менеджер записи и заполните ключевые поля
  3. 3
    Вызовите Прочитать() и проверьте Выбран()
  4. 4
    Измените ресурсы или реквизиты, не трогая измерения
  5. 5
    Вызовите Записать() и проверьте результат запросом или в форме списка

Изменение нескольких записей через набор записей

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

НаборЗаписей = РегистрыСведений.ОтветственныеЛица.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Организация.Установить(ОрганизацияСсылка);

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

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

Запись.Ответственный = НовыйОтветственный;

КонецЦикла;

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

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

Массовое изменение по сложному условию

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Цены.Период,

| Цены.Номенклатура,

| Цены.ТипЦен,

| Цены.Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК Цены

|ГДЕ

| Цены.Цена < &МинимальнаяЦена";

Запрос.УстановитьПараметр("МинимальнаяЦена", 100);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);

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

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

МенеджерЗаписи.Цена = 100;

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

КонецЕсли;

КонецЦикла;

При больших объёмах (десятки тысяч записей) оборачивайте обработку в транзакцию порциями или выполняйте в фоновом задании, чтобы не блокировать работу пользователей и не получить тайм-аут. Монопольная длинная транзакция на регистре, который активно используется в документах, приведёт к конфликтам блокировок.

Способы изменения записей

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

Одна запись по точному ключу. Просто и безопасно, но медленно при массовой обработке — обращение к базе на каждую строку.

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

Группа записей по равенству измерений. Быстро, одна транзакция, но отбор только на равенство и риск удаления при записи без чтения.

Запрос + обход

Сложные условия выборки. Гибко, но требует аккуратности с транзакциями и производительностью.

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

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

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

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

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

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

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

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

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

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

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

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

Значение ресурса после записи
Норма

Запрос по ключу возвращает новое значение

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

Старое значение или пустой результат — запись не изменилась или ключ не совпал

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

Ровно одна запись на комбинацию измерений

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

Несколько похожих записей — дубли из-за неполного ключа

Движения подчинённого регистра
Норма

Изменения сделаны через документ и видны в его движениях

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

Записи правились напрямую — перепроведение документа затрёт изменения

Итог

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

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

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

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

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

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

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

Почему Прочитать() не находит запись, хотя она есть в списке?

Чаще всего не совпадает ключ: не заполнено одно из измерений, не указан Период для периодического регистра или ссылка относится к другому типу (например, элемент другого справочника с похожим наименованием). Сверьте все ключевые поля со значениями в форме списка регистра.

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

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

Как изменить записи регистра, если нет прав на интерактивное редактирование?

Программная запись выполняется с правами текущего пользователя, но можно использовать УстановитьПривилегированныйРежим(Истина) в серверном коде — тогда проверка прав отключается. Применяйте привилегированный режим осознанно: он обходит все ограничения доступа, включая RLS.

Нужно ли перепроводить документы после изменения регистра сведений?

Для независимого регистра — нет, документы с ним не связаны. Если регистр подчинён регистратору, прямое изменение вообще не рекомендуется; правильный вариант — изменить данные и перепровести документ, чтобы движения сформировались штатно.