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

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

Как работать с регистром сведений в 1С

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

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

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

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

Что такое регистр сведений и какие виды бывают

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

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

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

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

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

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

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

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

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

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

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

Чтение данных из регистра сведений программно

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

// Актуальный курс валюты на текущую дату

Отбор = Новый Структура("Валюта", ВалютаСсылка);

Курс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор);

Сообщить("Курс: " + Курс.Курс);

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Цены.Номенклатура,

| Цены.Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены";

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

Результат = Запрос.Выполнить().Выгрузить();

Частая ошибка — чтение среза последних без указания периода или с неправильным отбором в параметрах виртуальной таблицы. Условия по измерениям передавайте именно в параметры виртуальной таблицы, а не в секцию ГДЕ: это существенно ускоряет выполнение запроса на больших объёмах.

bsl
Отбор = Новый Структура("Номенклатура", СсылкаНаТовар);
Значения = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор);
Если ЗначениеЗаполнено(Значения.Цена) Тогда
	Сообщить("Текущая цена: " + Значения.Цена);
Иначе
	Сообщить("Цена не задана");
КонецЕсли;

Запись, изменение и удаление данных программно

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

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

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

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

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

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

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

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

Порядок действий при массовой загрузке
  1. 1
    Создайте набор записей и установите отбор по измерениям, которые затрагивает загрузка
  2. 2
    Вызовите Прочитать(), чтобы загрузить существующие записи
  3. 3
    Измените или дополните записи набора
  4. 4
    Вызовите Записать(Истина) для замещения или Записать(Ложь) для добавления
  5. 5
    Проверьте результат запросом: количество и содержимое записей по отбору
Типичные ошибки
01
Запись набора без отбора с замещением — удаляются все записи регистра
02
Чтение среза последних в цикле вместо одного запроса — резкое падение производительности
03
Использование периодического регистра там, где история не нужна, — лишние данные и усложнение запросов
04
Игнорирование уникальности ключа: повторная запись с теми же измерениями и периодом молча перезаписывает данные
05
Ручная правка записей регистра, подчинённого регистратору, — расхождение с документами и ошибки при перепроведении

Как выбрать тип регистра под задачу

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

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

Сравнение вариантов

Независимый непериодический

Штрихкоды, соответствия объектов, настройки. Быстрое чтение, но нет истории изменений.

Независимый периодический

Курсы валют, цены, ставки. Есть история и срезы последних, но запросы сложнее.

Подчинённый регистратору

Данные, порождаемые документами. Записи удаляются вместе с документом, ручная правка недоступна.

Проверка результата и производительность

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

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

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

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

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

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

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

Записи нет — проверьте отбор набора записей и права

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

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

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

Пустой результат — неверный период или отбор в виртуальной таблице

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

Совпадает с ожидаемым объёмом загрузки

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

Резкое уменьшение — вероятна запись набора без отбора

Итог

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

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

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

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

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

Как получить значение ресурса на конкретную дату?

Используйте метод ПолучитьПоследнее с указанием даты и отбора по измерениям либо виртуальную таблицу СрезПоследних в запросе с параметром периода. Оба способа вернут запись с максимальным периодом, не превышающим заданную дату.

Можно ли изменить периодичность регистра после заполнения данными?

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

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

Чаще всего условия по измерениям указаны в секции ГДЕ вместо параметров виртуальной таблицы, из-за чего срез строится по всем записям. Перенесите отбор в параметры виртуальной таблицы и проверьте, что по полям отбора есть индексы.

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

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

Нужны ли движения документа для подчинённого регистра сведений?

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