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

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

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

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

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

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

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

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

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

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

Режим записи «Подчинение регистратору» также меняет состав полей: появляется обязательное поле «Регистратор» и признак «Активность». Программно установить эти поля вручную нельзя — их заполняет платформа при проведении документа.

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

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

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

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

Запись.Валюта = ВалютаСсылка;

Запись.Курс = 92.5;

Запись.Кратность = 1;

Запись.Записать();

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

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

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

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

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

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

Набор.Отбор.Номенклатура.Установить(ТекНоменклатура);

НоваяСтрока = Набор.Добавить();

НоваяСтрока.Номенклатура = ТекНоменклатура;

НоваяСтрока.ВидЦены = ВидЦеныРозничный;

НоваяСтрока.Цена = 1500;

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

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

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

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

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

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

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

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

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

Движение.Заказ = ЗаказПокупателя;

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

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

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

Запись без программирования: форма списка и обработки

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

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

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

Сравнение способов записи

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

Одна строка, минимум кода. Не подходит для массовых операций и регистров с регистратором

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

Массовая запись и перезапись среза. Требует аккуратности с отбором — ошибка очищает лишние данные

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

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

Форма списка / обработка загрузки

Без программирования, для разовых операций. Медленно и риск ручных ошибок при больших объёмах

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

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

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

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

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

Строка в форме списка регистра
Норма

Запись видна, измерения и ресурсы заполнены корректно

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

Строки нет или поля пустые

Срез последних периодического регистра
Норма

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

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

Возвращается старая запись — неверный Период

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

Изменилось ровно на ожидаемое число строк

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

Записей стало меньше — вероятно, сработало замещение по широкому отбору

FAQ

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

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

Что делать, если Записать() выдаёт ошибку уникальности?

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

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

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

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

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

Чем периодический регистр отличается при записи?

У периодического регистра обязательно поле Период, и уникальность проверяется по комбинации измерений плюс период. Это позволяет хранить историю изменений значений. При записи всегда явно задавайте Период, иначе получите запись на пустую дату.

Нужно ли использовать транзакцию при массовой записи?

Набор записей пишется целиком в одной транзакции автоматически. Если вы пишете много наборов или менеджеров записей в цикле и важна целостность всего пакета, оберните цикл в НачатьТранзакцию() / ЗафиксироватьТранзакцию() с откатом в блоке Исключение.

Итог

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

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