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