Периодические регистры сведений
Многие программисты, знакомые с версией 7.7 и желающие освоить версию 8, спрашивают, куда делись периодические реквизиты справочников и периодические константы. А если их нет, то какой механизм их заменяет? В 1С:Предприятии 8 для хранения истории изменения значений предназначены периодические регистры сведений.
Вообще регистры сведений предназначены для хранения информации, развернутой по комбинации измерений. Главное отличие периодического регистра сведений от обычного заключается в том, что в нем присутствует дополнительное системное измерение «Период», имеющее тип «дата». Это позволяет получать не только текущие сведения об объекте, но также на любой момент времени.
Для периодического реквизита при создании указывается свойство «Периодичность» из следующих возможных значений:
- в пределах секунды,
- в пределах дня,
- в пределах месяца,
- в пределах квартала,
- в пределах года,
- по позиции регистратора (доступен, если режим записи у регистра — «Подчинение регистратору»).
Обратите внимание, что тип ресурса сведений может быть как примитивный (число, строка, дата, булево), так и ссылочный (СправочникСсылка, ДокументСсылка, ПеречислениеСсылка и т.д.). Более того, в регистре сведений можно хранить даже картинки и другие неструктурированные сведения, поскольку можно создать ресурс типа «ХранилищеЗначения».
Самый простой пример периодического регистра сведений — КурсыВалют. Этот регистр сведений хранит курсы всех валют на каждый день. Структура регистра представлена ниже:
Подробная информация о структуре регистра сведений КурсыВалют приведена в следующей таблице:
Измерения: | Валюты | тип «СправочникСсылка.Валюты», ведущее, запрет незаполненных значений |
Ресурсы: | тип «число», длина 15, точность 4, неотрицательное тип «число», длина 10, точность 0, неотрицательное | |
Периодичность | В пределах дня | |
Режим записи | Независимый |
Данные в этот регистр сведений можно вводить вручную с помощью формы списка.
ВНИМАНИЕ. В регистр сведений с определенной периодичностью, не равной «По позиции регистратору», нельзя ввести две записи с одинаковым набором измерений и периодом, т.е. нельзя ввести два курса одной валюты в один день. Если периодичность записи регистра имеет значение «По позиции регистратора», то ключ уникальности записи также содержит и ссылку на документ-регистратор, т.е. в таком регистре не может существовать две записи с одинаковым набором измерений, периодом и регистратором. Это неотъемлемое свойство регистра сведений, отличающее его от остальных регистров. |
Добавление новых записей в регистр сведений, а также перебор имеющихся записей производится стандартным для всех регистров способом. В данном разделе мы рассмотрим только самое важное — получение информации из периодического регистра на определенный момент времени.
Обращение к периодическим сведениям с помощью методов
Объект РегистрСведенийМенеджер позволяет обращаться к «итогам» регистра. Под «итогами» периодического регистра сведений понимаются первые или последние значения ресурсов по указанным измерениям. При этом применяются следующие методы:
Метод | Описание | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Поле | Описание |
---|---|
<Имя измерения> | Набор полей, содержащий значения измерений регистра. Имена полей соответствуют именам измерений. |
<Имя реквизита> | Набор полей, содержащий значения реквизитов регистра. |
<Имя ресурса> | Набор полей, который содержит значения ресурсов регистра. |
Активность | Содержит признак активности записи. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени. |
МоментВремени | Содержит момент времени записи регистра. |
НомерСтроки | Содержит номер строки, определяемый как порядковый номер записи в наборе записей. |
Период | Содержит период, к которому относится запись регистра. |
Регистратор | Содержит ссылку на документ-регистратор движения. |
При обращении к виртуальным таблицам СрезПервых и СрезПоследних можно указать следующие параметры:
Параметр | Описание |
---|---|
Дата | Указывается дата или момент времени, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние/ранние записи. |
Условие | Указывается условие на языке запросов. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние/ранние. Условие будет применяться к исходным записям, а не к уже отобранным. |
Приведем примеры обращения к записям регистра сведений с помощью запросов:
Пример 1. Выбрать все записи регистра сведений
Пример 2. Получить актуальный курс одной валюты на заданную дату
Пример 3. Выбрать актуальные курсы всех валют на заданную дату
Пример 4. Получить актуальный прайс-лист на заданную дату (указан определенный тип цен, например, «Розничная»)
Что такое срез последних по регистру сведений 1с
Описание:
Основная задача регистра сведений — хранить существенную для прикладной задачи информацию, состав которой развернут по определенной комбинации значений и, при необходимости, развернут во времени. Регистры сведений информация в которых развернута во времени, называются периодическими.
Например, если мы хотим хранить информацию о ценах конкурентов на продаваемые нами товары, то собранная информация о ценах разворачивается по товарам и конкурентам. А если мы хотим отслеживать динамику изменений цен, и будем заносить их периодически, то хранимая информация разворачивается также и во времени.
Регистр сведений, фактически, представляет собой массив данных, необходимый, чтобы реализовать функцию, которая может выдать необходимую информацию по определенному набору аргументов. Аргументы функции называются измерениями, а результат функции — ресурсами. В приведенном выше примере регистр «ЦеныКонкурентов» будет содержать измерения «Конкурент» и «Товар», и ресурс «Цена». Ресурсов может быть больше чем один: например, можно хранить оптовую и розничную цены.
Для разворота этой информации во времени используется поле «Период» регистра. Оно не вносится в качестве измерения, а добавляется системой автоматически при создании периодического регистра.
Для периодических регистров сведений система поддерживает такие стандартные операции, как получение наиболее позднего или наиболее раннего значения по определенной комбинации измерений (например, получение последней введенной цены по конкретному товару и конкретному конкуренту), а также получения среза наиболее поздних или ранних значений. Например, могут быть получены все последние введенные цены по различным товарам и конкурентам.
Если регистр не периодический, то поле «Период» для него не создается. В приведенном примере регистр «ЦеныКонкурентов» может быть непериодическим, если мы не хотим хранить историю изменения цен, а хотим иметь только актуальные цены. Тогда функция регистра сможет ответить на вопрос «какая сейчас цена у такого-то конкурента на такой-то товар», но не сможет ответить на вопрос «какая была цена у такого-то конкурента на такой-то товар в начале года».
Из описанных принципов работы регистра сведений вытекает то, что в системе может быть только одна запись с определенным набором и периодом измерений.
Действительно, по одному товару по одному конкуренту может быть только одна цена. Если по какой-либо причине мы можем получить несколько цен и хотим занести эту информацию в базу данных, то нам нужно создать еще одно измерение для хранения того значения, по которому эти цены могут различаться. Например, можно завести измерение «ИсточникИнформации». Тогда можно будет вводить цены конкурентов в разрезе источников.
Уникальность записей по набору измерений принципиально отличает регистры сведений от регистров накоплений, которые позволяют вводить несколько записей с одинаковым значением измерений и периодом.
Строки регистра сведений, содержащие информацию о значениях ресурсов для определенных значений измерений и конкретного периода, называются записями. Записи в регистр сведений можно вносить двумя способами: вручную или документами.
Эти два варианта влияют на способ внесения информации, а не на основную логику работы регистра.
Документ, которым вносится запись в регистр сведений, называется регистратором.
Регистры, записываемые независимо, могут свободно редактироваться вручную или средствами встроенного языка. При этом если измерение такого регистра назначено как «ведущее» и значением измерения является ссылка на объект базы данных, то будет считаться, что запись регистра имеет смысл, только пока существует этот объект. Например, если назначить ведущим измерение «Конкурент», то считается, что запись имеет смысл только как информация по данному конкуренту. Соответственно, при удалении конкурента записи по нему будут удалены автоматически.
Если регистр записывается регистратором, то это значит, что записи будут жестко подчинены регистраторам — документам. Обычно это значит, что записи будут порождаться при проведении документов. Соответственно, при удалении документа записи будут удаляться автоматически. В отличие от ведущих измерений, регистратор может быть только один.
В программных модулях для общих действий над регистром сведений (поиск, выбор и создание записей регистра) служит объект РегистрСведенийМенеджер.<Имя регистра сведений>. Для чтения, записи и удаления отдельных записей регистра сведений, не управляемого регистраторами, служит объект РегистрСведенийМенеджерЗаписи.<Имя регистра сведений>. Для считывания и занесения набора записей в базу данных по определенному условию отбора служит объект РегистрСведенийНаборЗаписей.<Имя регистра сведений>. Для динамического обхода записей регистра служит объект РегистрСведенийВыборка.<Имя регистра сведений>.
Срез последних
Для периодических регистров сведений доступны две виртуальные таблицы: СрезПервых и СрезПоследних Рассмотрим работу с этими виртуальными таблицами с использованием языка запросов 1С. Гораздо чаще применяется СрезПоследних, поэтому с него и начнем.
Срез последних позволяет получить последнюю запись регистра сведений на указанную дату в разрезе измерений. Для таблицы среза последних(первых) есть возможность в скобках указать два параметра через запятую. В первом параметре передается дата на которую делается срез (если параметр не указан срез делается на текущую дату). Второй параметр представляет из себя условие на языке запросов 1С и позволяет устанавливать различные отборы. Как правило в этих отборах используются измерения. Все это звучит достаточно туманно, поэтому без примера никак не обойтись.
Итак пусть у нас есть периодический регистр сведений Цена в котором храняться цены в разрезе товаров и поставщиков. Периодичность регистра — день.
В регистре имеются следующие записи
Период | Товар | Поставщик | Сумма |
---|---|---|---|
01.01.2017 | Карандаш | ООО «Леспром» | 10 |
25.01.2017 | Карандаш | ООО «Леспром» | 15 |
01.01.2017 | Карандаш | ПАО «Канцтовары» | 27 |
01.02.2017 | Карандаш | ПАО «Канцтовары» | 31 |
03.01.2017 | Ручка | ПАО «Канцтовары» | 137 |
01.02.2017 | Ручка | ПАО «Канцтовары» | 145 |
Для начала получим срез последних без использования параметров выполнив вот такой запрос
Так как параметры не указаны срез выполняется на текущую дату – 01.02.2017. В результате получаем вот такую таблицу
Период | Товар | Поставщик | Сумма |
---|---|---|---|
25.01.2017 | Карандаш | ООО «Леспром» | 15 |
01.02.2017 | Карандаш | ПАО «Канцтовары» | 31 |
01.02.2017 | Ручка | ПАО «Канцтовары» | 145 |
Здесь мы видим, что комбинация измерений Товар + Поставщик уникальна, т.е. для каждой комбинации измерений регистра была взята запись с максимальной датой, и дата записи меньше или равна текущей дате.
Допустим нам надо сделать то же самое но записи мы хотим получить с датой меньшей или равной 15.01.2017. Для этого необходимо в запросе изменить строку с таблицей среза последних следующим образом
Перед выполнением запроса в него конечно же надо передать параметр &ДатаСреза. Теперь результат запроса будет выглядеть так
Период | Товар | Поставщик | Сумма |
---|---|---|---|
01.01.2017 | Карандаш | ООО «Леспром» | 10 |
01.01.2017 | Карандаш | ПАО «Канцтовары» | 27 |
03.01.2017 | Ручка | ПАО «Канцтовары» | 137 |
И наконец представим, что нам надо получить срез последних на ту же дату с условием, что товар у нас Карандаш, а поставщик Канцтовары. Для этого укажем в запросе второй параметр
В итоге получим только одну запись
Период | Товар | Поставщик | Сумма |
---|---|---|---|
01.01.2017 | Карандаш | ПАО «Канцтовары» | 27 |
Чтобы не запутаться во всех этих скобочках и запятых, лучше воспользоваться конструктором запросов. Покажу на примере последнего запроса.
После выбора в конструкторе запроса таблицы со срезом последних необходимо нажать на кнопку Параметры виртуальной таблицы и в открывшемся окне прописать
Нетрудно догадаться, что для среза первых принцип действия такой же за исключением того, что выбирается первая запись после даты среза.
Срез последних на дату
При использовании технологии хранения информации в базе данных, иногда требуется не только знать актуальную информацию на данный момент, но и то какое значение было актуальным в определенное время. Поэтому в данной статье мы поговорим о периодических регистрах сведений, которые обеспечивают именно эту возможность.
Для более предметного рассмотрения на примерах будет использоваться регистр “ЦеныНоменклатуры”, но это же применимо и к другим периодическим регистрам сведений. Прежде всего, необходимо понимать, что такое измерения, и что такое ресурсы.
Измерения – это то, в разрезе чего хранится информация. То есть в данном случае мы смотрим цены в разрезе номенклатуры и типов цен. Соответственно, номенклатура и тип цен являются измерениями.
Ресурсы непосредственно хранят интересующую нас информацию. Мы хотим знать цену для определенной номенклатуры. Следовательно, цена – это ресурс.
Помимо этого, надо понимать, что такое периодичность. Именно эта возможность регистра сведений позволяет хранить не только фактическую информацию на данный момент, но и узнавать интересующие нас значения в разрезе времени.
Получить срез последних на дату из регистра сведений можно двумя способами: с помощью метода менеджера регистра сведений и с помощью запроса регистра сведений.
1. Методы менеджера регистра сведений
Результат = РегистрыСведений.ИмяРегистраСведений.СрезПоследних (<Конец периода>, <Отбор>);
Конец периода – Дата среза.
Отбор – отбор по измерениям регистра сведений (Структура).
Результат – Итог (Таблица значений)
Подобным образом работает метод:
Результат = РегистрыСведений.ИмяРегистраСведений.ПолучитьПоследнее (<Конец периода>, <Отбор>).
2. Запрос регистра сведений
Так как мы работаем с периодическим регистром сведений, у нас появляется возможность работать с двумя виртуальными таблицами: “СрезПервых” и “СрезПоследних”.
Таблицы СрезПервых и СрезПоследних
Соответственно, работая с ними, можно получить необходимую Вам информацию. Нас интересует “СрезПоследних”. При выведении данной виртуальной таблицы регистра с помощью запроса в результате будет последнее значение ресурса, принадлежащее измерению. Но, к примеру, нам необходимо узнать, какая цена была в конкретный день. В случае получения среза на дату необходимо указать в запросе дату. Дату в запросе указываем в параметрах виртуальной таблицы.
Как указать дату в запросе?
Таким образом меняя этот параметр можно выводить срез на разные даты. В дальнейшем можно вносить дополнительные настройки для конкретизации выводимых данных, но это уже другая история.
Зная вышеперечисленные способы, можно подобрать именно тот, который подходит именно под Вашу задачу или Ваш конкретный случай.