Регистр сведений в 1С 8.3: устройство, режимы записи, срезы и скорость
Содержание
Регистр сведений в 1С 8.3 нужен, чтобы хранить значения по набору признаков и, если надо, по датам: курс валюты на число, цену товара на дату, оклад сотрудника с момента приказа. Это таблица, где строку однозначно определяют измерения (и период), а в ресурсах лежит само значение. В отличие от регистра накопления, он не считает остатки и обороты — он отвечает на вопрос «какое значение действовало на эту дату».
Использовать его стоит, когда у данных нет собственной «личности» (как у справочника) и они не являются событием (как документ), а являются фактом о связке объектов. Сам регистр — объект платформы, поэтому всё ниже одинаково для Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и самописных конфигураций.
Как устроен регистр сведений и чем он отличается от справочников и других регистров
У регистра сведений три вида полей. От того, куда вы положите реквизит, зависит, как будет работать вся таблица.
- 🔑 Измерения — ключ записи. Например,
ВалютаилиНоменклатура+ТипЦен. Двух записей с одинаковыми измерениями (и одинаковым периодом) быть не может. - 💰 Ресурсы — то, ради чего регистр заведён:
Курс,Цена,Оклад. - 📎 Реквизиты — сопутствующие данные, которые не входят в ключ: комментарий, ответственный, основание.
Если регистр периодический, к ключу добавляется поле Период. Если подчинён регистратору — ещё Регистратор и НомерСтроки.
Главное отличие от справочника: на запись регистра нельзя сослаться. Нет ссылки, нет кода и иерархии. Ресурс «цена» нельзя выбрать в реквизите документа — его получают запросом по ключу.
| Объект | Что хранит | Ссылка на запись | Типичный пример |
|---|---|---|---|
| Справочник | Самостоятельные объекты | Есть | Номенклатура, контрагенты |
| Документ | События с датой | Есть | Реализация, приказ о приёме |
| Регистр сведений | Значения по ключу и дате | Нет | Курсы валют, цены, штрихкоды |
| Регистр накопления | Движения для остатков и оборотов | Нет | Товары на складах, взаиморасчёты |
| Регистр бухгалтерии | Проводки по плану счетов | Нет | Хозрасчётный |
Простой тест: если данные хочется «сложить» по периоду и получить остаток — это регистр накопления. Если хочется узнать «какое значение было на дату» — регистр сведений.
Периодические и непериодические регистры, независимые и подчинённые
У регистра сведений две независимые настройки в конфигураторе: периодичность и режим записи. Их комбинация определяет почти всё поведение.
Периодичность
- 📅 Непериодический — у записи нет даты, хранится одно текущее значение. Пример: штрихкоды номенклатуры, соответствие пользователя и настройки.
- ⏱ В пределах секунды, дня, месяца, квартала, года — значение действует с даты записи до следующей записи. Периодичность «месяц» означает, что любой период приводится к началу месяца: две записи 3-го и 20-го числа по одному ключу не уживутся.
- 🧾 В пределах регистратора (позиция регистратора) — доступна только подчинённым регистрам. Период записи совпадает с моментом документа, что позволяет хранить несколько значений за одну секунду в правильном порядке.
Режим записи
- ✍️ Независимый — записи вводят вручную в форме регистра или пишут кодом. Пример: курсы валют, загружаемые из интернета.
- 📄 Подчинение регистратору — записи создаёт документ при проведении, и при отмене проведения они исчезают. Вручную их не правят. Пример: цены, установленные документом «Установка цен номенклатуры».
| Сочетание | Когда выбирать |
|---|---|
| Непериодический + независимый | Справочная привязка без истории: штрихкоды, настройки |
| Периодический + независимый | История значений, которую ведут без документа: курсы валют, учётная политика |
| Периодический + подчинение регистратору | История, у которой есть первичный документ: цены по приказу, оклады, ставки |
| Непериодический + подчинение регистратору | Данные, которые документ «владеет»: служебные отметки, статусы обработки |
Для подчинённого регистра правило простое: хотите изменить значение — правьте документ и перепроводите его.
Когда регистр сведений лучше справочника или реквизита документа
Разработчики часто заводят справочник там, где нужен регистр, и наоборот. Выбор понятен, если задать себе три вопроса.
- Нужна ли ссылка на эту сущность из других объектов? Да — справочник. Нет — можно регистр.
- Меняется ли значение во времени, и важна ли история? Да — периодический регистр сведений. Хранить «оклад» реквизитом в справочнике сотрудников значит потерять историю и сломать перерасчёты.
- Значение зависит от нескольких объектов сразу? Цена зависит от товара и вида цены, норма — от материала и изделия. Такая связка «многие ко многим» — классическое поле для регистра с несколькими измерениями.
Примеры применения регистров сведений: чтение и запись кодом
На практике с регистром работают четырьмя способами: читают срез, читают одно значение, пишут набор записей и пишут через документ.
Срез последних в запросе
Самая частая операция — получить значение, действующее на дату. Для этого у периодического регистра есть виртуальная таблица СрезПоследних. Пример: курс и кратность валюты на текущую дату.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Курсы.Курс КАК Курс,
| Курсы.Кратность КАК Кратность
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК Курсы";
Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Валюта", Валюта);
Курс = 0;
Кратность = 1;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Курс = Выборка.Курс;
Кратность = Выборка.Кратность;
КонецЕсли;
Условие по валюте стоит в параметрах виртуальной таблицы, а не в ГДЕ. Это не вопрос стиля, а вопрос правильности и скорости — подробнее в разделе про ошибки.
СрезПервых работает зеркально: возвращает первое значение после указанной даты. Нужен реже — например, чтобы узнать дату первого назначения ставки.
Одно значение без запроса
Для единичного обращения у менеджера периодического регистра есть метод ПолучитьПоследнее. Он возвращает структуру ресурсов:
Отбор = Новый Структура("Валюта", Валюта);
Данные = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор);
Курс = Данные.Курс;
Удобно в форме, но в цикле по сотне строк так делать нельзя: каждый вызов — отдельный запрос к базе. Для таблицы товаров соберите все ключи и сделайте один запрос со срезом.
Запись набором в независимый регистр
Набор записей — основной способ записи. Он заменяет все записи, попавшие под отбор. Пример для непериодического регистра пользовательских настроек (имена регистра и полей условные):
Набор = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
Набор.Отбор.Пользователь.Установить(Пользователь);
Набор.Отбор.Настройка.Установить("ПоказыватьСкидки");
Запись = Набор.Добавить();
Запись.Пользователь = Пользователь;
Запись.Настройка = "ПоказыватьСкидки";
Запись.Значение = Истина;
Набор.Записать(); // по умолчанию Замещение = Истина
Для одной записи можно взять менеджер записи: СоздатьМенеджерЗаписи(), заполнить измерения и ресурсы, вызвать Записать(). Он проще, но набор быстрее при пакетной загрузке.
Запись движениями документа
У подчинённого регистра набор уже есть у документа. В обработке проведения его заполняют и ставят флаг записи:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ЦеныТоваров.Записывать = Истина;
Для Каждого Строка Из Товары Цикл
Движение = Движения.ЦеныТоваров.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Строка.Номенклатура;
Движение.Цена = Строка.Цена;
КонецЦикла;
КонецПроцедуры
Регистратор платформа подставит сама. Отбор по регистратору у набора движений тоже установлен заранее.
Ошибки, которые встречаются в каждом втором аудите кода
Набор записей независимого регистра без отбора при записи с замещением удаляет все записи регистра. Это не баг, а документированное поведение: пустой отбор означает «весь регистр». Перед Записать() проверяйте, что отбор установлен по каждому измерению, которое вы пишете.
Остальные ошибки менее разрушительны, но портят данные или скорость.
- ❌ Условие в
ГДЕвместо параметров среза.СрезПоследних(&Дата) ГДЕ Цена > 0сначала строит срез по всему регистру, потом фильтрует. Если последняя цена по товару стала нулевой, запрос вернёт пустоту вместо «нет действующей цены», а на большом регистре ещё и выполнится в разы дольше. - ❌ Ресурс положен в измерение. Если
Ценастала измерением, две разные цены одного товара на одну дату станут двумя записями. Ключ должен описывать «о чём запись», а не «какое значение». - ❌ Периодичность крупнее, чем нужна. При периодичности «месяц» вторая запись внутри месяца молча перезапишет первую. Для цен, которые меняются по несколько раз в день, нужна секунда или позиция регистратора.
- ❌ Ручная правка подчинённого регистра. Даже если удалось изменить запись обработкой, при перепроведении документ вернёт старое значение.
- ❌ Флаг «Ведущее» на всех измерениях подряд. Ведущее измерение означает, что при удалении объекта удалятся и записи регистра, а форма объекта видит их в связанных списках. Лишние ведущие связи замедляют удаление помеченных и плодят неожиданные удаления данных.
- ❌
Замещение = Ложьбез нужды. При добавлении записи с уже существующим ключом платформа выдаст ошибку записи. Добавлять без замещения имеет смысл, только если вы уверены, что ключ уникален.
Массовые изменения в рабочем регистре (загрузка, очистка, обработки «исправить записи») делайте после резервной копии базы и в часы, когда пользователи не работают: набор блокирует записи по своему отбору, и проведение документов может встать на ожидании блокировки.
Как ускорить регистр сведений и не получить тормоза на больших объёмах
Регистр курсов на десять валют не тормозит никогда. Проблемы начинаются на регистрах в миллионы строк: цены, история статусов, служебные журналы.
Порядок измерений и индексы
Платформа строит основной индекс по периоду и измерениям в том порядке, как они описаны в конфигураторе. Первым ставьте измерение, по которому отбирают почти всегда: для цен это обычно вид цены или номенклатура, а не склад.
Флаг «Индексировать» у второстепенного измерения или реквизита нужен, только если по нему действительно отбирают в запросах. Каждый лишний индекс замедляет запись.
Итоги среза последних
У периодического регистра в свойствах есть флаги «Разрешить итоги срез последних» и «Разрешить итоги срез первых». Платформа начинает хранить отдельную таблицу с актуальными значениями, и срез на текущую дату читается из неё, без перебора истории.
Цена — немного более медленная запись. Включайте на регистрах, где срез на текущую дату читают постоянно (цены в подборе товаров, текущие статусы), а пишут умеренно.
Приёмы в запросах
- ⚡ Отбор по измерениям — в параметрах виртуальной таблицы
СрезПоследних(&Дата, Номенклатура В (&Список)). - ⚡ Срез по таблице документа — через временную таблицу ключей и соединение, а не через вызов среза для каждой строки.
- ⚡ Если нужна цена на дату каждой строки (у строк разные даты), не делайте подзапрос в цикле: соберите максимальный период до даты строки по ключу отдельным запросом и соедините с регистром по найденному периоду.
- ⚡ Для отчётов по истории читайте физическую таблицу регистра с отбором по периоду, а не срез.
Блокировки при записи
При записи набора платформа накладывает исключительную блокировку по отбору набора. Узкий отбор (по всем измерениям) — узкая блокировка. Набор, записанный с отбором только по одному измерению, перекрывает всех, кто пишет по этому измерению, и пользователи начинают ловить ожидание на блокировках.
Где лежат регистры сведений в типовых конфигурациях
Пользователь видит регистр сведений через формы объектов (цены в карточке товара, курсы в справочнике валют) или напрямую через «Все функции».
Чтобы открыть регистр напрямую в интерфейсе «Такси»:
- Включите команду:
Главное меню → Сервис → Параметры, флажок «Отображать команду “Все функции”». - Откройте
Главное меню → Все функции. - Разверните ветку «Регистры сведений» и выберите нужный.
Для подчинённого регистра так же удобно идти от документа: кнопка просмотра движений документа (в Бухгалтерии — значок «Дт/Кт» на форме) показывает и записи регистров сведений.
| Конфигурация | Регистр сведений | Что хранит |
|---|---|---|
| Бухгалтерия 3.0 | Курсы валют | Курс и кратность валюты на дату |
| Бухгалтерия 3.0 | Цены номенклатуры | Цены по видам цен, записываются документом установки цен |
| Бухгалтерия 3.0 | Учетная политика | Параметры учёта организации по периодам |
| Бухгалтерия 3.0, УТ 11 | Штрихкоды номенклатуры | Соответствие штрихкода товару |
| ЗУП 3.1 | Кадровая история сотрудников | Подразделение, должность, вид занятости с даты события |
| ЗУП 3.1 | Плановые начисления | Начисления и показатели сотрудника, назначенные документами |
В конфигураторе найти регистр по смыслу быстрее всего поиском по синониму: в дереве метаданных нажмите Ctrl+F и введите слово из названия. Синоним (то, что видит пользователь) часто отличается от имени объекта.