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

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

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

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

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

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

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

Что такое регистр сведений и когда он нужен

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

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

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

Виды регистров сведений и режимы подчинения

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

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

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

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

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

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

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

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

Цены, устанавливаемые документом; статусы, меняемые операциями. Полная аудируемость: видно, каким документом внесено значение. Ручное редактирование невозможно.

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

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

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

Порядок создания регистра
  1. 1
    Создайте объект в ветке «Регистры сведений», задайте имя и синоним
  2. 2
    Выберите периодичность и режим записи (независимый или подчинён регистратору)
  3. 3
    На закладке «Данные» добавьте измерения с типами (например, Номенклатура — СправочникСсылка.Номенклатура)
  4. 4
    Добавьте ресурсы (например, Цена — Число(15,2)) и при необходимости реквизиты
  5. 5
    На закладке «Права» проверьте доступность регистра для нужных ролей
  6. 6
    Обновите конфигурацию базы данных (F7) и проверьте появление регистра в режиме предприятия

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

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

Запись данных в регистр сведений

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

bsl
// Запись одного значения в периодический регистр
МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДатаСеанса();
МенеджерЗаписи.Номенклатура = НоменклатураСсылка;
МенеджерЗаписи.ВидЦен = ВидЦенСсылка;
МенеджерЗаписи.Цена = 1250;
МенеджерЗаписи.Записать();

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

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

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

Чтение данных: запросы, срезы, метод Получить

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

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Цены.Номенклатура КАК Номенклатура,
| Цены.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены";
Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
Выборка = Запрос.Выполнить().Выбрать();

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

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

Оптимизация и типичные проблемы производительности

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

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

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

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

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

В режиме предприятия запись видна в списке регистра с правильными измерениями и ресурсами

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

Записи нет — проверьте, был ли вызван Записать() и не откатилась ли транзакция

Срез последних возвращает данные
Норма

Запрос к СрезПоследних на дату после записи возвращает строку

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

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

Уникальность ключа
Норма

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

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

В списке несколько строк с одинаковыми измерениями — вероятно, регистр периодический и периоды различаются

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

Практические сценарии и ограничения

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

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

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

Ограничения, о которых стоит помнить: регистр сведений не имеет иерархии и групп, записи нельзя пометить на удаление как объект (только физически удалить), а права настраиваются на весь регистр, а не на отдельные записи (для разграничения используется RLS — ограничение доступа на уровне записей, что требует аккуратной настройки шаблонов).

Итог

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

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

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

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

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

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

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

Почему СрезПоследних возвращает пустой результат?

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

Можно ли редактировать подчинённый регистратору регистр вручную?

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

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

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

Что лучше для цен: периодический регистр или документ с табличной частью?

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