Как работает срез последних в регистрах сведений
Перейти к содержимому

Как работает срез последних в регистрах сведений

  • автор:

Срез последних в регистре сведений на каждую дату



3. Регистр сведений «Учетная политика организаций»
Периодичность: в пределах года
Режим записи: независимый



Постановка задачи: необходимо в запросе получить список документов «Счет на оплату» и по каждому документу получить «Размер оптовой надбавки», которая хранится в регистре сведений «Учетная политика организаций» в разрезе организаций. Учетная политика может меняться раз в год.

Сложность заключается в том, что при получении среза последних в регистр сведений мы не можем передать список дат. Можно передать только одно значение.

Решение задачи:

Для решения будем использовать следующий запрос:

Пояснение:

1. Получаем список документов «Счет на оплату»

2. Для каждого документа «Счет на оплату» делаем левое соединение с регистром сведений «Учетная политика организаций». При этом в регистре сведений ищем все записи с датой, меньшей или равной дате документа, и организацией, равной организации в документе. Таким образом получаем несколько записей по регистру сведений. Дальше группируем результат и берем максимальную запись по периоду в регистре. Таким образом эмулируем срез последних. На дату каждого документа получаем самую последнюю запись в регистре сведений и помещаем результат во временную таблицу «ВТ_СрезПоследнихНаКаждуюДату_1»:

3. Дальше выбираем данные из временной таблицы «ВТ_СрезПоследнихНаКаждуюДату_1» и снова делаем левое соединение с регистром сведений «Учетная политика организаций» по организации и по периоду, который мы получили во временной таблице «ВТ_СрезПоследнихНаКаждуюДату_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

Чтобы не запутаться во всех этих скобочках и запятых, лучше воспользоваться конструктором запросов. Покажу на примере последнего запроса.
После выбора в конструкторе запроса таблицы со срезом последних необходимо нажать на кнопку Параметры виртуальной таблицы и в открывшемся окне прописать

Нетрудно догадаться, что для среза первых принцип действия такой же за исключением того, что выбирается первая запись после даты среза.

2 комментария на «“Срез последних”»

Спасибо за понятное объяснение. Полно в сети объясняющих, которые только запутывают в этом, хоть не сложном но очень важном вопросе.

Как работает срез последних в регистрах сведений

Здравствуйте, можете мне объяснить что такое в регистре сведений виртуальные таблицы СрезПервых и СрезПоследних и чем они отличаются?

РегистрСведенийМенеджер.<Имя регистра сведений>.СрезПоследних (InformationRegisterManager.<Имя регистра сведений>.SliceLast)
РегистрСведенийМенеджер. <Имя регистра сведений>(InformationRegisterManager.<Имя регистра сведений>)
СрезПоследних (SliceLast)
Синтаксис:

Тип: Дата; МоментВремени; Граница.
Определяет момент времени, заканчивая которым необходимо выбрать записи.
Если параметр не указан, то будут возвращены значения ресурсов самой последней записи регистра.
(необязательный)

Тип: Структура.
Структура, содержащая отбор по измерениям и реквизитам регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры — задает отбираемое по данному измерению значение.
Структура дополнительно может иметь элементы, соответствующие разделителям регистра с уровнем разделения НезависимоИСовместно, в состав которых входит регистр. Если такой элемент структуры задан для используемого в сеансе разделителя, значение для этого элемента должно совпадать со значением разделителя, иначе будет вызвано исключение.
Если параметр не указан, то отбор не используется.
Возвращаемое значение:

Тип: ТаблицаЗначений.
Таблица значений, заполненная данными найденных записей регистра сведений.
Описание:

Получает наиболее поздние записи регистра, соответствующие установленным в параметрах метода значениям ключевых полей. Записи подбираются для каждого сочетания из всех имеющихся значений измерений регистра.

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Применим только для периодических регистров сведений.
Пример:

МаркетингЦен = РегистрыСведений.МаркетингЦен;
ТекущиеЦеныКонкурентов = МаркетингЦен.СрезПоследних(ТекущаяДата());

РегистрСведенийМенеджер.<Имя регистра сведений>.СрезПервых (InformationRegisterManager.<Имя регистра сведений>.SliceFirst)
РегистрСведенийМенеджер. <Имя регистра сведений>(InformationRegisterManager.<Имя регистра сведений>)
СрезПервых (SliceFirst)
Синтаксис:

Тип: Дата; МоментВремени; Граница.
Определяет момент времени, начиная с которого необходимо выбрать записи.
Если параметр не указан, то будут получены записи без ограничения по времени.
(необязательный)

Тип: Структура.
Структура, содержащая отбор по измерениям и реквизитам регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры — задает отбираемое по данному измерению значение.
Структура дополнительно может иметь элементы, соответствующие разделителям регистра с уровнем разделения НезависимоИСовместно, в состав которых входит регистр. Если такой элемент структуры задан для используемого в сеансе разделителя, значение для этого элемента должно совпадать со значением разделителя, иначе будет вызвано исключение.
Если параметр не указан, то отбор не используется.
Возвращаемое значение:

