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

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

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

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

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

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

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

Устройство регистра сведений: измерения, ресурсы и периодичность

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

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

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

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

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

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

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

Запись данных: менеджер записи и набор записей

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

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

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

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

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

Чтение данных: запросы и срезы

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

При работе со срезом всегда передавайте параметры виртуальной таблицы: дату и отбор по измерениям в скобках после имени таблицы, а не в секции ГДЕ. Отбор в секции ГДЕ заставит платформу построить срез по всему регистру и только потом отфильтровать результат — на больших таблицах это кратно медленнее.

Для программного чтения одной записи допустим метод Получить() у менеджера регистра с передачей структуры ключа — например, РегистрыСведений.Штрихкоды.Получить(Новый Структура("Штрихкод", Код)). Но в циклах такой подход порождает отдельный запрос на каждую итерацию; для массового чтения используйте один запрос с соединением.

Типичные ошибки
01
Отбор по измерениям в секции ГДЕ вместо параметров виртуальной таблицы — резкое падение скорости среза
02
Запись набора без отбора — полная очистка регистра
03
Чтение через Получить() в цикле — сотни лишних обращений к базе
04
Изменение периодичности после заполнения — потеря истории данных
05
Хранение значения в реквизите вместо ресурса — значение недоступно в типовых срезах и отчётах

Выбор между регистром сведений и альтернативами

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

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

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

Реквизит справочника

Одно значение на объект без истории. Просто и быстро, но не подходит для нескольких значений и отслеживания изменений

Независимый регистр сведений

Несколько значений и история без привязки к документам. Требует аккуратности при записи наборов

Регистр, подчинённый регистратору

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

Табличная часть справочника

Подходит для небольших списков внутри объекта, но плохо индексируется и неудобна для выборок по всей базе

Проверка результата и обслуживание

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

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

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

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

Совпадает с количеством загружаемых строк или ожидаемо меньше из-за дублей ключа

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

Записей ноль или значительно меньше без объяснимой причины

Срез последних на текущую дату
Норма

Возвращает актуальные значения по всем нужным измерениям

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

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

Отбор в запросе
Норма

Параметры переданы в виртуальную таблицу, запрос выполняется быстро

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

Запрос заметно тормозит на больших объёмах

Ключи записей
Норма

Нет неожиданных дублей, измерения заполнены

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

Пустые измерения или записи с непредусмотренными комбинациями

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

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

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

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

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

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

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

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

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

Можно ли изменить периодичность существующего регистра?

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

Как быстро найти, какие объекты используют регистр?

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

Итог

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

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