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

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

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

Измерение:
Покупатель
Измерение:
Товар
Ресурс:
Цена
Реквизит:
ФИО
Магазин «Луч» Принтер 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 декабря, то кроме указания параметра виртуальной таблицы нужно ограничить отбираемые записи покупателем и товаром:

пер Запрос = Запрос{ВЫБРАТЬ
                        Цены.Покупатель КАК Покупатель,
                        Цены.Товар      КАК Товар,
                        Цены.Цена       КАК Цена,
                        Цены.ФИО        КАК ФИО
                     ИЗ
                        Цены.СрезПоследних(%ПараметрПериод) КАК Цены
                     ГДЕ
                        Цены.Покупатель == %ПараметрПокупатель
                        И Цены.Товар    == %ПараметрТовар}

Подробнее о таблице Срез последних.