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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Запись через набор записей: пакетная загрузка и регистратор

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

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

НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);

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

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

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

НоваяЗапись.ВидЦены = ВидЦеныЗакупка;

НоваяЗапись.Цена = 1500;

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

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

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

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

Если регистр независимый и для него создана форма списка, записи можно добавлять интерактивно. В пользовательском режиме откройте регистр через раздел, где он размещён (например, «НСИ и администрирование» или «Ещё» → «Регистры сведений» в некоторых конфигурациях), нажмите «Создать», заполните поля и сохраните. Для периодического регистра дополнительно укажите дату, на которую действует значение.

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

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

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

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

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

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

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

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

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

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

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

Возвращается ваша запись на нужную дату

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

Возвращается старое значение или пусто

Регистратор для подчинённого регистра
Норма

У записи заполнена ссылка на документ

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

Записей нет — значит, регистратор не был указан

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

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

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

Маршрут решения

Как выбрать способ записи

Нужно добавить или изменить одну строку в независимом регистреИспользуйте СоздатьМенеджерЗаписи() и Записать()
Регистр подчинён регистраторуСоздайте набор записей, установите отбор по регистратору, добавьте строки и запишите
Загружается много строк за разЗаполняйте набор записей и пишите одной операцией, при больших объёмах — порциями
Нужно удалить записи по условиюСоздайте набор с отбором и вызовите Записать() без добавления строк

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

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

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

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

Чаще всего не заполнено обязательное измерение или для подчинённого регистра не указан регистратор. Проверьте также соответствие типов: в поле ссылочного типа нельзя записать строку или число.

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

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

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

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

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

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

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

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

Итог

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

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