Страницы

11 августа 2021

Регистры сведений


 Сегодня поговорим о Регистре сведений.

Содержание:

1. Регистр сведений - это

2. Виды регистров сведений

3. Измерения, ресурсы, реквизиты регистра сведений

4. Периодический регистр сведений

5. Свойства регистра и измерений

6. Добавление записи в регистр сведений

7. Изменение значения ресурса записи регистра сведений

8. Удаление выбранных записей в регистре сведений

9. Очистка регистра сведений от записей

10. Получить значение ресурса регистра сведений на дату


1. Регистр сведений - это 

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

2. Виды регистров сведений

По подчиненности регистратору:
  • Независимый регистр сведений - регистр не подчинен регистратору (документу).
  • Зависимый регистр сведений - регистр подчинен регистратору (документу).

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

3. Измерения, ресурсы, реквизиты регистра сведений

Измерения – описывают разрезы, в которых хранится информация.
Ресурсы – содержат хранимую информацию в разрезе измерения.
Тип ресурса сведений может быть как примитивный (число, строка, дата, булево), так и ссылочный (СправочникСсылка, ПеречислениеСсылка и т.д.). В ресурсе можно хранить даже картинки и другие неструктурированные сведения, поскольку можно создать ресурс типа "ХранилищеЗначения". Ресурс может быть составным типом.
Реквизиты - несут дополнительную информацию (как комментарий), которую нельзя получить из виртуальных таблиц регистра в разрезе измерений.

Рассмотрим пример для понимания смысла измерения и ресурса регистра сведений.


Если узнаем цену Тяпки на любую дату до 1 августа 2021 года, она будет ровна нулю.
Если узнаем цену Тяпки на любую дату с 1 августа 2021 года до 10 августа 2021, она будет равна 175 рублям.
Если узнаем цену Тяпки на любую дату с 10 августа 2021 года по текущую дату, она будет равна 192 рублям.
Внимание! Описанный выше пример несет образный характер и периоды в примере рассматривали приблизительно. Для точного определения даты и времени для вычисления цены необходимо использовать Дату, МоментВремени или Границу зависит от решаемой задачи. Об особенностях использования периодов и моментов времени поговорим в следующей статье.


4. Периодический регистр сведений

Периодичность:
  • Непериодический
  • В пределах секунды
  • В пределах дня
  • В пределах месяца
  • В пределах квартала
  • В пределах года
Если регистр подчинен регистратору, то добавляется периодичность:
  • По позиции регистратора
При выборе периодичности автоматически добавляется измерение Период с типом Дата.

Внимание! При выборе периодичности (кроме "По позиции регистратору"), платформа будет контролировать уникальность записей в пределах заданной периодичности, в таком случаи в регистратор нельзя записать две записи с одинаковым набором Измерений и Периодом. Последовательность состоящая из Измерений и Периода называется Ключом уникальности.
При выборе периодичности "По позиции регистратору" ключ уникальности будет содержать дополнительно ссылку на регистратор (документ), в таком случаи в регистратор нельзя записать две записи с одинаковым набором Измерений, Периодом и Регистратором. 
Если запись не уникальна, платформа выдает сообщение “Запись с такими ключевыми полями существует!” и не даст записать набор записей в регистр сведений.

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

5. Свойства регистра и измерений

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

6. Добавление записи в регистр сведений

Добавление через МенеджерЗаписи, подойдет для добавления одной записи.

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

Добавление через НаборЗаписей, подойдет для добавления одной или нескольких записей.

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

7. Изменение значения ресурса записи регистра сведений

Изменение значение ресурса записи через НаборЗаписей, подойдет для изменения одной или нескольких записей.

НаборЗаписей = РегистрыСведений.Цены.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(Дата,Истина);
НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура,Истина);
НаборЗаписей.Прочитать();
Если Не НаборЗаписей.Количество() = 0 Тогда
    СуществующаяЗапись = НаборЗаписей[0];
    СуществующаяЗапись.Период = Дата;
    СуществующаяЗапись.Номенклатура = Номенклатура;
    СуществующаяЗапись.Цена = Цена;
    НаборЗаписей.Записать();
КонецЕсли;

8. Удаление выбранных записей в регистре сведений

Удаление записей через НаборЗаписей, подойдет для удаления одной или нескольких записей.

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

9. Очистка регистра сведений от записей

Очистка регистра от записей через НаборЗаписей.

НаборЗаписей РегистрыСведений.Цены.СоздатьНаборЗаписей();
НаборЗаписей.Записать();

10. Получить значение ресурса регистра сведений на дату

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

Если в нашем примере указать дату 110.08.2021, то на эту дату нет записей в регистре, тогда метод вернет пустую цену.

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

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


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

Отбор = Новый Структура("Номенклатура",Номенклатура);
ЗначенияРесурсов = РегистрыСведений.Цены.СрезПоследних(Дата,Отбор);
Цена = ЗначенияРесурсов[0].Цена;




1 комментарий:

  1. Пример "Добавление через НаборЗаписей, подойдет для добавления одной или нескольких записей." не совсем корректный, надо добавить замечание о том что это не добавление записи, а перезапись регистра новыми записями, т.к. там регистр не читается в набор.

    ОтветитьУдалить