1с срез последних параметры виртуальной таблицы в запросе
Профессия — 1С
рубрики: Виртуальные таблицы | Дата: 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 |
Чтобы не запутаться во всех этих скобочках и запятых, лучше воспользоваться конструктором запросов. Покажу на примере последнего запроса.
После выбора в конструкторе запроса таблицы со срезом последних необходимо нажать на кнопку Параметры виртуальной таблицы и в открывшемся окне прописать
Нетрудно догадаться, что для среза первых принцип действия такой же за исключением того, что выбирается первая запись после даты среза.
Один комментарий на «“Срез последних”»
Спасибо за понятное объяснение. Полно в сети объясняющих, которые только запутывают в этом, хоть не сложном но очень важном вопросе.
Срез последних регистра сведений 1с
При использовании периодических регистров сведений в 1с 8 есть возможность получить срез последних на какую либо дату. Он представляет из себя последние данные на указанную дату для уникальной комбинации измерений. Причем срез последних 1с можно взять как по одному измерению, так и по нескольким. По сути это данные регистра, актуальные на указанную дату.
Срез последних можно получить несколькими способами:
Получить срез последних на дату при помощи метода СрезПоследних
Рассмотрим на примере получение среза на дату по регистру ЦеныНоменклатуры, по конкретной заданной номенклатуре при помощи метода СрезПоследних.
Метод возвращает таблицу значений, заполненную данными найденных строк регистра.
Пример. Пусть в переменной Номенклатура хранится позиция номенклатуры по которой необходимо получить данные, а в переменной Дата хранится дата на которую необходимо получить цены. Данный пример подходит для конфигурации Бухгалтерия (ред. 2.0 / 3.0).
Получить срез последних регистра сведений запросом
Рассмотрим пример среза последних по регистру сведений в запросе. Для примера возьмем регистр ЦеныНоменклатуры из конфигурации Бухгалтерия (ред. 2.0 / 3.0). В запросе будем использовать виртуальную таблицу СрезПоследних нужного регистра. В первый параметр таблицы передается дата, на которую необходим срез, во втором можно задать произвольное условие для полей регистра.
Срез последних на каждую дату в запросе 1с
Бывают ситуации, когда срез регистра сведений необходимо получить не на конкретную дату, а на несколько дат. Но в запросе, в виртуальную таблицу можно передать только одну дату. В следующем примере будет показано, как это сделать.
Пример 3. По номенклатуре, необходимо получить все реализации за период и определить какая цена была установлена на данную номенклатуру в момент продажи по типу цен из реализации.
Вкратце принцип действия данного механизма следующий:
Если хотите подробней узнать о периодических регистрах сведений зайдите на сайт 1С:ИТС
Конструктор запросов 1С — обучение на примерах
Урок 6. Виртуальные таблицы и их использование в конструкторе запросов
Задача 1: Получить остатки номенклатуры на указанном складе на конец месяца.
Задача 2: Получить актуальную цену на конец месяца по указанной номенклатуре и типу цен.
Новые механизмы: заполнение параметров виртуальных таблиц.
Теоретическая часть урока №6
У некоторых объектов метаданных помимо основной таблицы в базе данных присутствуют виртуальные таблицы. Они облегчают доступ к некоторой информации содержащейся в основной таблице. Использовать данные виртуальных таблиц можно при помощи запросов, либо при помощи специальных методов встроенного языка 1с 8.
Рассмотрим основные виды виртуальных таблиц 1с для различных объектов метаданных:
Конструктор запросов позволяет работать с виртуальными таблицами регистров. Если у регистра есть виртуальные таблицы, то они будут находится в разделе База данных на вкладке Таблицы и поля после основной таблицы регистра.
Для того чтобы получить нужные данные из виртуальной таблицы регистра, необходимо заполнить ее параметры. Разберем заполнение параметров для основных виртуальных таблиц. Для того чтобы открыть окно параметров виртуальной таблицы, ее необходимо перенести из раздела База данных, в раздел Таблицы, выделить и нажать в кнопку Параметры виртуальной таблицы.
СрезПоследних и СрезПервых
Остатки в регистре накопления
Остатки в регистре бухгалтерии
При помощи данного параметра можно увеличить скорость выполнения запроса, исключив ненужную аналитику. Субконто в виртуальной таблице будут доступны в том порядке, в котором они стоят в массиве. Если в параметр передано меньше видов субконто, чем существует на счете, то не указанные в параметре субконто использовать нельзя. Данный параметр не является обязательным, если он не задан, то в виртуальной таблице используются все доступные субконто.
Обороты в регистре накопления
Обороты в регистре бухгалтерии
Остатки и обороты в регистре накопления
Остатки и обороты в регистре бухгалтерии
Все параметры используемые в данной таблице были описаны в предыдущих пунктах.
Обороты Дебет Кредит
Движения с субконто
Практическая часть урока №6
В данном разделе нам предстоит решить две задачи по пройденной теме.
Задача 1
Получить остатки номенклатуры на указанном складе на конец месяца.
Для простоты предположим, что весь учет товаров на складах идет по 41 счету бухгалтерского учета.
В итоге у нас получится запрос со следующим текстом:
Задача 2
Получить актуальную цену на конец месяца по указанной номенклатуре и типу цен.
В итоге у нас получится запрос со следующим текстом:
Получение данных из регистра сведений в 1С 8.3
Выборка из регистра сведений
Выборку из непериодического независимого регистра сведений можно получить с помощью метода Выбрать. Первым параметром можно передать структуру с отбором, но только по одному измерению или реквизиту, и это измерение или реквизит должны быть проиндексированы.
Для периодического независимого регистра сведений первыми двумя параметрами указывается отбор по периоду:
Для выборки из подчиненного регистра сведений используется метод ВыбратьПоРегистратору. Параметром передается ссылка на регистратор:
Но как правило выборка получается запросом, где можно использовать различные отборы и сортировку:
Преимущество метода Выбрать только в том, что если в регистре сведений много записей, то через данный метод выборка будет получаться порциями. А выборка запроса сразу загрузит все данные в оперативную память.
Получение данных из регистра сведений
Метод Получить позволяет получить значения всех ресурсов регистра сведений. Параметром нужно передать структуру с отбором по всем измерениям. Данный метод вернет структуру, где ключи это имя ресурсов, а значения — значения ресурсов:
Если регистр сведений периодический, то первым параметром нужно передать период записи. Если нет ни одной записи с таким периодом, то будет получена запись с минимальным периодом:
Иногда нужно получить значения ресурсов из периодического регистра сведений не за конкретную дату, а последнее значение, которое было установлена до указанной даты. Например, есть регистр сведений со следующим содержимым:
Если попытаться получить данные на 15 апреля методом Получить, то будет получена нулевая цена, потому что именно за 15 апреля нет записи в регистре сведений:
Чтобы получить последнее значение ресурсов регистра сведений на указанную дату можно воспользоваться методом ПолучитьПоследнее:
Также есть обратный метод ПолучитьПервое, который получает первое установленное значение ресурса после переданной параметром даты:
Срез последних
Если нужно получить последние значения ресурсов сразу по нескольким измерениям, то можно использовать метод СрезПоследних. Данный метод вернет таблицу значений со всеми измерениями, ресурсами и реквизитами регистра сведений. Первым параметром передается дата, на которую нужно получить срез, вторым можно передать отбор.
Добавим в регистр еще несколько записей:
Получим срез на 15 апреля:
Будет получена следующая таблица значений:
| Период | Товар | ТипЦен | Цена |
|---|---|---|---|
| 10.04.2021 | Тумбочка | Оптовая | 20 |
| 10.04.2021 | Шкаф | Оптовая | 200 |
Алгоритм выполнения данного метода следующий:
На практике метод СрезПоследних почти не применяется, потому что гораздо удобней пользоваться виртуальной таблицей СрезПоследних. Данная таблица называется виртуальной, потому что она не хранится физически в СУБД, а формируется непосредственно при выполнении запроса. Запрос, который выполняется для получения данной таблицы такой же как для метода СрезПоследних. Также у виртуальной таблицы есть два параметра: дата и отбор. Состав полей виртуальной таблицы совпадает с составом полей основной таблицы регистра.
Рассмотрим использование данной таблицы на примере:
В параметрах можно использовать произвольные отборы по любым измерениям, реквизитам и ресурсам:
Отбор, который указан в параметрах виртуальной таблицы выполняется еще на этапе формирования виртуальной таблицы. Если установить тот же отбор в предложении ГДЕ, то сначала будут получены все записи регистра, а после этого часть из них будет отброшена. Для повышения производительности выполнения запросов условия нужно накладывать через параметры виртуальной таблицы.
Также отбор через параметры виртуальной таблицы и в предложении ГДЕ может приводить к разным результатам запроса. Например, нужно получить все товары, на которые когда либо была установлена цена в 100 рублей. Если установить отбор в параметрах виртуальной таблицы:
То в результате будет получен Шкаф, на который была установлена цена в 100 рублей 1 апреля:
А если установить отбор в предложении ГДЕ:
То не будет получено ни одного товара, потому что сначала был получен срез последних, а уже из среза последних отбирались записи с ценой 100, которых там не было.
Также у регистра сведений есть метод СрезПервых и виртуальная таблица СрезПервых. Они полностью зеркальны методу и виртуальной таблице СрезПоследних. То есть выбираются самые первые записи после указанной даты (или просто самые первые записи, если период в параметрах не задан).
Итоги регистра сведений
В настройках периодического регистра сведений, на закладке Прочее можно включить использование итогов Разрешить итоги: срез первых и Разрешить итоги:срез последних:
После сохранения конфигурации базы данных будут созданы две таблицы для хранения итогов: самые первые и самые последние. Если теперь в запросе обратиться к виртуальной таблице среза первых или среза последних и в параметрах не указать дату, а также указать отбор только по измерениям или не указать отбор совсем, то данные будут получены из таблицы итогов, а не из основной таблицы регистра сведений.
Это можно использовать для оптимизации запросов, когда часто получается срез самых последних или срез самых первых записей регистра.
Разрешение итогов для периодических регистров сведений
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
Методическая рекомендация (полезный совет)
1.1. Для периодических регистров сведений рекомендуется разрешить итоги, если выполнены все следующие условия:
Например, если в конфигурации предусмотрены часто выполняющиеся запросы к регистру ЦеныНоменклатуры для получения текущих цен номенклатуры:
ВЫБРАТЬ
Номенклатура.Артикул КАК Артикул,
ЦеныНоменклатуры.Цена КАК Цена,
.
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатуры
ПО ЦеныНоменклатуры.Номенклатура = Номенклатура.Ссылка
.
то при соблюдении всех остальных условий, перечисленных выше, установка свойства Разрешить итоги: срез последних существенно ускорит выполнение таких запросов, засчет того, что выборка будет выполняться напрямую из дополнительных таблиц, в которых хранятся только последние значения (для среза последних) и первые значения (для среза первых).
1.2. Кроме того, следует рассмотреть альтернативные варианты по пересмотру запросов к регистру таким образом, чтобы эти условия выполнялись.
Например, если в некоторых случаях данные в регистр ЦеныНоменклатуры записываются будущей датой, а при подборе товаров к этому регистру выполняется запрос всегда на текущую дату (дата явно задана в параметре виртуальной таблицы СрезПоследних ), то итоги не будут ускорять выполнение таких запросов. Поскольку итоги строятся только для первых и последних записей регистра.
Однако если при открытии формы подбора товаров анализировать, есть ли регистраторы с будущей датой, и если их нет – выполнять другой запрос к срезу последних без установки даты, то такой запрос будет работать быстрее.
2. Во всех остальных случаях, не следует разрешать итоги для периодических регистров сведений. Прежде всего, если
ВЫБРАТЬ
.
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Код = &КодВалютыСклада) КАК КурсыВалют
3. Не требуется предусматривать в конфигурации отдельного механизма пересчета итогов, так как актуализация таблиц итогов выполняется автоматически при каждой записи набора записей в регистр.

















