Регистр сведений в 1С 8.3: устройство, режимы записи, срезы и скорость

· 10 мин

Содержание

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

Использовать его стоит, когда у данных нет собственной «личности» (как у справочника) и они не являются событием (как документ), а являются фактом о связке объектов. Сам регистр — объект платформы, поэтому всё ниже одинаково для Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и самописных конфигураций.

Как устроен регистр сведений и чем он отличается от справочников и других регистров

У регистра сведений три вида полей. От того, куда вы положите реквизит, зависит, как будет работать вся таблица.

  • 🔑 Измерения — ключ записи. Например, Валюта или Номенклатура + ТипЦен. Двух записей с одинаковыми измерениями (и одинаковым периодом) быть не может.
  • 💰 Ресурсы — то, ради чего регистр заведён: Курс, Цена, Оклад.
  • 📎 Реквизиты — сопутствующие данные, которые не входят в ключ: комментарий, ответственный, основание.

Если регистр периодический, к ключу добавляется поле Период. Если подчинён регистратору — ещё Регистратор и НомерСтроки.

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

ОбъектЧто хранитСсылка на записьТипичный пример
СправочникСамостоятельные объектыЕстьНоменклатура, контрагенты
ДокументСобытия с датойЕстьРеализация, приказ о приёме
Регистр сведенийЗначения по ключу и датеНетКурсы валют, цены, штрихкоды
Регистр накопленияДвижения для остатков и оборотовНетТовары на складах, взаиморасчёты
Регистр бухгалтерииПроводки по плану счетовНетХозрасчётный

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

Периодические и непериодические регистры, независимые и подчинённые

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

Периодичность

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

Режим записи

  • ✍️ Независимый — записи вводят вручную в форме регистра или пишут кодом. Пример: курсы валют, загружаемые из интернета.
  • 📄 Подчинение регистратору — записи создаёт документ при проведении, и при отмене проведения они исчезают. Вручную их не правят. Пример: цены, установленные документом «Установка цен номенклатуры».
СочетаниеКогда выбирать
Непериодический + независимыйСправочная привязка без истории: штрихкоды, настройки
Периодический + независимыйИстория значений, которую ведут без документа: курсы валют, учётная политика
Периодический + подчинение регистраторуИстория, у которой есть первичный документ: цены по приказу, оклады, ставки
Непериодический + подчинение регистраторуДанные, которые документ «владеет»: служебные отметки, статусы обработки

Для подчинённого регистра правило простое: хотите изменить значение — правьте документ и перепроводите его.

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

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

  1. Нужна ли ссылка на эту сущность из других объектов? Да — справочник. Нет — можно регистр.
  2. Меняется ли значение во времени, и важна ли история? Да — периодический регистр сведений. Хранить «оклад» реквизитом в справочнике сотрудников значит потерять историю и сломать перерасчёты.
  3. Значение зависит от нескольких объектов сразу? Цена зависит от товара и вида цены, норма — от материала и изделия. Такая связка «многие ко многим» — классическое поле для регистра с несколькими измерениями.
Куда положить новые данные?

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

На практике с регистром работают четырьмя способами: читают срез, читают одно значение, пишут набор записей и пишут через документ.

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

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

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

Курс = 0;
Кратность = 1;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
	Курс = Выборка.Курс;
	Кратность = Выборка.Кратность;
КонецЕсли;

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

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

Одно значение без запроса

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

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

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

Запись набором в независимый регистр

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

Набор = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
Набор.Отбор.Пользователь.Установить(Пользователь);
Набор.Отбор.Настройка.Установить("ПоказыватьСкидки");

Запись = Набор.Добавить();
Запись.Пользователь = Пользователь;
Запись.Настройка = "ПоказыватьСкидки";
Запись.Значение = Истина;

Набор.Записать(); // по умолчанию Замещение = Истина

Для одной записи можно взять менеджер записи: СоздатьМенеджерЗаписи(), заполнить измерения и ресурсы, вызвать Записать(). Он проще, но набор быстрее при пакетной загрузке.

Запись движениями документа

У подчинённого регистра набор уже есть у документа. В обработке проведения его заполняют и ставят флаг записи:

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

