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

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

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

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

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

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

Что нужно знать о структуре регистра перед записью

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

Уникальность записи определяется комбинацией измерений, а для периодического регистра — ещё и периодом. Если записать строку с той же комбинацией измерений и периода, старая запись будет перезаписана без предупреждения. Это удобно для обновления значений, но опасно, если перезапись не планировалась.

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

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

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

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

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

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

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

МенеджерЗаписи.Кратность = 1;

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

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

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

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

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

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

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

Для Каждого СтрокаТовара Из ТаблицаЦен Цикл

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

НоваяЗапись.ТипЦен = ТипЦенСсылка;

НоваяЗапись.Номенклатура = СтрокаТовара.Номенклатура;

НоваяЗапись.Цена = СтрокаТовара.Цена;

КонецЦикла;

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

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

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

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

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

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

Частая ошибка — запись с периодом ТекущаяДата() вместо ТекущаяДатаСеанса() на сервере или использование даты документа без приведения к периодичности регистра. Проверяйте, что период соответствует бизнес-логике: курс валюты обычно ставят на начало дня, а не на произвольное время.

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

Такой регистр заполняется только через движения документа. В модуле объекта документа в обработчике ОбработкаПроведения обращайтесь к коллекции Движения:

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

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

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

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

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

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

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

Строка Записывать = Истина обязательна: без неё набор движений не будет физически записан в базу. При перепроведении документа платформа автоматически очищает старые движения и записывает новые — поэтому ручные правки такого регистра бессмысленны.

Способы записи в регистр сведений

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

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

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

Пакетная запись одной транзакцией. Требует обязательного контроля отбора, иначе риск затереть чужие данные.

Движения документа

Единственный вариант для регистров, подчинённых регистратору. Запись привязана к проведению документа.

Транзакции, блокировки и производительность

При массовой записи оборачивайте операции в транзакцию через НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Это гарантирует целостность: при ошибке на середине загрузки база не останется в полузаписанном состоянии. Используйте ОтменитьТранзакцию() в блоке обработки исключений.

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

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

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

Как проверить, что данные записались корректно

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

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

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

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

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

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

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

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

Срез последних
Норма

Новое значение возвращается на актуальную дату

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

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

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

Совпадает с ожидаемым числом загруженных записей

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

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

Данные других измерений после записи набором
Норма

Записи с другими значениями отбора не изменились

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

Пропали строки, которых не было в наборе — отбор был не установлен

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

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

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

Почему при записи возникает ошибка уникальности индекса?

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

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

Да, код идентичен — обращение идёт через РегистрыСведений.ИмяРегистра. Убедитесь, что обработка выполняется в режиме с достаточными правами: у пользователя должны быть права на добавление и изменение этого регистра, иначе получите ошибку нарушения прав доступа.

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

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

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

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

Почему запись есть в регистре, но отчёт её не видит?

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

Итог

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

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