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

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

Как добавить записи в регистр сведений, не подчинённый регистратору, в 1С

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

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

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

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

Чем независимый регистр отличается от подчинённого регистратору

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

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

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

Добавление одной записи через менеджер записи

Самый простой способ записать одну строку — использовать РегистрыСведений.ИмяРегистра.СоздатьМенеджерЗаписи(). Объект-менеджер заполняется значениями измерений и ресурсов, после чего вызывается метод Записать().

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

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

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

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

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

Важно понимать поведение метода Записать(): если запись с такой же комбинацией измерений (и периодом) уже существует, она будет перезаписана без ошибки. Это удобно для обновления данных, но опасно, если требуется контролировать дубли.

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

Пакетное добавление через набор записей

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

Интерактивное добавление записей без программирования

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

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

Если пункт «Все функции» недоступен, его включают в настройках: «Сервис» → «Параметры» → флаг «Отображать команду "Все функции"». В типовых конфигурациях многие регистры уже выведены в интерфейс соответствующих разделов, и искать их через «Все функции» не требуется.

Порядок действий при ручном вводе
  1. 1
    Откройте список регистра через раздел конфигурации или «Все функции»
  2. 2
    Нажмите «Создать» и заполните измерения и ресурсы
  3. 3
    Для периодического регистра укажите дату записи
  4. 4
    Нажмите «Записать и закрыть»
  5. 5
    Проверьте, что строка появилась в списке и отборы её находят

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

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

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

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

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

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

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

Частые ошибки при добавлении записей в независимый регистр:

  • Запись набора без отбора — полная очистка регистра перед записью; восстановление возможно только из резервной копии.
  • Незаполненные ключевые измерения — запись создаётся с пустым ключом и «маскирует» последующие обращения; проверяйте заполнение до вызова Записать().
  • Игнорирование уникальности — повторная запись с тем же ключом молча перезаписывает данные; если это нежелательно, контролируйте существование записи до записи.
  • Нарушение прав доступа — код в привилегированном режиме пишет данные, которые пользователь потом не видит; согласуйте режим записи с настройками прав.
  • Запись вне транзакции при пакетной загрузке — при сбое часть строк записана, часть нет; оборачивайте массовые операции в транзакцию.
Типичные ошибки
01
Набор записей без отбора — стираются все данные регистра
02
Пустые измерения — появляются записи с пустым ключом, ломающие логику отборов
03
Отсутствие транзакции при пакетной загрузке — частично записанные данные после сбоя
04
Неверная периодичность при загрузке истории — записи затирают друг друга в пределах одного периода

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

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

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

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

Строка находится отбором по измерениям, поля заполнены

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

Записи нет или измерения пустые

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

Совпадает с числом строк источника в целевом срезе

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

Меньше — часть строк потеряна; больше — возможны дубли ключей

Данные остальных срезов регистра
Норма

Записи вне целевого отбора не изменились

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

Пропали записи, которые не должны были затрагиваться

Выбор способа записи под задачу

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

СпособКогда подходитОграничение
Менеджер записиОдна запись, точечное обновлениеМедленно при массовой загрузке
Набор записей с отборомПакетная замена среза данныхТребует точного отбора, иначе затирает лишнее
Форма спискаРучной ввод, исправление отдельных значенийНе подходит для больших объёмов
Обработка загрузки из файлаРегулярный импорт из внешних источниковНужна разработка и контроль дублей

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

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

Как выбрать действие

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

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

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

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

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

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

Что произойдёт, если записать набор записей без отбора?

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

Как проверить, существует ли уже запись с таким ключом?

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

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

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

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

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

Нужны ли особые права для записи в регистр сведений?

Да. У пользователя должны быть права на добавление и изменение записей конкретного регистра (роли, включающие эти права). В программном коде можно выполнить запись в привилегированном режиме (УстановитьПривилегированныйРежим), но тогда ответственность за корректность данных полностью ложится на разработчика.