Срез последних как работает
Особенность получения среза последних записей в регистре сведений
Исходные данные
В тестовой конфигурации у нас есть периодический регистр сведений «ЦеныНоменклатуры» со следующими исходными данными:
На рисунке представлена также структура метаданных регистра. Как мы видим, регистр содержит измерение «Товар» с типом ссылки на справочник «Товары», а также числовой ресурс «Цена» и реквизит «СтараяЦена».
Допустим, в отчете нам нужно получить срез последних записей для товаров и их цен с условием, что старая цена меньше или равно 50.
Два варианта запроса
Сразу скажу, что рассматривать будем правильный и не правильный варианты.Начнем с последнего. Эту ошибку часто делают начинающие программисты. И так, для отчета был написан следующий запрос:
Обратите внимание на условие в секции «ГДЕ». В этом и заключается главная ошибка! Этот запрос не вернет ни одной записи, и вот почему: при использовании виртуальных таблиц, в нашем случае «СрезПоследних», сначала выполняется выборка данных из базы по условиям, описанным в виртуальной таблице, а затем выполняются действия, описанные в тексте запроса (группировки, условия в секции «ГДЕ», сортировка и т.д.).
Поэтому в нашем примере запрос и не возвращает результат. Сначала он получает срез последних, а уже после устанавливает условие на реквизит «СтараяЦена». Вот так это выглядит на схеме:
Чтобы правильно решить задачу, условие на реквизит «СтараяЦена» нужно перенести в условия виртуальной таблицы. Вот так будет выглядеть правильный текст запроса:
Теперь запрос получит правильные данные, поскольку срез последних цен будет получать уже с учетом условия по реквизиту «СтараяЦена».
Результаты
Следует понимать, что описанное выше относится ко всем случаям использования виртуальных таблиц в запросах (для регистров накопления, регистров бухгалтерии, задач и т.д.).
Отсюда также вытекает главное правило по использованию виртуальных таблиц: «используя виртуальную таблицу обязательно устанавливайте параметры отбора непосредственно в виртуальной таблице, иначе запрос будет получать излишние данные, на которые уже потом будут устанавливаться отборы».
Профессия — 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С:ИТС
Срез последних
Почему срез последних в запросе возвращает две записи по одному измерению?
Мне всегда казалось что такой запрос должен возвращать одну запись.
Ок, кажется догнал, что означало «По каждой комбинации измерений будет найдена наиболее поздняя запись, но не более поздняя, чем указанная дата. «
(7) На самом деле должен, согласно документации. Просто я думал, что СрезПоследних работает аналогично таблицам остатков и оборотов регистров накопления.
Вот что написано в документации про регистр сведений:
А вот что про регистр накопления:
(9) чем отличаются фразы?
1. По каждой комбинации измерений
2. По каждой комбинации измерений, выбранных в запросе
И, кстати, вот что написано в синтакс-помощнике: «Записи подбираются для каждого сочетания из ВСЕХ Имеющихся значений измерений регистра.»
Т.е. не из выбранных, а имеющихся
(11)Если у вы изначально знаете по каким измерениям вам надо срез последних (надо понимать, что б получить 1 запись, надо указать все измерения) то срез последних всё же подойдет.
А если вы не знаете по каким измерениям вам надо срез(знаете только 1 измерение), будьте готовы получить надцать записей. Ведь программа не может за вас додумать что вам конкретно надо, а уже эти записи фильтруйте/группируйте как хотите.
Автор ожидал от программы такой логики:
Программист указал в выборке всего одно измерение, значит остальные измерения его не интересуют, таким образом выдаём ему последнее значение по интересующему измерению, не зависимо от остальных измерений.
Теперь то я буду аккуратнее обращаться со срезом последних =)
(15)Всё верно, вот только если четко задать эти измерения то получишь 1 строку 🙂
Хотел тему новую создавать, но гугл привел меня сюда. Тоже думал что СрезПоследних будет только по измерению в запросе.
Срез последних в запросе за период, с периодичностью месяц
Доброго времени. Обработка разработана, как показательный шаблон для выборки цен номенклатуры с отбором по номенклатуре и периоду.
1. Задаем параметры в шапке документа (Номенклатура, ДатаНачала, ДатаОкончания).
3. Табличное поле заполняется последней ценой каждого месяца периода.
Скачать файлы
Специальные предложения
Если нужен срез последних, то тоже нужно поменять запрос так, как я сказал. Иначе ваша ошибка будет размножаться.
(8) зря вы так упорствуете. Решение в (8) правильное для решенной задачи, его я и имел ввиду в комментарии (2), когда предлагал обойтись без временной таблицы врСчетчик. Только группировка Год вроде бы лишняя. Получается, что приведенное в статье решение содержит лишние действия, о чем я и говорил.
Автор комментария (6) не применял данное решение, а написал свое собственное, насколько я смог понять.
Но в целом, наверное, если добавить к статье решение из (8), написать в аннотации, что именно понимается вами здесь под срезом последним (и еще упоминуть, что не все с таким определением согласны), то публикация может оказаться полезной.