Разработка и Конфигурация · 11 мин
Как работать с регистрами сведений в 1С
Как создавать, заполнять и читать регистры сведений в 1С: виды периодичности, измерения и ресурсы, запись через код, типичные ошибки и проверка результата.
Регистр сведений — это объект конфигурации 1С, который хранит информацию в разрезе заданных измерений: например, цены товаров по видам цен, курсы валют по датам, адреса контрагентов. В отличие от справочника, регистр сведений позволяет хранить несколько значений для одного объекта и, при необходимости, отслеживать их изменение во времени. Именно поэтому регистры сведений используются для цен, курсов, настроек, штрихкодов и других данных, которые нельзя разместить в реквизитах справочника.
Работа с регистром сведений сводится к трём операциям: правильно спроектировать структуру (измерения, ресурсы, периодичность), записать данные и прочитать их с учётом отборов и даты среза. Ошибки чаще всего возникают не в момент записи, а на этапе проектирования: неверно выбранная периодичность или лишнее измерение потом требуют переноса данных и переделки запросов. Поэтому статья начинается с устройства регистра, а затем разбирает практические сценарии записи и чтения.
Материал ориентирован на разработчиков и внедренцев, работающих с управляемыми формами и встроенным языком 1С. Примеры кода приведены для типового синтаксиса и подходят для большинства конфигураций на платформе 8.3.
Устройство регистра сведений: измерения, ресурсы и периодичность
Структура регистра сведений состоит из трёх групп полей. Измерения — это разрезы, в которых хранятся данные (например, «Номенклатура» и «ТипЦен»). Комбинация значений измерений образует ключ записи: двух записей с одинаковым набором измерений в независимом регистре быть не может. Ресурсы — это сами хранимые значения (цена, курс, адрес). Реквизиты — дополнительные поля, которые не входят в ключ, но сопровождают запись (комментарий, автор).
Периодичность определяет, добавляется ли к ключу дата. Непериодический регистр хранит одно актуальное значение на комбинацию измерений — подходит для штрихкодов или настроек. Периодический регистр (с периодичностью секунда, день, месяц и т.д.) хранит историю изменений — так устроены курсы валют и цены. Выбор периодичности нужно сделать до заполнения регистра: смена периодичности в работающей базе приведёт к потере или искажению накопленных данных.
Отдельный параметр — режим записи. Независимый регистр заполняется вручную или кодом, записи живут сами по себе. Подчинённый регистратору регистр заполняется движениями документа: ключом становится измерения плюс регистратор, а удаление документа автоматически удаляет его записи. Подчинённый режим выбирают, когда данные должны быть строго привязаны к документу-основанию, например цены, установленные конкретным документом «Установка цен».
Как создать регистр сведений в конфигураторе
Создание выполняется в конфигураторе через ветку «Регистры сведений» дерева конфигурации. Последовательность такая: задайте имя и представление, выберите периодичность и режим записи, добавьте измерения с типами данных, затем ресурсы. Порядок измерений влияет на индексы и скорость запросов: первым ставьте измерение, по которому чаще всего накладывается отбор.
После добавления полей проверьте автоматически созданные индексы. Для периодического регистра платформа строит индекс по измерениям и периоду — этого достаточно для типовых срезов. Если планируются частые выборки по реквизиту (например, по признаку «Активен»), включите для него свойство «Индексировать», иначе запросы будут сканировать всю таблицу.
- 1В конфигураторе добавьте новый регистр сведений и задайте имя без пробелов
- 2Выберите периодичность: «Непериодический» или нужный интервал
- 3Установите режим записи: независимый или подчинён регистратору
- 4Добавьте измерения, указав типы и обязательность заполнения
- 5Добавьте ресурсы и при необходимости реквизиты с индексацией
- 6Обновите конфигурацию базы данных и проверьте регистр в режиме предприятия
Запись данных: менеджер записи и набор записей
Для независимого регистра есть два основных способа записи. Менеджер записи создаёт или перезаписывает одну строку по ключу измерений: вы заполняете измерения и ресурсы и вызываете метод Записать(). Если запись с таким ключом уже существует, она будет перезаписана — это удобно для обновления единичного значения.
Набор записей работает с группой строк: вы устанавливаете отбор по измерениям, добавляете или изменяете записи и записываете набор целиком. Важный нюанс: метод Записать() у набора по умолчанию замещает все записи, попадающие под отбор. Если отбор не установлен, можно случайно очистить весь регистр — это одна из самых опасных ошибок.
// Запись одного значения через менеджер записи
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = ТекущаяДатаСеанса();
Запись.Валюта = ВалютаСсылка;
Запись.Курс = 90.5;
Запись.Записать();
// Чтение среза последних через запрос
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Курс ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта)";
Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Валюта", ВалютаСсылка);Для регистра, подчинённого регистратору, запись выполняется только через движения документа: в модуле объекта документа заполняется коллекция Движения.ИмяРегистра, и платформа записывает её при проведении. Прямая запись в такой регистр минуя документ недоступна и приведёт к ошибке.
Чтение данных: запросы и срезы
Читать регистр сведений правильнее всего запросами — они выполняются на сервере СУБД и не тянут лишние данные в память. Для непериодического регистра достаточно обычной выборки из таблицы с условием по измерениям. Для периодического почти всегда нужны виртуальные таблицы: СрезПоследних (актуальные значения на дату) и СрезПервых (первые значения после даты, редко используется).
При работе со срезом всегда передавайте параметры виртуальной таблицы: дату и отбор по измерениям в скобках после имени таблицы, а не в секции ГДЕ. Отбор в секции ГДЕ заставит платформу построить срез по всему регистру и только потом отфильтровать результат — на больших таблицах это кратно медленнее.
Для программного чтения одной записи допустим метод Получить() у менеджера регистра с передачей структуры ключа — например, РегистрыСведений.Штрихкоды.Получить(Новый Структура("Штрихкод", Код)). Но в циклах такой подход порождает отдельный запрос на каждую итерацию; для массового чтения используйте один запрос с соединением.
Выбор между регистром сведений и альтернативами
Не каждую задачу нужно решать регистром сведений. Если значение одно на объект и история не нужна, часто достаточно реквизита справочника — это проще в интерфейсе и быстрее в запросах. Регистр сведений оправдан, когда значений несколько (цены по разным типам цен), нужна история изменений (курсы валют) или данные относятся к комбинации объектов (соответствие номенклатуры поставщика нашей номенклатуре).
Если данные должны строго контролироваться документом и участвовать в отмене проведения, выбирайте подчинённый регистр. Если данные вводятся произвольно и живут независимо от документов — независимый. Смешивать подходы в одном регистре нельзя: режим записи фиксируется при создании.
Сравнение вариантов хранения
Одно значение на объект без истории. Просто и быстро, но не подходит для нескольких значений и отслеживания изменений
Несколько значений и история без привязки к документам. Требует аккуратности при записи наборов
Данные жёстко привязаны к документу, удаляются при отмене проведения. Нельзя редактировать напрямую
Подходит для небольших списков внутри объекта, но плохо индексируется и неудобна для выборок по всей базе
Проверка результата и обслуживание
После записи проверяйте результат не по отсутствию ошибок, а по содержимому регистра. Откройте форму списка регистра в режиме предприятия или выполните контрольный запрос: количество записей, значения по ключевым измерениям, корректность периода. Для периодического регистра дополнительно проверьте срез последних на граничные даты — до первой записи срез должен быть пустым, на дату записи — возвращать её.
Как проверить результат
Совпадает с количеством загружаемых строк или ожидаемо меньше из-за дублей ключа
Записей ноль или значительно меньше без объяснимой причины
Возвращает актуальные значения по всем нужным измерениям
Срез пустой или возвращает устаревшие значения
Параметры переданы в виртуальную таблицу, запрос выполняется быстро
Запрос заметно тормозит на больших объёмах
Нет неожиданных дублей, измерения заполнены
Пустые измерения или записи с непредусмотренными комбинациями
При массовых загрузках из внешних источников записывайте данные порциями в транзакциях и контролируйте дубли ключей: при совпадении ключа запись перезапишется молча, и вы потеряете предыдущее значение без какого-либо предупреждения. Если регистр разрастается (например, журналирующие регистры с записью каждого события), предусмотрите регламентную чистку устаревших записей — бесконтрольный рост таблицы замедляет срезы и увеличивает размер базы.
Перед изменением структуры заполненного регистра выгрузите его содержимое (например, через обработку выгрузки в табличный документ или файл). Добавление нового обязательного измерения к существующим записям без плана миграции данных — типичная причина аварийных ситуаций при обновлении конфигурации.
Частые вопросы
Чем регистр сведений отличается от регистра накопления?
Регистр сведений хранит значения как есть — цену, курс, адрес. Регистр накопления хранит числовые показатели с возможностью получения остатков и оборотов: остатки товаров, суммы взаиморасчётов. Если нужно отвечать на вопрос «сколько осталось» — это регистр накопления, если «какое значение установлено» — регистр сведений.
Как удалить все записи регистра сведений?
Создайте набор записей без отбора и вызовите Записать() у пустого набора — регистр очистится полностью. Операция необратима, поэтому перед ней сделайте резервную копию. Для подчинённого регистратору регистра записи удаляются только через отмену проведения или удаление документов-регистраторов.
Почему срез последних возвращает пустой результат?
Чаще всего дата среза раньше даты первой записи, либо отбор по измерениям не совпадает с реальными значениями (например, сравнивается строка с ссылкой). Проверьте фактические периоды записей и типы параметров. Также убедитесь, что записи вообще существуют — сделайте выборку из основной таблицы без виртуальных таблиц.
Можно ли изменить периодичность существующего регистра?
Технически конфигуратор позволяет изменить периодичность, но при обновлении базы данные будут преобразованы с потерями: при переходе к более редкой периодичности «лишние» записи с одинаковым ключом внутри периода конфликтуют. Безопасный путь — создать новый регистр с нужной периодичностью и перенести данные обработкой.
Как быстро найти, какие объекты используют регистр?
В конфигураторе вызовите для регистра команду «Поиск ссылок в объектах метаданных» из контекстного меню — она покажет документы, отчёты и обработки, где регистр задействован. Для поиска обращений в коде модулей используйте глобальный поиск по имени регистра с учётом конструкций «РегистрыСведений.Имя».
Что важно запомнить
Проектируйте измерения и периодичность до заполнения регистра — потом их сложно менять. Записывайте данные менеджером записи или набором с обязательным отбором, читайте запросами через «СрезПоследних» с параметрами внутри виртуальной таблицы. После любых массовых операций проверяйте результат контрольными запросами, а перед рискованными действиями делайте копию базы.