Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Заготовки для 1C:FAQ > Запрос Срез на момент Документа


Автор: Outlander 13.05.11, 13:21
Вдруг кому понадобится
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ВЫБРАТЬ
        РеализацияТоваровУслуг.Ссылка,
        РеализацияТоваровУслуг.Дата,
        РеализацияТоваровУслуг.ВалютаДокумента КАК ВалютаДокумента
    ПОМЕСТИТЬ Доки
    ИЗ
        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    ИНДЕКСИРОВАТЬ ПО
        ВалютаДокумента
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        КурсыВалют.Валюта КАК Валюта,
        КурсыВалют.Курс,
        КурсыВалют.Кратность,
        Вн.ДатаСреза КАК ДатаСреза,
        Вн.ДатаУстановкиКурса
    ПОМЕСТИТЬ КурсыНаДатуДокумента
    ИЗ
        РегистрСведений.КурсыВалют КАК КурсыВалют
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                ДатыСрезов.ДатаУстановкиКурса КАК ДатаУстановкиКурса,
                ДатыСрезов.Валюта КАК Валюта,
                ДатыСрезов.ДатаСреза КАК ДатаСреза
            ИЗ
                (ВЫБРАТЬ
                    МАКСИМУМ(КурсыВалют.Период) КАК ДатаУстановкиКурса,
                    КурсыВалют.Валюта КАК Валюта,
                    Доки.Дата КАК ДатаСреза
                ИЗ
                    РегистрСведений.КурсыВалют КАК КурсыВалют
                        ЛЕВОЕ СОЕДИНЕНИЕ Доки КАК Доки
                        ПО КурсыВалют.Период <= Доки.Дата
                
                СГРУППИРОВАТЬ ПО
                    Доки.Дата,
                    КурсыВалют.Валюта) КАК ДатыСрезов) КАК Вн
            ПО КурсыВалют.Валюта = Вн.Валюта
                И КурсыВалют.Период = Вн.ДатаУстановкиКурса
     
    ИНДЕКСИРОВАТЬ ПО
        ДатаСреза,
        Валюта
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Доки.Ссылка,
        КурсыНаДатуДокумента.Курс,
        КурсыНаДатуДокумента.Кратность,
        Доки.Дата,
        Доки.ВалютаДокумента,
        КурсыНаДатуДокумента.ДатаУстановкиКурса
    ИЗ
        Доки КАК Доки
            ЛЕВОЕ СОЕДИНЕНИЕ КурсыНаДатуДокумента КАК КурсыНаДатуДокумента
            ПО Доки.Дата = КурсыНаДатуДокумента.ДатаСреза
                И Доки.ВалютаДокумента = КурсыНаДатуДокумента.Валюта


Попробую рассказать принцип
1) Сначала получем таблицу с Датами и Измерениями на которые нужны курсы
2) Из таблицы регистра получем даты наиболее близкие к датам документа "КурсыВалют.Период <= Доки.Дата"
3) К полученной таблице пристраиваем значения Ресурсов регистра. Не забываем указать ДатуДокумента
Собственно полученный результат кладем в "КурсыНаДатуДокумента"
4) Используем "КурсыНаДатуДокумента" в своих целях соединяя левым соединением по Датам и Измерениям


Все работает достаточно быстро и без индексирования, но с индексированием все совсем хорошо :D

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)