Меню Закрыть

1С остатки на дату из запроса

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

Эффективность обращения к виртуальным таблицам во многом зависит от того, как построено обращение к этой таблице. Стандарт Обращения к виртуальным таблицам описывает общие требования и рекомендации по работе с виртуальными таблицами. В этом стандарте изложены дополнительные рекомендации по повышению эффективности обращения к виртуальной таблице Остатки регистров накопления и бухгалтерии.

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

Пример.

Регистр накопления ОстаткиТовара содержит два измерения: Склад и Номенклатура, а также ресурс Количество. Необходимо запросом получить список всей номенклатуры, с указанием количества товаров на конкретном складе.

НЕПРАВИЛЬНО

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

ПРАВИЛЬНО

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

Не в первый раз стакиваюсь с ситуацией, когда в запросе требуется найти остатки не на фиксированную дату (параметр — один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя). Нашел статью, которая оказалась весьма полезна для меня, жаль что поздно, так как первый вариант пришлось придумать самому.
[spoiler]
Скопипастил с: http://www.kb.mista.ru/article.php? >
Получение актуальных данных из регистра сведений на дату, получаемую в самом запросе

Примечание apas:
Для получения остатков регистра накопления в первом варианте используем реальную таблицу регистра накопления и агрегатную функцию сумма(приход-расход) (требуется условие по виду движения)
Второй вариант может быть полезен и в других случаях, когда виртуальная таблица задается только параметром и никак иначе (например виртуальная таблица "критерии отбора")

Существует несколько способов получить нужные данные.

1.Непосредственно в запросе (через реальную таблицу регистра)

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

Читайте также:  Стереотруба index php showuser

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

Для общего развития:
Что есть срез последних в платформе?

В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, . секунда)

2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку

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

2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)

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

Для примера сделаем отчет — список заказов покупателей.

Для этого создадим набор данных "Документы" — запрос:

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

Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":

В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях — это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.

Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи — набор "Документы", приемник — набор "Курсы валют". Выражение источник — "Дата", выражение приемник — "Дата", Параметр — "Дата"
2. Источник связи — набор "Документы", приемник — набор "Курсы валют". Выражение источник — "ВалютаДокумента", выражение приемник — "Валюта", Параметр — "Валюта"

Читайте также:  Холодильник работал при минусовой температуре

Главное здесь — параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае — запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.

Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля — "СуммаДокумента * Курс / Кратность".

Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы

Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"

Можно формировать отчет

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

Существует несколько способов получить нужные данные.

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

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

Для общего развития:
Что есть срез последних в платформе?

В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, . секунда)
Код 1C v 8.х

2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х

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

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

Читайте также:  Autodesk a360 что это

Для примера сделаем отчет — список заказов покупателей.

Для этого создадим набор данных "Документы" — запрос:
Код 1C v 8.х

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

Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х

В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях — это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.

Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи — набор "Документы", приемник — набор "Курсы валют". Выражение источник — "Дата", выражение приемник — "Дата", Параметр — "Дата"
2. Источник связи — набор "Документы", приемник — набор "Курсы валют". Выражение источник — "ВалютаДокумента", выражение приемник — "Валюта", Параметр — "Валюта"

Главное здесь — параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае — запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.

Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля — "СуммаДокумента * Курс / Кратность".

Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы

Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"

Можно формировать отчет

Рекомендуем к прочтению

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

Ваш адрес email не будет опубликован.