Получение в запросе цен на дату документа. Особенность получения среза последних записей в регистре сведений Получить цену на дату документа в запросе

/
Реализация обработки данных

Разрешение итогов для периодических регистров сведений

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1.1. Для периодических регистров сведений рекомендуется разрешить итоги, если выполнены все следующие условия:

  • в регистре ожидается большой объем данных (например, оправданно для регистра с ценами номенклатуры ; но не имеет смысла для регистра с курсами валют);
  • в конфигурации предусмотрены частотные запросы к срезам последних на текущий момент времени и/или к срезам первых для получения актуальных данных (т.е. когда не задан период в параметрах виртуальных таблиц СрезПервых и СрезПоследних );
  • при этом остальные условия для виртуальных таблиц СрезПервых и СрезПоследних задаются только на значения измерений (и разделителей, находящихся в режиме Независимо и совместно );
  • в ограничениях доступа к данным регистра используются только измерения (и разделители, находящиеся в режиме Независимо и совместно ).

Полный список всех условий, когда в запросах задействуются итоги регистра сведений, см. в документации к платформе 1С:Предприятие .

Например, если в конфигурации предусмотрены часто выполняющиеся запросы к регистру ЦеныНоменклатуры для получения текущих цен номенклатуры:

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

то при соблюдении всех остальных условий, перечисленных выше, установка свойства Разрешить итоги: срез последних существенно ускорит выполнение таких запросов, засчет того, что выборка будет выполняться напрямую из дополнительных таблиц, в которых хранятся только последние значения (для среза последних) и первые значения (для среза первых).

1.2. Кроме того, следует рассмотреть альтернативные варианты по пересмотру запросов к регистру таким образом, чтобы эти условия выполнялись.

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

Однако если при открытии формы подбора товаров анализировать, есть ли регистраторы с будущей датой, и если их нет – выполнять другой запрос к срезу последних без установки даты, то такой запрос будет работать быстрее.

2. Во всех остальных случаях, не следует разрешать итоги для периодических регистров сведений. Прежде всего, если

  • чаще всего (всегда) к виртуальным таблицам среза первых/последних периодического регистра сведений выполняются запросы на конкретный период (например, на дату документа).
  • в условиях для виртуальных таблиц СрезПервых и СрезПоследних чаще всего (всегда) используются подзапросы и соединения (обращения «через точку» к полям связанных таблиц). Например, в этом случае:

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

: СрезПервых и СрезПоследних Рассмотрим работу с этими виртуальными таблицами с использованием 1С. Гораздо чаще применяется СрезПоследних , поэтому с него и начнем.

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

В регистре имеются следующие записи

Для начала получим срез последних без использования параметров выполнив вот такой запрос

ВЫБРАТЬ ЦенаСрезПоследних.Период КАК Период, ЦенаСрезПоследних.Товар КАК Товар, ЦенаСрезПоследних.Поставщик КАК Поставщик, ЦенаСрезПоследних.Сумма КАК Сумма ИЗ РегистрСведений.Цена.СрезПоследних КАК ЦенаСрезПоследних

Так как параметры не указаны срез выполняется на текущую дату - 01.02.2017. В результате получаем вот такую таблицу

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

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

ИЗ РегистрСведений.Цена.СрезПоследних(&ДатаСреза,) КАК ЦенаСрезПоследних

Перед выполнением запроса в него конечно же надо передать параметр &ДатаСреза . Теперь результат запроса будет выглядеть так

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

ИЗ РегистрСведений.Цена.СрезПоследних(&ДатаСреза, Товар = &Товар И Поставщик = &Поставщик) КАК ЦенаСрезПоследних

В итоге получим только одну запись

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

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

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

Для периодических регистров сведений доступны две виртуальные таблицы: СрезПервых и СрезПоследних Рассмотрим работу с этими виртуальными таблицами с использованием языка запросов 1С. Гораздо чаще применяется СрезПоследних , поэтому с него и начнем.

Срез последних позволяет получить последнюю запись регистра сведений на указанную дату в разрезе измерений. Для таблицы среза последних(первых) есть возможность в скобках указать два параметра через запятую. В первом параметре передается дата на которую делается срез (если параметр не указан срез делается на текущую дату). Второй параметр представляет из себя условие на языке запросов 1С и позволяет устанавливать различные отборы. Как правило в этих отборах используются измерения. Все это звучит достаточно туманно, поэтому без примера никак не обойтись.

Итак пусть у нас есть периодический регистр сведений Цена в котором храняться цены в разрезе товаров и поставщиков. Периодичность регистра - день.

В регистре имеются следующие записи

