Перейти к основному содержимому

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

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

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

Измерение: ПокупательИзмерение: ТоварРесурс: ЦенаРеквизит: ФИО
Магазин «Луч»Принтер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.20219999-12-31Предприятие «Ротор»Принтер13 000Громова Н.П.
01.12.20219999-12-31Магазин «Луч»Принтер10 500Громова Н.П.
01.10.202101.12.2021Магазин «Луч»Принтер10 000Булатов И.В.
01.10.20219999-12-31Магазин «Луч»Монитор14 000Булатов И.В.
01.06.20219999-12-31Предприятие «Ротор»Монитор11 000Орлова Е.Н.
01.03.20219999-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 декабря, то кроме указания параметра виртуальной таблицы нужно ограничить отбираемые записи покупателем и товаром:

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

См. также