Регистратор платформа подставит сама. Отбор по регистратору у набора движений тоже установлен заранее.

Ошибки, которые встречаются в каждом втором аудите кода

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

Остальные ошибки менее разрушительны, но портят данные или скорость.

  • ❌ Условие в ГДЕ вместо параметров среза. СрезПоследних(&Дата) ГДЕ Цена > 0 сначала строит срез по всему регистру, потом фильтрует. Если последняя цена по товару стала нулевой, запрос вернёт пустоту вместо «нет действующей цены», а на большом регистре ещё и выполнится в разы дольше.
  • ❌ Ресурс положен в измерение. Если Цена стала измерением, две разные цены одного товара на одну дату станут двумя записями. Ключ должен описывать «о чём запись», а не «какое значение».
  • ❌ Периодичность крупнее, чем нужна. При периодичности «месяц» вторая запись внутри месяца молча перезапишет первую. Для цен, которые меняются по несколько раз в день, нужна секунда или позиция регистратора.
  • ❌ Ручная правка подчинённого регистра. Даже если удалось изменить запись обработкой, при перепроведении документ вернёт старое значение.
  • ❌ Флаг «Ведущее» на всех измерениях подряд. Ведущее измерение означает, что при удалении объекта удалятся и записи регистра, а форма объекта видит их в связанных списках. Лишние ведущие связи замедляют удаление помеченных и плодят неожиданные удаления данных.
  • ❌ Замещение = Ложь без нужды. При добавлении записи с уже существующим ключом платформа выдаст ошибку записи. Добавлять без замещения имеет смысл, только если вы уверены, что ключ уникален.

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

Как ускорить регистр сведений и не получить тормоза на больших объёмах

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

Порядок измерений и индексы

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

Флаг «Индексировать» у второстепенного измерения или реквизита нужен, только если по нему действительно отбирают в запросах. Каждый лишний индекс замедляет запись.

Итоги среза последних

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

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

Приёмы в запросах

  • ⚡ Отбор по измерениям — в параметрах виртуальной таблицы СрезПоследних(&Дата, Номенклатура В (&Список)).
  • ⚡ Срез по таблице документа — через временную таблицу ключей и соединение, а не через вызов среза для каждой строки.
  • ⚡ Если нужна цена на дату каждой строки (у строк разные даты), не делайте подзапрос в цикле: соберите максимальный период до даты строки по ключу отдельным запросом и соедините с регистром по найденному периоду.
  • ⚡ Для отчётов по истории читайте физическую таблицу регистра с отбором по периоду, а не срез.

Блокировки при записи

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

Проверка регистра перед выкладкой в рабочую базу
Выполнено: 0 / 6

Где лежат регистры сведений в типовых конфигурациях

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

Чтобы открыть регистр напрямую в интерфейсе «Такси»:

  1. Включите команду: Главное меню → Сервис → Параметры, флажок «Отображать команду “Все функции”».
  2. Откройте Главное меню → Все функции.
  3. Разверните ветку «Регистры сведений» и выберите нужный.

Для подчинённого регистра так же удобно идти от документа: кнопка просмотра движений документа (в Бухгалтерии — значок «Дт/Кт» на форме) показывает и записи регистров сведений.

КонфигурацияРегистр сведенийЧто хранит
Бухгалтерия 3.0Курсы валютКурс и кратность валюты на дату
Бухгалтерия 3.0Цены номенклатурыЦены по видам цен, записываются документом установки цен
Бухгалтерия 3.0Учетная политикаПараметры учёта организации по периодам
Бухгалтерия 3.0, УТ 11Штрихкоды номенклатурыСоответствие штрихкода товару
ЗУП 3.1Кадровая история сотрудниковПодразделение, должность, вид занятости с даты события
ЗУП 3.1Плановые начисленияНачисления и показатели сотрудника, назначенные документами

В конфигураторе найти регистр по смыслу быстрее всего поиском по синониму: в дереве метаданных нажмите Ctrl+F и введите слово из названия. Синоним (то, что видит пользователь) часто отличается от имени объекта.

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

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