Разработка и Конфигурация · 11 мин
Как сделать запись в регистре сведений 1С программно
Как программно создать запись в регистре сведений 1С через менеджер записи и набор записей: примеры кода, подчинённый регистратору и независимый режим, ошибки.
Запись в регистр сведений — одна из самых частых задач при разработке и доработке конфигураций 1С. Регистры сведений хранят произвольную информацию в разрезе заданных измерений: курсы валют, цены номенклатуры, ответственных лиц, настройки обмена. В отличие от регистров накопления, записи здесь можно создавать напрямую, без документа-регистратора, если регистр работает в независимом режиме.
Для программной записи используются два основных подхода: менеджер записи (для одной строки) и набор записей (для одной или нескольких строк, а также для регистров, подчинённых регистратору). Выбор зависит от режима регистра, количества записей и требований к контролю уникальности.
Ниже разобраны оба способа с готовыми примерами кода, особенности работы с периодическими регистрами, типичные ошибки и способы проверить результат. Примеры приведены на встроенном языке 1С и подходят для управляемых и обычных форм.
Как устроен регистр сведений и почему это важно перед записью
Перед написанием кода откройте регистр в конфигураторе и проверьте три вещи: режим записи (независимый или подчинён регистратору), периодичность (непериодический, в пределах секунды, дня, месяца и т.д.) и состав измерений. От этого зависит, какие поля обязательны и какой объект платформы применять.
Независимый регистр позволяет писать напрямую — записи не привязаны к документам. Подчинённый регистратору заполняется только набором записей с установленным отбором по регистратору, обычно в обработчике проведения документа. Попытка записать менеджером записи в подчинённый регистр приведёт к ошибке.
Периодический регистр требует заполнения поля Период. Уникальность записи определяется комбинацией измерений и периода: повторная запись с тем же ключом перезапишет существующую строку без предупреждения.
Запись одной строки через менеджер записи
Это самый простой и чаще всего нужный сценарий. Менеджер записи подходит только для независимых регистров сведений и работы с одной строкой за раз.
МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДатаСеанса();
МенеджерЗаписи.Номенклатура = НоменклатураСсылка;
МенеджерЗаписи.ВидЦены = ВидЦеныСсылка;
МенеджерЗаписи.Цена = 1500;
МенеджерЗаписи.Записать();
Порядок действий: создать менеджер, заполнить все измерения (это ключ записи), заполнить период, если регистр периодический, затем ресурсы и реквизиты, и вызвать Записать(). Если запись с таким ключом уже существует, она будет перезаписана; если нет — создана новая.
Метод Записать(Ложь) отключает замещение: при совпадении ключа будет вызвано исключение вместо перезаписи. Это полезно, когда дубли недопустимы и о них нужно узнать явно.
- 1Создайте объект: РегистрыСведений.Имя.СоздатьМенеджерЗаписи()
- 2Заполните все измерения и период (для периодического регистра)
- 3Заполните ресурсы и при необходимости реквизиты
- 4Вызовите Записать() — или Записать(Ложь) для запрета замещения
- 5Проверьте результат чтением записи или открытием регистра в режиме предприятия
Чтение и изменение существующей записи
Чтобы изменить уже существующую запись, сначала прочитайте её по ключу: заполните измерения и период, вызовите Прочитать(), затем проверьте свойство Выбран(). Если запись найдена, меняйте ресурсы и записывайте.
МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = НужнаяДата;
МенеджерЗаписи.Номенклатура = НоменклатураСсылка;
МенеджерЗаписи.ВидЦены = ВидЦеныСсылка;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Цена = 1650;
МенеджерЗаписи.Записать();
КонецЕсли;
Удаление выполняется аналогично: заполните ключ и вызовите Удалить(). Если записи с таким ключом нет, ошибки не возникнет — удаление в этом смысле безопасно, но и следить за логикой нужно самостоятельно.
Запись нескольких строк через набор записей
Когда нужно записать несколько строк за одну операцию или регистр подчинён регистратору, используется набор записей. Набор всегда работает с отбором: то, что попало в отбор, будет полностью замещено содержимым набора при записи.
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДатаСеанса()));
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = НачалоДня(ТекущаяДатаСеанса());
НоваяЗапись.Валюта = ВалютаUSD;
НоваяЗапись.Курс = 90.5;
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = НачалоДня(ТекущаяДатаСеанса());
НоваяЗапись.Валюта = ВалютаEUR;
НоваяЗапись.Курс = 98.2;
НаборЗаписей.Записать();
Ключевой момент: если отбор не установить, при записи будут замещены все записи регистра. Это одна из самых опасных ошибок — пустой набор без отбора при вызове Записать() очистит весь регистр. Всегда устанавливайте отбор перед любыми манипуляциями.
Запись в регистр, подчинённый регистратору
Для подчинённого регистра набор записей получают либо из коллекции движений документа в обработчике проведения, либо создают вручную с отбором по регистратору. Типовой код в модуле документа выглядит так:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.СтатусыЗаказов.Записывать = Истина;
Движение = Движения.СтатусыЗаказов.Добавить();
Движение.Период = Дата;
Движение.Заказ = ЗаказСсылка;
Движение.Статус = Перечисления.СтатусыЗаказа.Подтвержден;
КонецПроцедуры;
Если нужно изменить движения чужого документа вне проведения, создайте набор записей, установите отбор по регистратору, при необходимости прочитайте набор методом Прочитать(), измените строки и запишите. Учтите, что такая запись обходит логику проведения — документ и его движения могут разойтись.
Сравнение подходов: менеджер записи или набор записей
Оба способа записывают данные корректно, но различаются по удобству, контролю и применимости. Выбирайте по задаче, а не по привычке.
| Критерий | Менеджер записи | Набор записей |
|---|---|---|
| Режим регистра | Только независимый | Независимый и подчинённый регистратору |
| Количество строк | Одна за вызов | Любое количество за одну запись |
| Контроль замещения | Замещает по ключу записи | Замещает всё, что попало в отбор |
| Типичное применение | Настройки, одиночные значения, загрузка по одной строке | Проведение документов, пакетная загрузка, массовые изменения |
| Риск при ошибке | Затронута одна запись | Можно затереть большой массив данных без отбора |
Сравнение вариантов
Подходит для одиночной записи в независимый регистр. Безопаснее: затрагивает только одну строку. Не работает с подчинёнными регистрами.
Универсальный вариант для пакетной записи и регистров с регистратором. Требует дисциплины: забытый отбор приводит к потере данных.
Когда нужно сначала проверить существование или получить связанные данные, выполните запрос, затем пишите менеджером или набором по результату.
Проверка результата и типичные ошибки
После записи убедитесь, что данные на месте. Самый простой способ — открыть регистр в режиме предприятия через список регистра сведений и установить отбор по измерениям. Программно проверку делают повторным чтением менеджера записи или запросом.
Как проверить результат
Строка видна в списке регистра с нужными измерениями и ресурсами
Строки нет — проверьте, что Записать() вызван и не было исключения
Дата соответствует ожидаемой, срез последних возвращает запись
Запись есть, но срез последних её не видит — период заполнен неверно
Записи вне отбора остались нетронутыми
Пропали чужие записи — отбор не был установлен
Частая ошибка — незаполненное измерение. Если измерение не заполнено, запись создастся с пустым значением ключа, и найти её потом по осмысленному отбору не получится. Вторая типичная проблема — запись в периодический регистр без указания периода: запись попадёт на пустую дату.
Массовая загрузка и производительность
При загрузке тысяч строк (например, исторических курсов валют) запись каждой строки отдельным менеджером работает медленно из-за множества транзакций. Эффективнее формировать набор записей порциями: установить отбор по периоду или другому измерению, добавить пакет строк и записать одним вызовом.
Для очень больших объёмов дополнительно используют НаборЗаписей.ОбменДанными.Загрузка = Истина — это отключает часть проверок и обработчиков, ускоряя запись. Применяйте только при контролируемой загрузке, когда бизнес-логика подписок на события не нужна: отключённые обработчики не выполнятся.
Перед массовой загрузкой в рабочую базу отладьте код на копии и записывайте данные порциями с фиксацией транзакции. Если процесс прервётся на середине, вы сможете продолжить с последней успешной порции, а не очищать и перезагружать весь регистр.
Частые вопросы
Можно ли записать в регистр сведений без документа?
Да, если регистр независимый — менеджером записи или набором записей. Если регистр подчинён регистратору, запись без указания регистратора невозможна: платформа потребует заполненный отбор по регистратору.
Почему запись не появляется в регистре после Записать()?
Чаще всего код не выполняется до конца из-за исключения выше по стеку, либо запись делается внутри транзакции, которая затем откатывается. Также проверьте, что вы смотрите тот же регистр и ту же базу — при отладке на копии легко перепутать.
Как перезаписать существующую запись, а не создать дубль?
В регистре сведений дублей по полному ключу (измерения + период) быть не может: запись с тем же ключом автоматически замещается. Если у вас появляются «дубли», значит, отличается одно из измерений или период — проверьте заполнение ключа.
Как удалить все записи регистра сведений программно?
Создайте набор записей, не устанавливайте отбор, не добавляйте строк и вызовите Записать() — пустой набор заместит всё содержимое. Делайте это только осознанно и после резервного копирования: операция необратима.
Чем отличается Записать() от Записать(Истина) у набора записей?
Параметр управляет замещением: Записать(Истина) — замещать записи в пределах отбора (поведение по умолчанию), Записать(Ложь) — добавлять без замещения, что при совпадении ключей вызовет ошибку уникальности.
Нужно ли заполнять реквизиты регистра при записи?
Нет, обязательны только измерения, период (для периодического) и регистратор (для подчинённого). Реквизиты и ресурсы заполняются по необходимости; незаполненные получат значения по умолчанию для своего типа.
Что важно запомнить
Одиночную запись в независимый регистр делайте менеджером записи, пакетную запись и работу с регистратором — набором записей с обязательным отбором. Проверяйте режим и периодичность регистра до написания кода, а результат — чтением записи или просмотром регистра в режиме предприятия.