Периодический регистр сведений
Периодический регистр хранит информацию (ресурсы) не только для некоторых наборов значений (измерения), но дополнительно хранит историю изменения этой информации (ресурсов) во времени.
Например, «обычный» регистр Цены товаров для покупателей может выглядеть следующим образом:
Измерение: Покупатель | Измерение: Товар | Ресурс: Цена | Реквизит: ФИО |
---|---|---|---|
Магазин «Луч» | Принтер | 10 000 | Булатов И.В. |
Магазин «Луч» | Монитор | 14 000 | Булатов И.В. |
Предприятие «Ротор» | Монитор | 11 000 | Орлова Е.Н. |
П редприятие «Ротор» | Мышь | 2 000 | Громова Н.П. |
В нем может быть только одна запись про цену принтера в магазине «Луч».
Если сделать такой регистр периодическим, тогда можно будет хранить историю изменения цен:
Период | Измерение: Покупатель | Измерение: Товар | Ресурс: Цена | Реквизит: ФИО |
---|---|---|---|---|
12.12.2021 | Предприятие «Ротор» | Принтер | 13 000 | Громова Н.П. |
12.12.2021 | Магазин «Луч» | Принтер | 10 500 | Громова Н.П. |
10.12.2021 | Магазин «Луч» | Принтер | 10 000 | Булатов И.В. |
10.12.2021 | Магазин «Луч» | Монитор | 14 000 | Булатов И.В. |
06.12.2021 | Предприятие «Ротор» | Монитор | 11 000 | Орлова Е.Н. |
03.12.2021 | Предприятие «Ротор» | Мышь | 2 000 | Громова Н.П. |
Например, в магазине «Луч» принтер стоил 10 000, а начиная с 12-го числа он стал стоить 10 500.
Чтобы сделать регистр периодическим, в проекте ему нужно установить свойство Периодичность в значение, отличное от Непериодический.
Частота изменения ресурсов
Установкой свойства Периодичность вы не только добавляете в регистр стандартное поле Период, но и указываете, как часто можно изменять значения ресурсов для тех же самых значений измерений. Например, как часто можно менять цену принтера в магазине «Луч».
«1С:Шина» предлагает на выбор несколько значений периодичности: Момент, Секунда, День, Месяц, Квартал или Год. Это значит, что запись с теми же значениями измерений можно добавить в регистр раз в миллисекунду, раз в секунду, раз в день и т. д. При этом значение ресурсов у нее может быть тем же самым (цена не изменилась) или другим (цена изменилась). Главное, что ресурсы гарантированно не могут изменяться чаще, чем периодичность регистра.
В зависимости от выбранного значения свойства Периодичность тип стандартного поля Период будет разным и значения, которые «1С:Шина» записывает в это поле, также будут отличаться:
- Если периодичность Момент, то поле Период имеет тип
Момент
. Значение хранится с точностью до миллисекунд - Если периодичность Секунда, то поле Период имеет тип
ДатаВремя
- Для остальных значений периодичности поле Период имеет тип
Дата
Если периодичность Месяц, то «1С:Шина» записывает в поле период первую дату месяца, Квартал — первую дату квартала, Год — первую дату года.
Таким образом регистр с периодичностью Месяц будет выглядеть так:
Период | Измерение: Покупатель | Измерение: Товар | Ресурс: Цена | Реквизит: ФИО |
---|---|---|---|---|
01.12.2021 | Предприятие «Ротор» | Принтер | 13 000 | Громова Н.П. |
01.12.2021 | Магазин «Луч» | Принтер | 10 500 | Громова Н.П. |
01.10.2021 | Магазин «Луч» | Принтер | 10 000 | Булатов И.В. |
01.10.2021 | Магазин «Луч» | Монитор | 14 000 | Булатов И.В. |
01.06.2021 | Предприятие «Ротор» | Монитор | 11 000 | Орлова Е.Н. |
01.03.2021 | Предприятие «Ротор» | Мышь | 2 000 | Громова Н.П. |
Тот же регистр, но с периодичностью Год, будет выглядеть так:
Период | Измерение: Покупатель | Измерение: Товар | Ресурс: Цена | Реквизит: ФИО |
---|---|---|---|---|
01.01.2012 | Предприятие «Ротор» | Принтер | 13 000 | Громова Н.П. |
01.01.2012 | Магазин «Луч» | Принтер | 10 500 | Громова Н.П. |
01.01.2010 | Магазин «Луч» | Принтер | 10 000 | Булатов И.В. |
01.01.2010 | Магазин «Луч» | Монитор | 14 000 | Булатов И.В. |
01.01.2006 | Предприятие «Ротор» | Монитор | 11 000 | Орлова Е.Н. |
01.01.2003 | Предприятие «Ротор» | Мышь | 2 000 | Громова Н.П. |
Поле СледующийПериод
В таблицах, которые «1С:Шина» формирует в языке запросов для периодического регистра сведений, автоматически создается поле СледующийПериод, доступное только для чтения. Оно представляет значение поля Период следующей записи с такими же значениями измерений или максимальное значение типа поля Период, если следующей записи нет.
Пример:
Период | СледующийПериод | Измерение: Покупатель | Измерение: Товар | Ресурс: Цена | Реквизит: ФИО |
---|---|---|---|---|---|
01.12.2021 | 9999-12-31 | Предприятие «Ротор» | Принтер | 13 000 | Громова Н.П. |
01.12.2021 | 9999-12-31 | Магазин «Луч» | Принтер | 10 500 | Громова Н.П. |
01.10.2021 | 01.12.2021 | Магазин «Луч» | Принтер | 10 000 | Булатов И.В. |
01.10.2021 | 9999-12-31 | Магазин «Луч» | Монитор | 14 000 | Булатов И.В. |
01.06.2021 | 9999-12-31 | Предприятие «Ротор» | Монитор | 11 000 | Орлова Е.Н. |
01.03.2021 | 9999-12-31 | Предприятие «Ротор» | Мышь | 2 000 | Громова Н.П. |
Обратите внимание, что цена принтера в магазине «Луч» в октябре 2021 года составляла 10 000 рублей. Однако уже в декабре цена увеличилась до 10 500 рублей, в следствии чего в таблице появилась новая запись. Таким образом, в третьей строке таблицы, описывающей стоимость принтера в магазине «Луч» на период «01.10.2021», поле СледующийПериод содержит значение «01.12.2021» — дату, когда для объекта с такими же значениями измерений (Магазин «Луч», Принтер) появилась новая запись в таблице периодического регистра сведений. Для всех остальных объектов таблицы отсутствуют более новые записи, с такими же значениями измерений, поэтому для них в поле СледующийПериод содержится максимальное значение типа Дата
: «9999-12-31».
Для того чтобы проверить наличие следующего периода у записи в таблице периодического регистра сведений, можно сравнить значение поля СледующийПериод с максимальным значением типа поля Период. Если они равны — значит значение следующего периода отсутствует для данной записи.
Получить максимальное значени е типа поля Период можно за счет использования встроенного строкового литерала соответствующего типа: Тип{Максимум}
. Например, если поле Период имеет тип Дата
, запрос может выглядеть следующим образом:
ВЫБРАТЬ
ЦеныТоваровДляПокупателейСрезПоследних.Период КАК Период,
ВЫБОР
КОГДА ЦеныТоваровДляПокупателей.СледующийПериод = Дата{Максимум} ТОГДА Дата{}
ИНАЧЕ ЦеныТоваровДляПокупателей.СледующийПериод
КОНЕЦ КАК ПериодОкончания,
ЦеныТоваровДляПокупателейСрезПоследних.Статус КАК Статус,
ЦеныТоваровДляПокупателейСрезПоследних.Комментарий КАК Комментарий
ИЗ
ЦеныТоваровДляПокупателей.СрезПоследних(&ДатаСреза) КАК ЦеныТоваровДляПокупателейСрезПоследних
Срез последних
Частая задача, ради которой используются периодические регистры сведений, заключается в получении значений на определенную дату. Например, нужно узнать, сколько стоил принтер в магазине «Луч» 11 декабря.
Для решения таких задач для периодического регистра сведений «1С:Шина» формирует в языке запросов еще одну таблицу, которая называется Срез последних. Эта таблица позволяет вам получать наиболее поздние записи по всем комбинациям измерений для указанной даты.
Например, пусть основная таблица регистра сведений имеет следующий вид:
Период | Измерение: Покупатель | Измерение: Товар | Ресурс: Цена | Реквизит: ФИО |
---|---|---|---|---|
12.12.2021 | Предприятие «Ротор» | Принтер | 13 000 | Громова Н.П. |
12.12.2021 | Магазин «Луч» | Принтер | 10 500 | Громова Н.П. |
10.12.2021 | Магазин «Луч» | Принтер | 10 000 | Булатов И.В. |
10.12.2021 | Магазин «Луч» | Монитор | 14 000 | Булатов И.В. |
06.12.2021 | Предприятие «Ротор» | Монитор | 11 000 | Орлова Е.Н. |
03.12.2021 | Предприятие «Ротор» | Мышь | 2 000 | Громова Н.П. |
Таблица Срез последних на дату 15 декабря будет содержать цену принтера в магазине «Луч» — 10 500. Такие значения называются актуальными, то есть полученными на самую старшую дату, которая есть в периодическом регистре.
Период | Измерение: Покупатель | Измерение: Товар | Ресурс: Цена | Реквизит: ФИО |
---|---|---|---|---|
12.12.2021 | Предприятие «Ротор» | Принтер | 13 000 | Громова Н.П. |
12.12.2021 | Магазин «Луч» | Принтер | 10 500 | Громова Н.П. |
10.12.2021 | Магазин «Луч» | Монитор | 14 000 | Булатов И.В. |
06.12.2021 | Предприятие «Ротор» | Монитор | 11 000 | Орлова Е.Н. |
03.12.2021 | Предприятие «Ротор» | Мышь | 2 000 | Громова Н.П. |
Таблица Срез последних на дату 11 декабря будет содержать цену принтера в магазине «Луч» — 10 000 и не будет содержать записи о цене принтера в магазине «Луч», так как на 11 декабря такой записи еще не существовало.
Период | Измерение: Покупатель | Измерение: Товар | Ресурс: Цена | Реквизит: ФИО |
---|---|---|---|---|
10.12.2021 | Магазин «Луч» | Принтер | 10 000 | Булатов И.В. |
10.12.2021 | Магазин «Луч» | Монитор | 14 000 | Булатов И.В. |
06.12.2021 | Предприятие «Ротор» | Монитор | 11 000 | Орлова Е.Н. |
03.12.2021 | Предприятие «Ротор» | Мышь | 2 000 | Громова Н.П. |
Запрос, обращающийся к таблице Срез последних, будет выглядеть следующим образом:
пер Запрос = Запрос{ВЫБРАТЬ
Цены.Покупатель КАК Покупатель,
Цены.Товар КАК Товар,
Цены.Цена КАК Цена,
Цены.ФИО КАК ФИО
ИЗ
Цены.СрезПоследних(%ПараметрПериод) КАК Цены}
Чтобы получить срез на 11 декабря, нужно передать в параметр запроса ПараметрПер иод дату 11 декабря. Тогда будут получены записи, у которых значение поля Период меньше или равно указанному значению параметра.
Чтобы получить актуальные записи (для 12 декабря и старше), нужно передать в параметр ПараметрПериод значение Неопределено
.
Таким образом, например, если вас интересует цена принтера в магазине «Луч» 11 декабря, то кроме указания параметра виртуальной таблицы нужно ограничить отбираемые записи покупателем и товаром:
пер Запрос = Запрос{ВЫБРАТЬ
Цены.Покупатель КАК Покупатель,
Цены.Товар КАК Товар,
Цены.Цена КАК Цена,
Цены.ФИО КАК ФИО
ИЗ
Цены.СрезПоследних(%ПараметрПериод) КАК Цены
ГДЕ
Цены.Покупатель == %ПараметрПокупатель
И Цены.Товар == %ПараметрТовар}