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