Срез первых и срез последних 1с как это работает
При использовании периодических регистров сведений в 1с 8 есть возможность получить срез последних на какую либо дату. Он представляет из себя последние данные на указанную дату для уникальной комбинации измерений. Причем срез последних 1с можно взять как по одному измерению, так и по нескольким. По сути это данные регистра, актуальные на указанную дату.
Срез последних можно получить несколькими способами:
- При помощи метода СрезПоследних менеджера регистра сведений;
- При помощи запроса;
Получить срез последних на дату при помощи метода СрезПоследних
Рассмотрим на примере получение среза на дату по регистру ЦеныНоменклатуры, по конкретной заданной номенклатуре при помощи метода СрезПоследних.
- КонецПериода — дата на которую делается срез;
- Отбор — структура с отбором по измерениям регистра;
Метод возвращает таблицу значений, заполненную данными найденных строк регистра.
Пример. Пусть в переменной Номенклатура хранится позиция номенклатуры по которой необходимо получить данные, а в переменной Дата хранится дата на которую необходимо получить цены. Данный пример подходит для конфигурации Бухгалтерия (ред. 2.0 / 3.0).
Получить срез последних регистра сведений запросом
Рассмотрим пример среза последних по регистру сведений в запросе. Для примера возьмем регистр ЦеныНоменклатуры из конфигурации Бухгалтерия (ред. 2.0 / 3.0). В запросе будем использовать виртуальную таблицу СрезПоследних нужного регистра. В первый параметр таблицы передается дата, на которую необходим срез, во втором можно задать произвольное условие для полей регистра.
Срез последних на каждую дату в запросе 1с
Бывают ситуации, когда срез регистра сведений необходимо получить не на конкретную дату, а на несколько дат. Но в запросе, в виртуальную таблицу можно передать только одну дату. В следующем примере будет показано, как это сделать.
Пример 3. По номенклатуре, необходимо получить все реализации за период и определить какая цена была установлена на данную номенклатуру в момент продажи по типу цен из реализации.
Вкратце принцип действия данного механизма следующий:
- Выбираем все нужные нам документы, либо просто необходимые даты;
- Присоединяем к ним регистр по нужным измерениям;
- Также в связях указываем, что нам нужны данные регистра с периодом меньше либо равным дате документа (или просто необходимой даты);
- При помощи группировки находим максимальную из подходящих дат;
- Еще раз присоединяем регистр по всем нужным измерениям, но на этот раз по конкретной дате;
- Таким образом на каждую изначальную строку с датой мы получим срез последних регистра сведений.
Если хотите подробней узнать о периодических регистрах сведений зайдите на сайт 1С:ИТС
Здравствуйте, можете мне объяснить что такое в регистре сведений виртуальные таблицы СрезПервых и СрезПоследних и чем они отличаются?
Тип: Дата; МоментВремени; Граница.
Определяет момент времени, заканчивая которым необходимо выбрать записи.
Если параметр не указан, то будут возвращены значения ресурсов самой последней записи регистра.
Тип: Структура.
Структура, содержащая отбор по измерениям и реквизитам регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры - задает отбираемое по данному измерению значение.
Структура дополнительно может иметь элементы, соответствующие разделителям регистра с уровнем разделения НезависимоИСовместно, в состав которых входит регистр. Если такой элемент структуры задан для используемого в сеансе разделителя, значение для этого элемента должно совпадать со значением разделителя, иначе будет вызвано исключение.
Если параметр не указан, то отбор не используется.
Возвращаемое значение:
Тип: ТаблицаЗначений.
Таблица значений, заполненная данными найденных записей регистра сведений.
Описание:
Получает наиболее поздние записи регистра, соответствующие установленным в параметрах метода значениям ключевых полей. Записи подбираются для каждого сочетания из всех имеющихся значений измерений регистра.
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Применим только для периодических регистров сведений.
Пример:
Тип: Дата; МоментВремени; Граница.
Определяет момент времени, начиная с которого необходимо выбрать записи.
Если параметр не указан, то будут получены записи без ограничения по времени.
Тип: Структура.
Структура, содержащая отбор по измерениям и реквизитам регистра. Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры - задает отбираемое по данному измерению значение.
Структура дополнительно может иметь элементы, соответствующие разделителям регистра с уровнем разделения НезависимоИСовместно, в состав которых входит регистр. Если такой элемент структуры задан для используемого в сеансе разделителя, значение для этого элемента должно совпадать со значением разделителя, иначе будет вызвано исключение.
Если параметр не указан, то отбор не используется.
Возвращаемое значение:
Тип: ТаблицаЗначений.
Таблица значений, заполненная данными найденных записей регистра сведений.
Описание:
Получает наиболее ранние записи регистра, соответствующие установленным в параметрах метода значениям ключевых полей. Записи подбираются для каждого сочетания из всех имеющихся значений измерений регистра.
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Только сейчас обнаружил, что если в запросе будут не все измерения, то срез последних "превращается в тыкву". Например, измерения "поставщик", "номенклатура". Делаем запрос по одному измерению "номенклатура" и не получаем срез последних по этому измерению. Это действительно так? Или я что-то "неправильно готовлю" (версия платформы 8.3.18.1208)?
(5) Что именно? Вроде только что выяснили в (1), что срез именно таким образом недоделан. У вас есть какая-то другая информация? Какая?
(0) Если не выполнять правила, заложенные в систему, то не стоит удивляться, что результат неверный. Если сказано, что нужны ВСЕ измерения, то будь добр выполнять и не удивляйся, если забыл снять штанишку до того как писаешь.
(8) Вы неправы. Срез последних никоим образом не зависит от уникальности. Исходные данные для получения среза всегда не уникальны
(10) Разработчики решили, что вход с улицы должен всегда вести прямо на последний этаж. Почему бы в этом месте не поудивляться?
Хыхы, ну да, конечно, один из важных элементов платформы именно разработчики захотели сделать именно таким.
Мне это напоминает ситуацию, когда из института приходит мальчик-кодер, видит корпоративную систему издалека и тут же заявляет, что делали её идиоты и надо всё переделывать.
(11) когда-то в молодости я писал свои модели, но все кончилось тем, что занимаюсь 1С-ом
Правила устанавливают те, у кого решение взлетело и выдержало испытание временем
(17) Вы упорствуете в заблуждении. Уникальность и срез - это две НЕЗАВИСИМЫХ друг от друга фичи.
Исходные данные
01.01.2021 ООО Ромашка Свистелка 100 руб.
01.02.2021 ООО Одуванчик Свистелка 105 руб.
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.02.2021 ООО Одуванчик Свистелка 105 руб.
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.03.2021 Свистелка 106 руб.
В этом месте, если вы сделаете запрос к срезуПОСЛЕДНИХ с одним измерением 1С выдаст
01.02.2021 Свистелка 105 руб.
01.03.2021 Свистелка 106 руб.
(18) И это нормальная логика. К примеру: Есть некий Вася, который работает на 2 рабочих местах.
01.03.2020 Кабинет1 Вася
Если вы сделаете срез последних по этому регистру с отбором по Васе, то у вас выйдет 2 строчки, проще говоря 1ска сделает срез по каждому измерению (последний раз когда вася в кабинет1 и кабинет2 работал). Даже если вы не выберите поле кабинета, то все равно в результате будет 2 строчки.
Еще раз отмечу, что СрезПоследних в 1с представляет из себя последние данные на указанную дату для УНИКАЛЬНОЙ комбинации измерений.
(18) А потом у тебя будут исходные данные:
01.03.2021 ООО Ромашка Свистелка 106 руб.
01.03.2021 ООО Одуванчик Свистелка 105 руб.
И срез последних по твоей свистелке что должен будет вернуть? цены через запятую?
Существует несколько способов получить нужные данные.
Непосредственно в запросе
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с маскимальной датой (периодом).
В 8.1. вместо обращения к курсам валют удобнее и надежнее использовать временную таблицу с нужными датами, потому что не во всех организациях ведут курсы валют ежедневно.
Для общего развития: Что есть срез последних в платформе?
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, … секунда)
2. По позиции регистратора В данном случае нужно еще раз обернуть выборку
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов.
Система компоновки данных
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных «Документы» - запрос:
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля «Дата» и «ВалютаДокумента». Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице «Поля» схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, «Курсы валют»:
В этом запросе имеются 2 параметра: «Дата» и «Валюта». Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр «Дата» указан в выбранных полях - это нужно для соединения таблиц. В этом запросе необходимо отключить галочку «Автозаполнение». Для ненужный полей «Дата» и «Валюта» также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице «Связи наборов данных» добавим 2 связи: 1. Источник связи - набор «Документы», приемник - набор «Курсы валют». Выражение источник - «Дата», выражение приемник - «Дата», Параметр - «Дата» 2. Источник связи - набор «Документы», приемник - набор «Курсы валют». Выражение источник - «ВалютаДокумента», выражение приемник - «Валюта», Параметр - «Валюта»
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос «Курсы валют») параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле «СуммаВВалютеУпрУчета». Выражение поля - «СуммаДокумента * Курс / Кратность».
Также укажем поля «СуммаДокумента» и «СуммаВВалютеУпрУчета» как ресурсы
Настроим отчет. Добавим одну группировку «Детальные записи», в выбранных полях укажем «ЗаказПолкупателя», «Курс» и «Кратность». Добавим ресурсы «СуммаДокумента» и «СуммаВВалютеУпрУчета»
Можно формировать отчет
- Последние изменения: 03.04.2022 22:07
- — Asmody
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
1. Регистр сведений - это
2. Виды регистров сведений
3. Измерения, ресурсы, реквизиты регистра сведений
4. Периодический регистр сведений
5. Свойства регистра и измерений
6. Добавление записи в регистр сведений
7. Изменение значения ресурса записи регистра сведений
8. Удаление выбранных записей в регистре сведений
9. Очистка регистра сведений от записей
10. Получить значение ресурса регистра сведений на дату
1. Регистр сведений - это
Регистр сведений предназначен для хранения показателей состояния в разрезе измерений. В отличии от других регистров, ресурсы регистра сведений могут содержать не только числовые значения, в том числе может быть составным.
2. Виды регистров сведений
- Независимый регистр сведений - регистр не подчинен регистратору (документу).
- Зависимый регистр сведений - регистр подчинен регистратору (документу).
- Непериодический регистр сведений - информация в регистре храниться без привязки к дате.
- Периодический регистр сведений - информация в регистре развернута во времени, одним из измерений является дата, называемым Периодом.
Измерения – описывают разрезы, в которых хранится информация.
Ресурсы – содержат хранимую информацию в разрезе измерения.
Тип ресурса сведений может быть как примитивный (число, строка, дата, булево), так и ссылочный (СправочникСсылка, ПеречислениеСсылка и т.д.). В ресурсе можно хранить даже картинки и другие неструктурированные сведения, поскольку можно создать ресурс типа "ХранилищеЗначения". Ресурс может быть составным типом.
Реквизиты - несут дополнительную информацию (как комментарий), которую нельзя получить из виртуальных таблиц регистра в разрезе измерений.
Если узнаем цену Тяпки на любую дату с 1 августа 2021 года до 10 августа 2021, она будет равна 175 рублям.
Если узнаем цену Тяпки на любую дату с 10 августа 2021 года по текущую дату, она будет равна 192 рублям.
Внимание! Описанный выше пример несет образный характер и периоды в примере рассматривали приблизительно. Для точного определения даты и времени для вычисления цены необходимо использовать Дату, МоментВремени или Границу зависит от решаемой задачи. Об особенностях использования периодов и моментов времени поговорим в следующей статье.
4. Периодический регистр сведений
- Непериодический
- В пределах секунды
- В пределах дня
- В пределах месяца
- В пределах квартала
- В пределах года
- По позиции регистратора
Внимание! При выборе периодичности (кроме "По позиции регистратору"), платформа будет контролировать уникальность записей в пределах заданной периодичности, в таком случаи в регистратор нельзя записать две записи с одинаковым набором Измерений и Периодом. Последовательность состоящая из Измерений и Периода называется Ключом уникальности.
При выборе периодичности "По позиции регистратору" ключ уникальности будет содержать дополнительно ссылку на регистратор (документ), в таком случаи в регистратор нельзя записать две записи с одинаковым набором Измерений, Периодом и Регистратором.
При выборе периодичности в БД создаются виртуальные таблицы:
СрезПервых и СрезПоследних.
Что позволяет быстро получать значения ресурсов о последних (первых) установленных значений на определенную дату.
5. Свойства регистра и измерений
Основной отбор по периоду (для регистра) - если регистр периодический и не подчинен регистратору, то доступно это свойство. Если флажок установлен, то наряду с основными измерениями и реквизитами регистра, участвующими в отборе записей при регистрации изменений для плана обмена, можно указывать отбор по полю Период.
Ведущий (для измерения) - имеет смысл когда измерение имеет тим ссылка на объект. Записи в регистре будут существовать пока существует объект, ссылка на который выбрана в качестве значения этого измерения. При удалении объекта все записи в регистре по этому объекту будут автоматически удалены.
Основной отбор (для измерения) - устанавливает возможность измерения регистрировать изменения для плана обмена.
6. Добавление записи в регистр сведений
Добавление через МенеджерЗаписи, подойдет для добавления одной записи.
НоваяЗапись . Период = Дата ;
НоваяЗапись . Номенклатура = Номенклатура ;
НоваяЗапись . Цена = Цена ;
НоваяЗапись . Записать ();
Добавление через НаборЗаписей, подойдет для добавления одной или нескольких записей.
НовыйНаборЗаписей = РегистрыСведений . Цены . СоздатьНаборЗаписей ();
НовыйНаборЗаписей . Отбор . Период . Установить ( Дата ,Истина);
НовыйНаборЗаписей . Отбор.Номенклатура . Установить ( Номенклатура ,Истина);
НоваяЗапись = НовыйНаборЗаписей . Добавить ();
НоваяЗапись . Период = Дата ;
НоваяЗапись . Номенклатура = Номенклатура ;
НоваяЗапись . Цена = Цена ;
НовыйНаборЗаписей . Записать ();
7. Изменение значения ресурса записи регистра сведений
Изменение значение ресурса записи через НаборЗаписей, подойдет для изменения одной или нескольких записей.
НаборЗаписей = РегистрыСведений . Цены . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Период . Установить ( Дата ,Истина);
НаборЗаписей . Отбор . Номенклатура . Установить ( Номенклатура ,Истина);
НаборЗаписей . Прочитать ();
Если Не НаборЗаписей . Количество () = 0 Тогда
СуществующаяЗапись = НаборЗаписей [ 0 ];
СуществующаяЗапись . Период = Дата ;
СуществующаяЗапись . Номенклатура = Номенклатура ;
СуществующаяЗапись . Цена = Цена ;
НаборЗаписей . Записать ();
КонецЕсли;
8. Удаление выбранных записей в регистре сведений
Удаление записей через НаборЗаписей, подойдет для удаления одной или нескольких записей.
НаборЗаписей = РегистрыСведений . Цены . СоздатьНаборЗаписей ();
НаборЗаписей . Отбор . Период . Установить ( Дата ,Истина);
НаборЗаписей . Отбор . Номенклатура . Установить ( Номенклатура ,Истина);
НаборЗаписей . Записать ();
9. Очистка регистра сведений от записей
Очистка регистра от записей через НаборЗаписей.
Получить значение ресурса регистра сведений на конкретную дату можно через метод Получить(). Если на эту дату в регистре нет записей, то возвращается структура с пустыми значениями.
Если в нашем примере указать дату 10.08.2021, то на эту дату имеются записи в регистре и метод вернет не пустую цену.
Если в нашем примере указать дату 110.08.2021, то на эту дату нет записей в регистре, тогда метод вернет пустую цену.
Получить ближайшее значение ресурса регистра сведений на дату можно через метод ПолучитьПервое() и ПолучитьПоследнее(). Эти методы возвращают структуру, содержащую ближайшие, указанной дате, значения ресурсов.
Первый параметр в методах может иметь тип "дата", МоментВремени или Граница. Его можно не указывать, тогда будут найдены первые или последние значения ресурсов в регистре сведений.
Так же получить ближайшее значение ресурса регистра сведений на дату можно через метод СрезПервых() и СрезПоследних(). Эти методы возвращают таблица значений, содержащую ближайшие, указанной дате, значения ресурсов. Если вам необходимо только значение ресурса все данные методами СрезПервых() и СрезПоследних() тянуть с сервера на клиент не разумно.
Читайте также: