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

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

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

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

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

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

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

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

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

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

Периодический регистр требует заполнения поля Период. Уникальность записи определяется комбинацией измерений и периода: повторная запись с тем же ключом перезапишет существующую строку без предупреждения.

Запись одной строки через менеджер записи

Это самый простой и чаще всего нужный сценарий. Менеджер записи подходит только для независимых регистров сведений и работы с одной строкой за раз.

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

МенеджерЗаписи.Период = ТекущаяДатаСеанса();

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

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

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

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

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

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

Порядок записи через менеджер записи
  1. 1
    Создайте объект: РегистрыСведений.Имя.СоздатьМенеджерЗаписи()
  2. 2
    Заполните все измерения и период (для периодического регистра)
  3. 3
    Заполните ресурсы и при необходимости реквизиты
  4. 4
    Вызовите Записать() — или Записать(Ложь) для запрета замещения
  5. 5
    Проверьте результат чтением записи или открытием регистра в режиме предприятия

Чтение и изменение существующей записи

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

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

МенеджерЗаписи.Период = НужнаяДата;

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

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

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

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

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

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

КонецЕсли;

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

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

Когда нужно записать несколько строк за одну операцию или регистр подчинён регистратору, используется набор записей. Набор всегда работает с отбором: то, что попало в отбор, будет полностью замещено содержимым набора при записи.

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

НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДатаСеанса()));

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

НоваяЗапись.Период = НачалоДня(ТекущаяДатаСеанса());

НоваяЗапись.Валюта = ВалютаUSD;

НоваяЗапись.Курс = 90.5;

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

НоваяЗапись.Период = НачалоДня(ТекущаяДатаСеанса());

НоваяЗапись.Валюта = ВалютаEUR;

НоваяЗапись.Курс = 98.2;

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

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

Запись в регистр, подчинённый регистратору

Для подчинённого регистра набор записей получают либо из коллекции движений документа в обработчике проведения, либо создают вручную с отбором по регистратору. Типовой код в модуле документа выглядит так:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Движения.СтатусыЗаказов.Записывать = Истина;

Движение = Движения.СтатусыЗаказов.Добавить();

Движение.Период = Дата;

Движение.Заказ = ЗаказСсылка;

Движение.Статус = Перечисления.СтатусыЗаказа.Подтвержден;

КонецПроцедуры;

Если нужно изменить движения чужого документа вне проведения, создайте набор записей, установите отбор по регистратору, при необходимости прочитайте набор методом Прочитать(), измените строки и запишите. Учтите, что такая запись обходит логику проведения — документ и его движения могут разойтись.

Сравнение подходов: менеджер записи или набор записей

Оба способа записывают данные корректно, но различаются по удобству, контролю и применимости. Выбирайте по задаче, а не по привычке.

КритерийМенеджер записиНабор записей
Режим регистраТолько независимыйНезависимый и подчинённый регистратору
Количество строкОдна за вызовЛюбое количество за одну запись
Контроль замещенияЗамещает по ключу записиЗамещает всё, что попало в отбор
Типичное применениеНастройки, одиночные значения, загрузка по одной строкеПроведение документов, пакетная загрузка, массовые изменения
Риск при ошибкеЗатронута одна записьМожно затереть большой массив данных без отбора

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

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

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

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

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

Запрос с последующей записью

Когда нужно сначала проверить существование или получить связанные данные, выполните запрос, затем пишите менеджером или набором по результату.

Проверка результата и типичные ошибки

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

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

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

Запись появилась в регистре
Норма

Строка видна в списке регистра с нужными измерениями и ресурсами

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

Строки нет — проверьте, что Записать() вызван и не было исключения

Период записи
Норма

Дата соответствует ожидаемой, срез последних возвращает запись

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

Запись есть, но срез последних её не видит — период заполнен неверно

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

Записи вне отбора остались нетронутыми

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

Пропали чужие записи — отбор не был установлен

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

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

Массовая загрузка и производительность

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

Для очень больших объёмов дополнительно используют НаборЗаписей.ОбменДанными.Загрузка = Истина — это отключает часть проверок и обработчиков, ускоряя запись. Применяйте только при контролируемой загрузке, когда бизнес-логика подписок на события не нужна: отключённые обработчики не выполнятся.

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

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

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

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

Почему запись не появляется в регистре после Записать()?

Чаще всего код не выполняется до конца из-за исключения выше по стеку, либо запись делается внутри транзакции, которая затем откатывается. Также проверьте, что вы смотрите тот же регистр и ту же базу — при отладке на копии легко перепутать.

Как перезаписать существующую запись, а не создать дубль?

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

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

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

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

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

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

Нет, обязательны только измерения, период (для периодического) и регистратор (для подчинённого). Реквизиты и ресурсы заполняются по необходимости; незаполненные получат значения по умолчанию для своего типа.

Итог

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

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