Срез последних как сделать
Срез последних на каждую дату в запросе
Получение актуальных данных из регистра сведений на дату, получаемую в самом запросе | Автор статьи: Rovan | Редакторы: Гений 1С, acsent, Defender aka LINN, Asmody, BabySG, ILM, Schwomulurn, АЛьФ, Vladal, Волшебник, Gimalaj Последняя редакция №29 от 12.08.19 | История URL: http://kb.mista.ru/article.php?id=92 |
Ключевые слова: СрезПоследних, внутри, запрос, периодический, регистр сведений
Существует несколько способов получить нужные данные.
Непосредственно в запросе
Способ подходит практически для любой ситуации и поэтому наиболее универсален. Единственный,
пожалуй, минус этого способа — если в отчете пользователю не требуется курс, то запрос будет
выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты,
на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов —
основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с
маскимальной датой (периодом).
В 8.1. вместо обращения к курсам валют удобнее и надежнее использовать временную таблицу с нужными
датами, потому что не во всех организациях ведут курсы валют ежедневно. 😉
Для общего развития:
Что есть срез последних в платформе?
В зависимости от периодичности регистра (по времени, по позиции регистратора) ВТ разворачивается в
следующий запрос:
1. По времени (год, месяц, . секунда)
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования
запросов
Система компоновки данных
Данный способ подходит для отчетов. Из очевидных плюсов — если курс (или другие данные) не нужны для
построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться
и несколько ниже, чем в первом способе.
Для примера сделаем отчет — список заказов покупателей.
Для этого создадим набор данных «Документы» — запрос:
Для того, чтобы потом успешно связать наборы данных, в запрос необходимо включить поля «Дата» и
«ВалютаДокумента». Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно
убрать, установив флажки ограничений в таблице «Поля» схемы компоновки. В остальном запрос вряд ли
требует комментариев.
http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871726.jpg
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных — запрос «Курсы
валют»:
В этом запросе имеются 2 параметра: «Дата» и «Валюта». Эти параметры будут установлены СКД при
соединении наборов. Кроме того, параметр «Дата» указан в выбранных полях — это нужно для соединения
таблиц.
В этом запросе необходимо отключить галочку «Автозаполнение».
Для ненужный полей «Дата» и «Валюта» также устанавливаем флажки ограничений, чтобы они не появлялись
в доступных полях.
http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871728.jpg
Перейдем к соединению наборов. На странице «Связи наборов данных» добавим 2 связи:
1. Источник связи — набор «Документы», приемник — набор «Курсы валют». Выражение источник — «Дата»,
выражение приемник — «Дата», Параметр — «Дата»
2. Источник связи — набор «Документы», приемник — набор «Курсы валют». Выражение источник —
«ВалютаДокумента», выражение приемник — «Валюта», Параметр — «Валюта»
http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871729.jpg
Главное здесь — параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае — запрос «Курсы валют») параметры, указанные в соединении.
Значениями параметров будут значения соответствующих полей набора-источника.
Источник
Профессия — 1С
Excel (2)
Интеграция (6)
Виртуальные таблицы (3)
рубрики: Виртуальные таблицы | Дата: 3 февраля, 2017
Для периодических регистров сведений доступны две виртуальные таблицы: СрезПервых и СрезПоследних Рассмотрим работу с этими виртуальными таблицами с использованием языка запросов 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 |
Чтобы не запутаться во всех этих скобочках и запятых, лучше воспользоваться конструктором запросов. Покажу на примере последнего запроса.
После выбора в конструкторе запроса таблицы со срезом последних необходимо нажать на кнопку Параметры виртуальной таблицы и в открывшемся окне прописать
Нетрудно догадаться, что для среза первых принцип действия такой же за исключением того, что выбирается первая запись после даты среза.
Источник
Периодические регистры сведений
Многие программисты, знакомые с версией 7.7 и желающие освоить версию 8, спрашивают, куда делись периодические реквизиты справочников и периодические константы. А если их нет, то какой механизм их заменяет? В 1С:Предприятии 8 для хранения истории изменения значений предназначены периодические регистры сведений.
Вообще регистры сведений предназначены для хранения информации, развернутой по комбинации измерений. Главное отличие периодического регистра сведений от обычного заключается в том, что в нем присутствует дополнительное системное измерение «Период», имеющее тип «дата». Это позволяет получать не только текущие сведения об объекте, но также на любой момент времени.
Для периодического реквизита при создании указывается свойство «Периодичность» из следующих возможных значений:
- в пределах секунды,
- в пределах дня,
- в пределах месяца,
- в пределах квартала,
- в пределах года,
- по позиции регистратора (доступен, если режим записи у регистра — «Подчинение регистратору»).
Обратите внимание, что тип ресурса сведений может быть как примитивный (число, строка, дата, булево), так и ссылочный (СправочникСсылка, ДокументСсылка, ПеречислениеСсылка и т.д.). Более того, в регистре сведений можно хранить даже картинки и другие неструктурированные сведения, поскольку можно создать ресурс типа «ХранилищеЗначения».
Самый простой пример периодического регистра сведений — КурсыВалют. Этот регистр сведений хранит курсы всех валют на каждый день. Структура регистра представлена ниже:
Подробная информация о структуре регистра сведений КурсыВалют приведена в следующей таблице:
Измерения: | Валюты | тип «СправочникСсылка.Валюты», ведущее, запрет незаполненных значений |
Ресурсы: | тип «число», длина 15, точность 4, неотрицательное тип «число», длина 10, точность 0, неотрицательное | |
Периодичность | В пределах дня | |
Режим записи | Независимый |
Данные в этот регистр сведений можно вводить вручную с помощью формы списка.
ВНИМАНИЕ. В регистр сведений с определенной периодичностью, не равной «По позиции регистратору», нельзя ввести две записи с одинаковым набором измерений и периодом, т.е. нельзя ввести два курса одной валюты в один день. Если периодичность записи регистра имеет значение «По позиции регистратора», то ключ уникальности записи также содержит и ссылку на документ-регистратор, т.е. в таком регистре не может существовать две записи с одинаковым набором измерений, периодом и регистратором. Это неотъемлемое свойство регистра сведений, отличающее его от остальных регистров. |
Добавление новых записей в регистр сведений, а также перебор имеющихся записей производится стандартным для всех регистров способом. В данном разделе мы рассмотрим только самое важное — получение информации из периодического регистра на определенный момент времени.
Обращение к периодическим сведениям с помощью методов
Объект РегистрСведенийМенеджер позволяет обращаться к «итогам» регистра. Под «итогами» периодического регистра сведений понимаются первые или последние значения ресурсов по указанным измерениям. При этом применяются следующие методы:
Метод | Описание | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Поле | Описание |
---|---|
Набор полей, содержащий значения измерений регистра. Имена полей соответствуют именам измерений. | |
Набор полей, содержащий значения реквизитов регистра. | |
Набор полей, который содержит значения ресурсов регистра. | |
Активность | Содержит признак активности записи. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени. |
МоментВремени | Содержит момент времени записи регистра. |
НомерСтроки | Содержит номер строки, определяемый как порядковый номер записи в наборе записей. |
Период | Содержит период, к которому относится запись регистра. |
Регистратор | Содержит ссылку на документ-регистратор движения. |
При обращении к виртуальным таблицам СрезПервых и СрезПоследних можно указать следующие параметры:
Параметр | Описание |
---|---|
Дата | Указывается дата или момент времени, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние/ранние записи. |
Условие | Указывается условие на языке запросов. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние/ранние. Условие будет применяться к исходным записям, а не к уже отобранным. |
Приведем примеры обращения к записям регистра сведений с помощью запросов:
Пример 1. Выбрать все записи регистра сведений
Пример 2. Получить актуальный курс одной валюты на заданную дату
Пример 3. Выбрать актуальные курсы всех валют на заданную дату
Пример 4. Получить актуальный прайс-лист на заданную дату (указан определенный тип цен, например, «Розничная»)
Источник