8.х Оптимизировать запрос

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем AlenkaInt, 30 янв 2015.

  1. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Всем привет! Подскажите, как можно оптимизировать запрос. Сказали, что можно как то вынести отдельно получение курса и отдельно ПТиУ. И потом их соединить.
    Код:
    ВЫБРАТЬ
        ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
        ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
        ПоступлениеТоваровУслугТовары.Ссылка,
        ПоступлениеТоваровУслугТовары.Цена / КурсыВалют.Курс КАК Цена
    ИЗ
        Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
            ПО (КурсыВалют.Период В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        МАКСИМУМ(Т.Период)
                    ИЗ
                        РегистрСведений.КурсыВалют КАК Т
                    ГДЕ
                        Т.Валюта.Код = "978"
                        И Т.Период <= ПоступлениеТоваровУслугТовары.Ссылка.Дата))
                И (КурсыВалют.Валюта.Код = "978")
    ГДЕ
        ПоступлениеТоваровУслугТовары.Ссылка.Проведен
        И ПоступлениеТоваровУслугТовары.Склад.Регион = &ВыбРегион
        И ПоступлениеТоваровУслугТовары.Номенклатура В(&ВыбНоменклатура)
    
    УПОРЯДОЧИТЬ ПО
        Дата
    Я сделала так
    Код:
    ВЫБРАТЬ
        ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
        ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
        ПоступлениеТоваровУслугТовары.Ссылка,
        ПоступлениеТоваровУслугТовары.Цена / Курсы.Курс КАК Цена
    ПОМЕСТИТЬ НоменклатураВся
    ИЗ
        Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                КурсыВалют.Период КАК Период,
                КурсыВалют.Курс КАК Курс,
                КурсыВалют.Валюта.Код КАК ВалютаКод
            ИЗ
                РегистрСведений.КурсыВалют КАК КурсыВалют
            ГДЕ
                КурсыВалют.Валюта.Код = "978") КАК Курсы
            ПО (Курсы.Период В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        МАКСИМУМ(Т.Период)
                    ИЗ
                        РегистрСведений.КурсыВалют КАК Т
                    ГДЕ
                        Т.Период <= ПоступлениеТоваровУслугТовары.Ссылка.Дата))
    ГДЕ
        ПоступлениеТоваровУслугТовары.Ссылка.Проведен
        И ПоступлениеТоваровУслугТовары.Склад.Регион = &ВыбРегион
        И ПоступлениеТоваровУслугТовары.Номенклатура В(&ВыбНоменклатура)
    
    ИНДЕКСИРОВАТЬ ПО
        Дата,
        Номенклатура
    ;
    
    Но вот особо разницы не почувствовала. Может не так сделала?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    ИМХО:
    Данный вид запроса(динамический срез последних) мало поддается оптимизации, т.к. курсы валют выгребаются все, за весь период.

    Большая оптимизация - уход от сбора информации по документам и использование виртуальных таблиц регистров.
    Правда из ВТ придется тянуть все, вплоть до документа....
  3. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    Вот это вот
    Код:
    ПО (Курсы.Период В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        МАКСИМУМ(Т.Период)
                    ИЗ
                        РегистрСведений.КурсыВалют КАК Т
                    ГДЕ
                        Т.Период <= ПоступлениеТоваровУслугТовары.Ссылка.Дата)
    Не есть хорошо.

    Просто Скуль когда будет транслировать запрос он сделете
    = Ваш подзапрос
    =Ваш подзавпрос
    =Ваш подзапрос

    вместо В сделает равно несколько раз соответвенно этот подзапрос будет выполняться надчать раз.

    Как вариант этот подзапрос делает и помещаете его во временную таблицу, у уже из талицы тяните - быстрее будет.
  4. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    @Draco. А как сделать этот запрос во временную? У меня не получается. Я просто копирую и вставляю. Какая хрень выходит..
  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    ссори я вот это проглядел

    Т.Период <= ПоступлениеТоваровУслугТовары.Ссылка.Дата

    Тогда не получится, что то писал.

    Вообще можно левое соединение заменять Объединением - так быстре работает. Но там мутатни немного больше и не так наглядно
  6. TODD22
    Offline

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    А это вы для какой конфигурации запрос пишите? И для какой цели курс валюты получаете?
  7. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Это переписанная УПП, для документа одного. Это в данном случае не важно. Мне дали задачу оптимизировать. Отдельно получить курс и ПТиУ. Я сделала. И не очень поняла, оптимизировался код или как :))
  8. TODD22
    Offline

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Это как раз и важно :)
    Мне интересно в какой задаче нужно получать отдельно курс и ПТиУ. Что бы узнать по какой цене в Евро мы могли закупить ?
    --- Объединение сообщений, 30 янв 2015 ---
    Код:
    ВЫБРАТЬ
        ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
        ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
        ПоступлениеТоваровУслугТовары.Ссылка,
        ПоступлениеТоваровУслугТовары.Цена / Курсы.Курс КАК Цена
    ПОМЕСТИТЬ НоменклатураВся
    ИЗ
        Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                КурсыВалют.Период КАК Период,
                КурсыВалют.Курс КАК Курс,
                КурсыВалют.Валюта.Код КАК ВалютаКод
            ИЗ
                РегистрСведений.КурсыВалют КАК КурсыВалют
            ГДЕ
                КурсыВалют.Валюта.Код = "978") КАК Курсы
            ПО (Курсы.Период В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        МАКСИМУМ(Т.Период)
                    ИЗ
                        РегистрСведений.КурсыВалют КАК Т
                    ГДЕ
                        Т.Период <= ПоступлениеТоваровУслугТовары.Ссылка.Дата))
    ГДЕ
        ПоступлениеТоваровУслугТовары.Ссылка.Проведен
        И ПоступлениеТоваровУслугТовары.Склад.Регион = &ВыбРегион
        И ПоступлениеТоваровУслугТовары.Номенклатура В(&ВыбНоменклатура)
    
    ИНДЕКСИРОВАТЬ ПО
        Дата,
        Номенклатура
    ;
    То ли я под вечер плохо соображаю... то ли вы во временную таблицу для чего то помещаете весь результат запроса :)
    То есть "временная таблица" она на то и временная. Мы в неё получаем данные. А потом уже строим запрос к этой таблице где получаем нужные нам детальные записи. А вы получается создали временную таблицу, в неё поместили весь результат вашего запроса. И всё на этом :) То есть вы к результату запроса получается добавили ещё и создание временной таблицы.
    Или это только часть запроса?
    Последнее редактирование: 30 янв 2015
  9. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    @TODD22. Эх, не хочется вам на это вопрос отвечать. Сейчас вы напишете, это вам надо брать из регистров. И вообще все не так. А у меня еще висит 3 задачи, надо эту сдавать, начальство посмотрело, все цифры проверили, все нормально, только в этом курсе заминка. А так да, в ТЧ документа много номенклатуры, нужно выяснить по какому курсу закупалось и вывести колонку цены в евро (цена/курс). Просто я при выполнении запроса не особо поняла быстрее или как. А тут народ умный, опытный, может просто по тексту сказать.
    --- Объединение сообщений, 30 янв 2015 ---
    Это часть запроса.
    Последнее редактирование: 30 янв 2015
  10. TODD22
    Offline

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Если закупка производилась в валюте то данные из регистра лучше не брать.
    Из регистра стоит брать если мы хотим узнать какой курс действовал на дату.
    Например если закуп в рублях тогда что бы узнать стоимость в евро нужно получить действовавший на дату курс.

    Если закупка в валюте то у документа "Поступление товаров и услуг" есть реквизит в котором сохраняется курс по которому был оформлен документ. И он может отличаться от значений в регистре сведений "Цены номенклатуры".
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    Народ уже сказал не раз, как можно оптимизировать конкретно ваш запрос и даже указал что именно можно оптимизировать. Оптимизация запроса - ускорение его выполнения при одинаковом количестве выбираемых данных.
  12. TopicStarter Overlay
    AlenkaInt
    Offline

    AlenkaInt Опытный в 1С

    Регистрация:
    26 фев 2012
    Сообщения:
    1.008
    Симпатии:
    4
    Баллы:
    29
    Закупка в рублях. Да, нужно вычислять действующий на дату закупки курс.
    --- Объединение сообщений, 30 янв 2015 ---
    @nomad_irk спасибо за советы. Но мне нужен на конкретный вопрос, который я пока не получила. Понимаете, есть конкретная задача. Я не буду это обсуждать еще раз. У нас все это так долго обсуждается, со всеми. Еще раз всех собирать я не буду, да и не поймут. Типо всех опять собрала и начала - а вот мне на форуме сказали, надо все по другому и бла-бла-бла. Сказали "вынести отдельно получение курса и отдельно ПТиУ и потом их соединить". Значит так и будем делать.
    Последнее редактирование: 30 янв 2015
  13. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.573
    Симпатии:
    717
    Баллы:
    204
    Ответ на ваш вопрос есть и на этом ресурсе, но быстрее нашелся вот тут kb.mista.ru/article.php?id=92
    Последнее редактирование модератором: 2 фев 2015
    AlenkaInt нравится это.

Поделиться этой страницей