Для начала получим срез последних без использования параметров выполнив вот такой запрос

ВЫБРАТЬ ЦенаСрезПоследних. Период КАК Период, ЦенаСрезПоследних. Товар КАК Товар, ЦенаСрезПоследних. Поставщик КАК Поставщик, ЦенаСрезПоследних. Сумма КАК Сумма ИЗ РегистрСведений. Цена. СрезПоследних КАК ЦенаСрезПоследних

Так как параметры не указаны срез выполняется на текущую дату – 01.02.2017. В результате получаем вот такую таблицу

Период | Товар | Поставщик | Сумма

25.01.2017 | Карандаш | ООО «Леспром» | 15

01.02.2017 | Карандаш | ПАО «Канцтовары» | 31

01.02.2017 | Ручка | ПАО «Канцтовары» | 145

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

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

ИЗ РегистрСведений. Цена. СрезПоследних(& amp; ДатаСреза, ) КАК ЦенаСрезПоследних

Перед выполнением запроса в него конечно же надо передать параметр &ДатаСреза . Теперь результат запроса будет выглядеть так

Период | Товар | Поставщик | Сумма

01.01.2017 | Карандаш | ООО «Леспром» | 10

01.01.2017 | Карандаш | ПАО «Канцтовары» | 27

03.01.2017 | Ручка | ПАО «Канцтовары» | 137

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

ИЗ РегистрСведений. Цена. СрезПоследних( & amp; ДатаСреза, Товар = & amp; Товар И Поставщик = & amp; Поставщик) КАК ЦенаСрезПоследних

В итоге получим только одну запись

Период | Товар | Поставщик | Сумма

01.01.2017 | Карандаш | ПАО «Канцтовары» | 27

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

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

43
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL... 26
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос. Создается этот объект вызовом конструкции Новый Запрос. Запрос удобно... 18
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на... 13
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения...

Иногда требуется запросом получить из периодического регистра сведений данные на несколько дат сразу. Типичный пример — работа с курсами валют. Рассмотрим алгоритм решение данной задачи на примере.

Постановка задачи

В базе создан документ «РеализацияТоваровУслуг», в шапке которого есть реквизит «Валюта». Запросом требуется для каждого документа получить актуальный курс валюты из шапки на дату документа. Хранение курсов валют осуществляется в периодическом регистре сведений «КурсыВалют «.
Решением «в лоб» этой задачи мог бы быть запрос в цикле: получение всех документов с их датами и валютой и в выборке обращение к виртуальной таблице среза последних регистра «КурсыВалют». Но т.к. запрос в цикле — это «плохо», попробуем реализовать задачу одним запросом .

Решение

Для решения задачи будем использовать факт, что таблицы в запросе можно соединять не только на равенство полей .

ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка, РеализацияТоваровУслуг.Валюта, МАКСИМУМ(КурсыВалют.Период) КАК Период ПОМЕСТИТЬ ВТПериодыУстановкиКурсов ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО РеализацияТоваровУслуг.Валюта = КурсыВалют.Валюта И РеализацияТоваровУслуг.Дата >= КурсыВалют.Период СГРУППИРОВАТЬ ПО РеализацияТоваровУслуг.Ссылка, РеализацияТоваровУслуг.Валюта; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТПериодыУстановкиКурсов.Ссылка, ВТПериодыУстановкиКурсов.Валюта, КурсыВалют.Курс ИЗ ВТПериодыУстановкиКурсов КАК ВТПериодыУстановкиКурсов ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО ВТПериодыУстановкиКурсов.Период = КурсыВалют.Период И ВТПериодыУстановкиКурсов.Валюта = КурсыВалют.Валюта

Порядок действий в запросе:

  1. Получение для каждого документа периода установки курса валюты. Документы соединяются с ФИЗИЧЕСКОЙ таблицей «КурсыВалют». Здесь следует обратить внимание на условия соединения. Валюты должны быть равны, а дата документа >= периоду регистра сведений.
    В результате такого соединения для каждого документа будет получено множество строк, удовлетворяющих условию: все записи курсов по валюте документа, установленные не позже даты документа.
    Завершающим этапом будет группировка строк с получением максимального периода курса. В результате для каждого документа будет получен требуемый период установки курса для нужной валюты (максимальная дата установки курса валюты, но не больше даты документа). Результат помещается во временную таблицу ВТПериодыУстановкиКурсов.
  2. Получение курса. Временная таблица ВТПериодыУстановкиКурсов соединяется с ФИЗИЧЕСКОЙ таблицей «КурсыВалют». Соединение происходит по Валюте документа и периоду установки курса, определенному во второй временной таблице.