helpf.pro
Регистрация
 0 
Распечатать

Срез последних (остатки) на каждую дату

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

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

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

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

Код 1C v 8.х
 ВЫБРАТЬ
Таб1.СсылкаДок,
Таб1.ДатаДок,
Таб1.ВалютаДок,
Таб2.Курс
ИЗ
(ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК СсылкаДок,
ЗаказПокупателя.Дата КАК ДатаДок,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДок,
МАКСИМУМ(Валюты.Период) КАК ПериодДок
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Валюты
ПО Валюты.Период <= ЗаказПокупателя.Дата И
Валюты.Валюта = ЗаказПокупателя.ВалютаДокумента
СГРУППИРОВАТЬ ПО
ЗаказПокупателя.Ссылка) КАК Таб1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Таб2
ПО Таб1.ПериодДок = Таб2.Период И Таб1.ВалютаДок = Таб2.Валюта


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

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


В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, ... секунда)
Код 1C v 8.х
 ВЫБРАТЬ
Таблица3.Ресурс,
Таблица3.Измерение,
Таблица3.Период
ИЗ
(ВЫБРАТЬ
Таблица1.Измерение КАК Измерение,
МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
РегистрСведений.ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1.Период <= &Дата
СГРУППИРОВАТЬ ПО
Таблица1.Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица3
ПО Таблица2.Измерение= Таблица3.Измерение
И Таблица2.Период = Таблица3.Период


2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х
 ВЫБРАТЬ
Таблица5.Ресурс,
Таблица5.Измерение,
Таблица5.Период,
Таблица5.Регистратор
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(Таблица3.Регистратор) КАК Регистратор,
Таблица3.Измерение
ИЗ
(ВЫБРАТЬ
Таблица1.Измерение КАК Измерение,
МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
РегистрСведений.ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1.Период <= &Дата
СГРУППИРОВАТЬ ПО
Таблица1.Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица3
ПО Таблица2.Измерение= Таблица3.Измерение
И Таблица2.Период = Таблица3.Период
СГРУППИРОВАТЬ ПО
Таблица3.Измерение) КАК Таблица4
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица5
ПО Таблица4.Измерение = Таблица5.Измерение
И Таблица4.Регистратор = Таблица5.Регистратор


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

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

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

Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х
 ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
ЗаказПокупателя.Дата КАК Дата,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента,
ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
ЗаказПокупателя.*,
Дата,
ВалютаДокумента.*,
СуммаДокумента}
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя,
ЗаказПокупателя.СуммаДокумента}


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

Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х
 ВЫБРАТЬ
&Дата КАК Дата,
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс КАК Курс,
КурсыВалютСрезПоследних.Кратность КАК Кратность
{ВЫБРАТЬ
Дата,
Валюта.*,
Курс,
Кратность}
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
{ГДЕ
КурсыВалютСрезПоследних.Курс,
КурсыВалютСрезПоследних.Кратность}


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

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

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

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

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

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

Можно формировать отчет
title
Разместил:   Версии: | 8.x | 8.2 УП |  Дата:   Прочитано: 46514
 0 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 46
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.