8.х Помогите оптимизировать запрос

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

  1. TopicStarter Overlay
    b7music
    Offline

    b7music

    Регистрация:
    21 июн 2016
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    Так оставил только основную таблицу, тут нет ИЛИ

    Код:
    ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
        ВыездПрием.Организация,
        ВыездПрием.СтруктурнаяЕдиница,
        ВыездПрием.Номенклатура,
        ВыездПрием.Характеристика,
        ВыездПрием.ЕдиницаИзмерения,
        ВыездПрием.Этап,
        ВыездПрием.РезультатВыполненияЭтапа,
        ВыездПрием.СуммаДокумента,
        ВыездПрием.Ссылка,
        ВыездПрием.Тип,
        ВыездПрием.СерийныйНомер,
        ВыездПрием.ВалютаДокумента КАК Валюта,
        ВЫБОР
            КОГДА ВыездПрием.Тип = ТИП(Документ.СЦентр_ПриемВРемонт)
                ТОГДА ВыездПрием.Ссылка.ДатаОкончания
            КОГДА ВыездПрием.Тип = ТИП(Документ.СЦентр_ВыездМастера)
                ТОГДА ВыездПрием.Ссылка.ПланДатаОкончания
        КОНЕЦ КАК ДатаОкончания,
        ВыездПрием.Дата КАК Дата,
        ВыездПрием.Номер,
        ВыездПрием.Ссылка.Контрагент КАК Контрагент,
        ВыездПрием.Ссылка.ВидОперации КАК ВидОперации,
        ВыездПрием.ДатаПросрочки,
        ВыездПрием.Ссылка.Автор КАК Ответственный
    ИЗ
        ЖурналДокументов.СЦентр_ДокументыПоРемонтуИОбслуживанию КАК ВыездПрием
    ГДЕ
        (ВыездПрием.Тип = ТИП(Документ.СЦентр_ПриемВРемонт))
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.456
    Симпатии:
    697
    Баллы:
    204
    ВыездПрием.Ссылка.Контрагент - такого вида поля нужно переделывать через левое соединение, иначе платформа делает это сама.

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

    Так же не понятно:

    Код:
    ВЫБОР
    КОГДА ВыездПрием.Тип = ТИП(Документ.СЦентр_ПриемВРемонт)
    ТОГДА ВыездПрием.Ссылка.ДатаОкончания
    КОГДА ВыездПрием.Тип = ТИП(Документ.СЦентр_ВыездМастера)
    ТОГДА ВыездПрием.Ссылка.ПланДатаОкончания
    КОНЕЦ КАК ДатаОкончания
    при
    Код:
    ГДЕ
    (ВыездПрием.Тип = ТИП(Документ.СЦентр_ПриемВРемонт))
    b7music нравится это.
  3. TopicStarter Overlay
    b7music
    Offline

    b7music

    Регистрация:
    21 июн 2016
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    Форма документа одна, и для выезда и для приема, в реквизите этого документа и указывается какой тип.
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.456
    Симпатии:
    697
    Баллы:
    204
    В таком случае, для чего ограничение по типу документа?
  5. TopicStarter Overlay
    b7music
    Offline

    b7music

    Регистрация:
    21 июн 2016
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    да вроде как нет ограничений, изначально так уже было сделано :) Есть только дата окончания, видимо тип и влияет на нее.

    p.s. в где изначально было

    ГДЕ
    (ВыездПрием.Тип = ТИП(Документ.СЦентр_ПриемВРемонт)
    ИЛИ ВыездПрием.Тип = ТИП(Документ.СЦентр_ВыездМастера))
    это уже я выезд убрал
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.456
    Симпатии:
    697
    Баллы:
    204
    говорю ж: переделывать нужно на объединение запросов, тогда и не будет геморроя с Выбор Когда... и контрагента сразу вытащить можно левым соединением с нужной таблицей.

    Но в любом случае, много от оптимизации не жди, изначально тупиковый путь наворотить до одури динамический список(курсорный запрос в терминах СУБД)....
  7. TopicStarter Overlay
    b7music
    Offline

    b7music

    Регистрация:
    21 июн 2016
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    Это рарус, самое интересное, что они продолжают выпускать обновления и не обращают на это внимание. В демке где у них 5-7 записей, все летает. Наверное поэтому и не обращают внимание...
    --- Объединение сообщений, 1 ноя 2016 в 13:38 ---
    Получается нужно создавать регистр, например тот же тип, текущий этап, и из него уже черпать информацию?
    Последнее редактирование: 1 ноя 2016 в 13:38
  8. TopicStarter Overlay
    b7music
    Offline

    b7music

    Регистрация:
    21 июн 2016
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    В общем сократил запрос до

    Код:
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
        ВЫБОР
            КОГДА ТекущиеЭтапы.Ссылка ЕСТЬ NULL
                ТОГДА ВЫБОР
                        КОГДА ВыездПрием.Ссылка ССЫЛКА Документ.СЦентр_ПриемВРемонт
                            ТОГДА ЗНАЧЕНИЕ(Справочник.СЦентр_ВидыЭтаповРемонта.ПриемВРемонт)
                        ИНАЧЕ "Выезд мастера"
                    КОНЕЦ
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ПередачаВСтороннийСервисныйЦентр
                ТОГДА "Передача в сторонний сервисный центр"
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ВозвратИзСтороннегоСервисногоЦентра
                ТОГДА ЗНАЧЕНИЕ(Справочник.СЦентр_ВидыЭтаповРемонта.ВозвратИзСтороннегоСервисногоЦентра)
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.РасходнаяНакладная
                ТОГДА "Выдача в подмену"
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ПриходнаяНакладная
                ТОГДА "Возврат из подмены"
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ЗаданиеНаРаботу
                ТОГДА ТекущиеЭтапы.ВидЭтапа
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ЗаказПокупателя
                ТОГДА ТекущиеЭтапы.ВидЭтапа
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ВозвратИзРемонта
                ТОГДА "Выдан клиенту"
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ОтчетПоРаботеУКлиента
                ТОГДА "Отчет о работе у клиента"
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ПеремещениеВРемонте
                ТОГДА "Перемещение в ремонте"
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ПоступлениеВКассу
                ТОГДА "Оплата от клиента"
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ПоступлениеНаСчет
                ТОГДА "Оплата от клиента"
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ЗаявкаНаДоставку
                ТОГДА ВЫБОР
                        КОГДА ТекущиеЭтапы.Ссылка.ВидОперации = ЗНАЧЕНИЕ(Перечисление.СЦентр_ВидыОперацийЗаявокНаДоставку.ДоставкаОтКлиента)
                            ТОГДА "Доставка от клиента"
                        ИНАЧЕ "Доставка клиенту"
                    КОНЕЦ
        КОНЕЦ КАК ТекущийЭтап,
        ВЫБОР
            КОГДА ТекущиеЭтапы.Ссылка ЕСТЬ NULL
                ТОГДА ВЫБОР
                        КОГДА ВыездПрием.Ссылка ССЫЛКА Документ.СЦентр_ПриемВРемонт
                            ТОГДА 1
                        ИНАЧЕ 9
                    КОНЕЦ
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ПередачаВСтороннийСервисныйЦентр
                ТОГДА 2
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ВозвратИзСтороннегоСервисногоЦентра
                ТОГДА 3
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ЗаданиеНаРаботу
                    ИЛИ ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ЗаказПокупателя
                ТОГДА 4
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ВозвратИзРемонта
                ТОГДА 5
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ПриходнаяНакладная
                ТОГДА 6
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.РасходнаяНакладная
                ТОГДА 7
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ОтчетПоРаботеУКлиента
                ТОГДА 8
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ПоступлениеВКассу
                ТОГДА 10
            КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.ПоступлениеНаСчет
                ТОГДА 11
        КОНЕЦ КАК НомерТекущегоЭтапа,
        ВЫБОР
            КОГДА ДОБАВИТЬКДАТЕ(ВыездПрием.Дата, ДЕНЬ, 7) < &ТекДата
                    И ВЫБОР
                        КОГДА ТекущиеЭтапы.Ссылка ЕСТЬ NULL
                            ТОГДА ВЫБОР
                                    КОГДА ВыездПрием.Ссылка ССЫЛКА Документ.СЦентр_ПриемВРемонт
                                        ТОГДА 1
                                    ИНАЧЕ 9
                                КОНЕЦ
                        КОГДА ТекущиеЭтапы.Ссылка ССЫЛКА Документ.СЦентр_ПередачаВСтороннийСервисныйЦентр
                            ТОГДА 1
                    КОНЕЦ = 1
                ТОГДА ИСТИНА
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ КАК Просрочка,
        СЦентр_ПриемВРемонт.Организация КАК Организация,
        СЦентр_ПриемВРемонт.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
        СЦентр_ПриемВРемонт.Номенклатура КАК Номенклатура,
        СЦентр_ПриемВРемонт.Характеристика КАК Характеристика,
        СЦентр_ПриемВРемонт.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
        СЦентр_ПриемВРемонт.ТекущийЭтап КАК Этап,
        СЦентр_ПриемВРемонт.РезультатВыполнения КАК РезультатВыполненияЭтапа,
        СЦентр_ПриемВРемонт.СуммаДокумента КАК СуммаДокумента,
        СЦентр_ПриемВРемонт.СерийныйНомер КАК СерийныйНомер,
        СЦентр_ПриемВРемонт.ВалютаДокумента,
        СЦентр_ПриемВРемонт.Дата КАК Дата,
        СЦентр_ПриемВРемонт.Номер КАК Номер,
        СЦентр_ПриемВРемонт.Автор КАК Ответственный,
        СЦентр_ПриемВРемонт.Контрагент КАК Контрагент,
        СЦентр_ПриемВРемонт.ВидОперации КАК ВидОперации,
        СЦентр_ПриемВРемонт.ДатаПросрочки КАК ДатаПросрочки,
        СЦентр_ПриемВРемонт.Описание,
        СЦентр_ПриемВРемонт.ОриентировочнаяСтоимость,
        СЦентр_ПриемВРемонт.Ссылка
    ИЗ
        ЖурналДокументов.СЦентр_ДокументыПоРемонтуИОбслуживанию КАК ВыездПрием
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                СЦентр_ДокументыПоРемонтуИОбслуживанию.Ссылка КАК Ссылка,
                СЦентр_ДокументыПоРемонтуИОбслуживанию.Этап КАК ВидЭтапа,
                Временная.ДокументОснование КАК ДокументОснование
            ИЗ
                (ВЫБРАТЬ
                    МАКСИМУМ(ЖурналДокументов.Дата) КАК Дата,
                    ЖурналДокументов.ДокументОснование КАК ДокументОснование
                ИЗ
                    ЖурналДокументов.СЦентр_ДокументыПоРемонтуИОбслуживанию КАК ЖурналДокументов
                ГДЕ
                    (ЖурналДокументов.ДокументОснование ССЫЛКА Документ.СЦентр_ПриемВРемонт
                            ИЛИ ЖурналДокументов.ДокументОснование ССЫЛКА Документ.СЦентр_ВыездМастера)
                    И ЖурналДокументов.Проведен
               
                СГРУППИРОВАТЬ ПО
                    ЖурналДокументов.ДокументОснование) КАК Временная
                    ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов.СЦентр_ДокументыПоРемонтуИОбслуживанию КАК СЦентр_ДокументыПоРемонтуИОбслуживанию
                    ПО (СЦентр_ДокументыПоРемонтуИОбслуживанию.Дата = Временная.Дата)
           
            СГРУППИРОВАТЬ ПО
                Временная.ДокументОснование,
                СЦентр_ДокументыПоРемонтуИОбслуживанию.Ссылка,
                СЦентр_ДокументыПоРемонтуИОбслуживанию.Этап) КАК ТекущиеЭтапы
            ПО ВыездПрием.Ссылка = ТекущиеЭтапы.ДокументОснование
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.СЦентр_ПриемВРемонт КАК СЦентр_ПриемВРемонт
            ПО ВыездПрием.Ссылка = СЦентр_ПриемВРемонт.Ссылка
    Теперь в выборку попадает 19500 записей, в данный момент идет только вывод списка, и текущего этапа, на основании структуры подчиненности, которая таки пишет все в журнал документов.
    Что еще посмотреть?
    При выборе 1 записи идет скан 19500, где то же можно явно отсеить....
  9. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.456
    Симпатии:
    697
    Баллы:
    204
    Подзапросы точно нужно превращать во временные таблицы, т.к. оптимизатор не знает, сколь чего внутри подзапроса получится.
    Временные таблицы для динамического списка вроде в последних платформах работают.
  10. TopicStarter Overlay
    b7music
    Offline

    b7music

    Регистрация:
    21 июн 2016
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    Только вот во временную таблицу не передать значение из журнала документов. Не дает.
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.456
    Симпатии:
    697
    Баллы:
    204
    для чего это действие?
  12. TopicStarter Overlay
    b7music
    Offline

    b7music

    Регистрация:
    21 июн 2016
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    Получать текущий этап. Суть такая, создал документ прием в ремонт, у него автоматом статус прием в ремонт, (предопределенный) создаю например поступление в кассу, статус меняется на оплата от клиента. По текущему списку получается так.
  13. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.456
    Симпатии:
    697
    Баллы:
    204
    И для чего какие-то значения куда-то там передавать? Во временную таблицу выгребаются все поступления денег в кассу, потом эта временная таблица соединяется с документом из журнала - принцип такой.

    Код:
    ВЫБРАТЬ
                СЦентр_ДокументыПоРемонтуИОбслуживанию.Ссылка КАК Ссылка,
                СЦентр_ДокументыПоРемонтуИОбслуживанию.Этап КАК ВидЭтапа,
                Временная.ДокументОснование КАК ДокументОснование
            ИЗ
                (ВЫБРАТЬ
                    МАКСИМУМ(ЖурналДокументов.Дата) КАК Дата,
                    ЖурналДокументов.ДокументОснование КАК ДокументОснование
                ИЗ
                    ЖурналДокументов.СЦентр_ДокументыПоРемонтуИОбслуживанию КАК ЖурналДокументов
                ГДЕ
                    (ЖурналДокументов.ДокументОснование ССЫЛКА Документ.СЦентр_ПриемВРемонт
                            ИЛИ ЖурналДокументов.ДокументОснование ССЫЛКА Документ.СЦентр_ВыездМастера)
                    И ЖурналДокументов.Проведен
              
                СГРУППИРОВАТЬ ПО
                    ЖурналДокументов.ДокументОснование) КАК Временная
                    ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов.СЦентр_ДокументыПоРемонтуИОбслуживанию КАК СЦентр_ДокументыПоРемонтуИОбслуживанию
                    ПО (СЦентр_ДокументыПоРемонтуИОбслуживанию.Дата = Временная.Дата)
          
            СГРУППИРОВАТЬ ПО
                Временная.ДокументОснование,
                СЦентр_ДокументыПоРемонтуИОбслуживанию.Ссылка,
                СЦентр_ДокументыПоРемонтуИОбслуживанию.Этап) КАК ТекущиеЭтапы
    Запрос динаического среза последних выделяешь во временную таблицу, потом с ней соединяешь журнал как обычно.

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