Тип: ТаблицаЗначений.
Таблица значений, заполненная данными найденных записей регистра сведений.
Описание:

Получает наиболее ранние записи регистра, соответствующие установленным в параметрах метода значениям ключевых полей. Записи подбираются для каждого сочетания из всех имеющихся значений измерений регистра.

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Применим только для периодических регистров сведений.
Пример:

МаркетингЦен = РегистрыСведений.МаркетингЦен;
ОбновленныеСегодняЦены = МаркетингЦен.СрезПервых(ТекущаяДата());

Получение последних записей из регистра сведений подчиненного регистратору

У регистра 2 регистратова: ВводВЭксплуатацию, Модернизация, которые создают новые записи в РС при проведении.

Но когда я пытаюсь получить последнее состояние объекта (Сервер) на дату через срез последних, то он мне выводит все записи сделанные до этой даты, а не последние.

По теме из базы знаний

  • Всякие полезности
  • Регистры сведений 1С. Как это устроено.
  • Заметки по SQL: Запрос, получающий изменения ресурса в регистрах сведений по датам изменения за период
  • Как прикрутить ГУИД к регистру сведений
  • Регистры сведений. За кулисами

Найденные решения
4. dhurricane 20.02.20 08:35 Сейчас в теме

(1) Позволю себе угадать. Выбирая данные из виртуальной таблицы «СрезПоследних» на дату Вы ожидаете, что для указанного сервера будет получена одна запись из регистра — самая последняя. Это не так. Срез последних получает из регистра сведений последние записи для всех комбинаций значений измерений (с учетом отборов, кончено же). Скажем, если у Вас «ДатаУстановки» в регистре от документа к документу различаются, то в результате среза последних Вы увидите все варианты дат установки, а не только от последнего документа. При том вне зависимости от того, выбираете ли Вы поле «ДатаУстановки» в запросе или нет — данные не сворачиваются.

NittenRenegade; PhoenixAOD; Vladiimir; user623969_dusa; + 4 – Ответить
5. user1357043 20.02.20 08:41 Сейчас в теме

(4)Дата установки вообще в измерениях лишняя. Тем более, что у регистра, скорее всего, есть измерение «Период». А если нет, то дату можно определить по регистратору.

Остальные ответы

  • Дата
  • Дата
  • Рейтинг всех уровней
  • Рейтинг 1-го уровня
  • Древо развёрнутое
  • Древо свернутое

Свернуть все
3. PhoenixAOD 62 20.02.20 08:34 Сейчас в теме
(1)срез последних используй
4. dhurricane 20.02.20 08:35 Сейчас в теме

(1) Позволю себе угадать. Выбирая данные из виртуальной таблицы «СрезПоследних» на дату Вы ожидаете, что для указанного сервера будет получена одна запись из регистра — самая последняя. Это не так. Срез последних получает из регистра сведений последние записи для всех комбинаций значений измерений (с учетом отборов, кончено же). Скажем, если у Вас «ДатаУстановки» в регистре от документа к документу различаются, то в результате среза последних Вы увидите все варианты дат установки, а не только от последнего документа. При том вне зависимости от того, выбираете ли Вы поле «ДатаУстановки» в запросе или нет — данные не сворачиваются.

NittenRenegade; PhoenixAOD; Vladiimir; user623969_dusa; + 4 – Ответить
5. user1357043 20.02.20 08:41 Сейчас в теме

(4)Дата установки вообще в измерениях лишняя. Тем более, что у регистра, скорее всего, есть измерение «Период». А если нет, то дату можно определить по регистратору.

6. Vladiimir 20.02.20 08:47 Сейчас в теме

(4)Т. е. что бы мне получить последние записи для Сервера, то мне в Измерениях регистра нужно оставить только его?

7. dhurricane 20.02.20 08:50 Сейчас в теме

(6) Да. Либо усложнить запрос, отказавшись от виртуальной таблицы среза последних, и написав свой «срез».

8. Vladiimir 20.02.20 09:18 Сейчас в теме
(7) Тогда он не хочет писать несколько строк, потому что получается, что они для него одинаковые
10. dhurricane 20.02.20 09:25 Сейчас в теме

(8) Да, все верно. Он же должен иметь возможность однозначно интерпретировать, какая из записей последняя. А Вы ему пытаетесь подсунуть несколько последних.

Я не могу Вам что-либо конкретное порекомендовать по теме, какие поля должны быть измерениями, а какие — ресурсами. Все зависит от прикладной задачи.

12. Vladiimir 20.02.20 09:56 Сейчас в теме

(10)Всё дело в регистраторе, если я правильно понял, он же у одного и того же Сервера разный, и изменения вносятся обоими. Получается РС видит, что регистраторы разные и выдает строки и с 1-м и со 2-м, а нужно только с последним

13. dhurricane 20.02.20 10:08 Сейчас в теме

(12) Нет. Регистратор — это поле периода, или грубо говоря уточнение даты. Если конечно периодичность регистра указана как «По позиции регистратора». Но в любом случае регистратор не рассматривается как аналитика, в разрезе которой нужно получить срез. Дело именно в значениях измерений.

2. kniga888 20.02.20 08:23 Сейчас в теме
приведите текст запроса
9. Vladiimir 20.02.20 09:22 Сейчас в теме

ВЫБРАТЬ ЗначениеСвойствНомеклатуры.ВидСвойства КАК ВидСвойства, ЗначениеСвойствНомеклатуры.ЗначениеСвойства КАК ЗначениеСвойства, СУММА(СерверыСрезПоследних.КолличествоНоменклатуры) КАК Колличество, СерверыСрезПоследних.ОбъемДиска КАК ОбъемДиска, СерверыСрезПоследних.Регистратор КАК Регистратор ИЗ РегистрСведений.Серверы.СрезПоследних( &Период, Сервер = &Сервер И Номенклатура = &ЖесткийДиск) КАК СерверыСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначениеСвойствНомеклатуры КАК ЗначениеСвойствНомеклатуры ПО СерверыСрезПоследних.ВариантНоменклатуры = ЗначениеСвойствНомеклатуры.НаборСвойств СГРУППИРОВАТЬ ПО ЗначениеСвойствНомеклатуры.ВидСвойства, ЗначениеСвойствНомеклатуры.ЗначениеСвойства, СерверыСрезПоследних.ОбъемДиска, СерверыСрезПоследних.Регистратор УПОРЯДОЧИТЬ ПО ВидСвойства, ЗначениеСвойства

14. dhurricane 20.02.20 10:10 Сейчас в теме
СерверыСрезПоследних.ОбъемДиска
Этого поля вовсе не было в описании задачи. Вы пытаетесь нас всех запутать? 🙂
15. Vladiimir 20.02.20 10:25 Сейчас в теме
Этого поля вовсе не было в описании задачи. Вы пытаетесь нас всех запутать? 🙂

Да, он у меня в ресурсах. Это характеристика, она пишется при проведении только, если Номенклатура=ЖесткийДиск

16. user1357043 20.02.20 10:44 Сейчас в теме

(9) мне кажется, что тут лишний регистратор в выборке и в группировке. Попробуйте без него, если не принципиально знать, каким документом сделаны изменения.

11. Vladiimir 20.02.20 09:55 Сейчас в теме

Всё дело в регистраторе, если я правильно понял, он же у одного и того же Сервера разный, и изменения вносятся обоими. Получается РС видит, что регистраторы разные и выдает строки и с 1-м и со 2-м, а нужно только с последним

17. user809472 20.02.20 11:03 Сейчас в теме

До тех пор пока вы в запросе будете писать детализацию по «лишним» в пределах задачи полям — вы будите получать много записей. Если вам нужно получить последнее значение Количества для измерения «Сервер», то и просите только его и все будет правильно.
Кстати, то что вы используете функцию СУММА(СерверыСрезПоследних.КолличествоНоменклатуры) КАК Колличество навевает на мысль, что вы попутали смысл Р.сведений и Р.накоплений.

ВЫБРАТЬ СерверыСрезПоследних.Сервер КАК Сервер, СерверыСрезПоследних.КолличествоНоменклатуры КАК Колличество, ИЗ РегистрСведений.Серверы.СрезПоследних( &Период, Сервер = &Сервер И Номенклатура = &ЖесткийДиск) КАК СерверыСрезПоследних

18. Vladiimir 20.02.20 11:27 Сейчас в теме

Кстати, то что вы используете функцию СУММА(СерверыСрезПоследних.КолличествоНоменклатуры) КАК Колличество навевает на мысль, что вы попутали смысл Р.сведений и Р.накоплений.

Не не попутал. Мне нужны не остатки, а текущее количество по группируемым показателям.

20. user809472 24.02.20 09:33 Сейчас в теме

(18) Хозяин-барин ) Насколько я понимаю, Рег.сведений хранит точечное актуальное значение и никакого плюса/минуса/суммы тут быть не может, т.е. на дату такую-то только одно значение, ни о каких остатках речь не идет. Вот Рег.накопления — это могут быть и остатки, и обороты, и разные варианты «раскручивания» с агрегатными функциями в том числе.

19. Vladiimir 20.02.20 11:30 Сейчас в теме

Перенес ДатаВвода из Измерений в Ресурсы — все стало считаться как нужно. Дело в том, что документы, которые пишут записи в РС писали в неё разные даты, вот ими то и отличались записи. И поэтому он выводил и записи за прошлые даты

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *