Рефакторинг после шизофрении.

1. triviumfan 93 14.09.18 14:59 Сейчас в теме
Доброго дня, коллеги.

УТ11. Пока обновлял конфу, наткнулся на сей код, после которого документ (как я обнаружил уже в отладке после), участвующий в доставке, проводился 15+ секунд.
Подскажите, что хотел получить "человек", написавший сей код? Я хорошо читаю чужой код, но в данном случае просто бессилен. Прошу помощи.

Функция ТекстЗапросаПоРаспоряжениям()
    
    Текст = "ВЫБРАТЬ
            |    ЗаданиеНаПеревозкуРаспоряжения.Ссылка КАК ЗаданиеНаПеревозку,
            |    ВЫБОР
            |        КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказПоставщику
            |            ТОГДА ПоступлениеТоваровУслугТовары.Ссылка
            |        КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
            |            ТОГДА ВозвратТоваровОтКлиентаТовары.Ссылка
            |        КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказКлиента
            |            ТОГДА РеализацияТоваровУслугТовары.Ссылка
            |        КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказНаПеремещение
            |            ТОГДА ПеремещениеТоваровТовары.Ссылка
            |        ИНАЧЕ ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка
            |    КОНЕЦ КАК Распоряжение,
            |    ЗаданиеНаПеревозкуМаршрут.Адрес,
            |    ЗаданиеНаПеревозкуРаспоряжения.КлючСвязи
            |ПОМЕСТИТЬ РаспоряженияДляЗаписи
            |ИЗ
            |    Документ.ЗаданиеНаПеревозку.Распоряжения КАК ЗаданиеНаПеревозкуРаспоряжения
            |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтКлиента.Товары КАК ВозвратТоваровОтКлиентаТовары
            |        ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка = ВозвратТоваровОтКлиентаТовары.Ссылка.ЗаявкаНаВозвратТоваровОтКлиента.Ссылка
            |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
            |        ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка = ПоступлениеТоваровУслугТовары.ЗаказПоставщику.Ссылка
            |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
            |        ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка = РеализацияТоваровУслугТовары.ЗаказКлиента.Ссылка
            |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
            |        ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка = ПеремещениеТоваровТовары.ЗаказНаПеремещение.Ссылка
            |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаПеревозку.Маршрут КАК ЗаданиеНаПеревозкуМаршрут
            |        ПО ЗаданиеНаПеревозкуРаспоряжения.КлючСвязи = ЗаданиеНаПеревозкуМаршрут.КлючСвязи
            |ГДЕ
            |    ЗаданиеНаПеревозкуРаспоряжения.Ссылка.Ссылка = &Ссылка
            |
            |СГРУППИРОВАТЬ ПО
            |    ЗаданиеНаПеревозкуРаспоряжения.Ссылка,
            |    ВЫБОР
            |        КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказПоставщику
            |            ТОГДА ПоступлениеТоваровУслугТовары.Ссылка
            |        КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
            |            ТОГДА ВозвратТоваровОтКлиентаТовары.Ссылка
            |        КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказКлиента
            |            ТОГДА РеализацияТоваровУслугТовары.Ссылка
            |        КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказНаПеремещение
            |            ТОГДА ПеремещениеТоваровТовары.Ссылка
            |        ИНАЧЕ ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка
            |    КОНЕЦ,
            |    ЗаданиеНаПеревозкуМаршрут.Адрес,
            |    ЗаданиеНаПеревозкуРаспоряжения.КлючСвязи
            |;
            |
            ////////////////////////////////////////////////////////////­////////////////////

            |ВЫБРАТЬ
            |    РаспоряженияДляЗаписи.ЗаданиеНаПеревозку,
            |    РаспоряженияДляЗаписи.Распоряжение,
            |    РаспоряженияДляЗаписи.Адрес,
            |    РаспоряженияДляЗаписи.КлючСвязи,
            |    ВЫБОР
            |        КОГДА РаспоряженияДляЗаписи.Распоряжение ССЫЛКА Документ.ПоступлениеТоваровУслуг
            |                ИЛИ РаспоряженияДляЗаписи.Распоряжение ССЫЛКА Документ.ВозвратТоваровПоставщику
            |            ТОГДА 1
            |        ИНАЧЕ 0
            |    КОНЕЦ КАК ФлагДоСклада
            |ИЗ
            |    РаспоряженияДляЗаписи КАК РаспоряженияДляЗаписи
            |ГДЕ
            |    НЕ РаспоряженияДляЗаписи.Распоряжение ЕСТЬ NULL 
            |    И РаспоряженияДляЗаписи.Распоряжение.ПометкаУдаления = ЛОЖЬ
            |    И РаспоряженияДляЗаписи.Распоряжение.Проведен = ИСТИНА
            |
            |СГРУППИРОВАТЬ ПО
            |    РаспоряженияДляЗаписи.ЗаданиеНаПеревозку,
            |    РаспоряженияДляЗаписи.Распоряжение,
            |    РаспоряженияДляЗаписи.Адрес,
            |    РаспоряженияДляЗаписи.КлючСвязи";
    Возврат Текст;
    
КонецФункции
Показать
Найденные решения
26. karpik666 3775 17.09.18 10:48 Сейчас в теме
(1) по факту первая таблица вообще не нужна, и эта связка через левое соединение, достаточно оставить последнюю таблицу, единственное что необходимо добавить - это проверку на тип и функцию выразить для условия на заполненность поля "распоряжение", а в остальном явно видно, что запрос писал человек, который просто не понимает как их делать, и сделал лишь бы работало.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
26. karpik666 3775 17.09.18 10:48 Сейчас в теме
(1) по факту первая таблица вообще не нужна, и эта связка через левое соединение, достаточно оставить последнюю таблицу, единственное что необходимо добавить - это проверку на тип и функцию выразить для условия на заполненность поля "распоряжение", а в остальном явно видно, что запрос писал человек, который просто не понимает как их делать, и сделал лишь бы работало.
27. triviumfan 93 17.09.18 11:11 Сейчас в теме
(26) большое спасибо, я так и предполагал.
2. Docaru 1 14.09.18 15:15 Сейчас в теме
и где этот запрос применяется? в модуле проведения? по смыслу похоже на запрос для печати. но могу ошибаться
3. triviumfan 93 14.09.18 15:20 Сейчас в теме
(2) Да, при проведении задания на перевозку - пишутся движения в дополнительный регистр сведений для доставки. Но вопрос то в другом! Нужен рефакторинг, могу удалить лишние обращения к ссылке, но логика запроса... это что-то непостижимое. Поэтому прошу помощи свыше.
4. Docaru 1 14.09.18 15:23 Сейчас в теме
(3)мне кажется все танцы с бубном ради ФлагДоСклада
alex-l19041; +1 Ответить
5. Docaru 1 14.09.18 15:27 Сейчас в теме
очень интересно как вы перепишите - выложите плиз
6. singlych 14.09.18 16:13 Сейчас в теме
Предположим, изначально запрос состоял только из последнего пакета, а потом увидели, что там в условиях разыменование поля составного типа, и решили оптимизировать.
7. triviumfan 93 14.09.18 16:17 Сейчас в теме
(6) Видимо она состояла в том, чтобы обращаться к ссылке ссылки, а также реквизиту основной таблицы, но обращаясь через табличную часть. Оптимизация на лицо...
8. singlych 14.09.18 16:19 Сейчас в теме
(7) Я написал "решили оптимизировать", а не "оптимизировали".
9. user633533_encantado 11 14.09.18 16:28 Сейчас в теме
"Распоряжение" это определяемый тип, кто-то хотел из него ссылку вытащить, чтобы потом с ней что-то сделать.
10. triviumfan 93 14.09.18 17:24 Сейчас в теме
(9) Может есть идеи, зачем было делать соединения с основными таблицами через табличную часть?
13. Xershi 1484 15.09.18 15:04 Сейчас в теме
(10) в теории чтобы оптимизатор работал по нужному плану и на этапе внедрения замеры показывали, что так оптимальнее будет работать!
Но никто не мешает убрать всю эту лапшу и повесить этот код на плечи оптимизатора, когда все начнет снова тупить вернете лапшу на место!
14. triviumfan 93 15.09.18 16:34 Сейчас в теме
(13) мысль настолько глубока и "не в ту степь", что я ничего не понял.
11. s202 15.09.18 10:44 Сейчас в теме
Потому что есть указание от флагмана - "делать все через запрос".
Соответственно, есть мода - делать все через запрос.
Потому что это типа круто, современно, и какбэ оптимально.

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

В результате - совершенно нечитаемые модули с запросами огромных размеров. И конфигурации, которые живут своей жизнью, и логику которых до конца не знают даже разработчики.
16. triviumfan 93 15.09.18 16:47 Сейчас в теме
(11) Если они нечитаемы, значит их писал рукоблуд по определению. И "какбэ оптимально" - так и есть. Стараюсь все получить (предпочтительно запросом) и за один серверный вызов.
12. acanta 15.09.18 10:53 Сейчас в теме
Автора спросить не пробовали? Настоящим программистам отладчик и контекстная подсказка не нужны. Интересно, когда для файловой версии 1с сделают аналог sqlпрофайлера
15. triviumfan 93 15.09.18 16:35 Сейчас в теме
(12) Автора давно нет, смысл тогда мне вообще постить этот бред?!
17. acanta 15.09.18 16:49 Сейчас в теме
Я тоже хотела как то сделать левое соединение шапки с табличной частью (по первой строке) у меня выдавало на исполнении ошибку Не обнаружен реквизит Документ.НазваниеДокумента.ТабличнаяЧасть.ТабличнаяЧасть. В конструкторе запросов все было ровно.
У него это кажется получилось, будем иметь ввиду..
18. Infector 201 16.09.18 15:26 Сейчас в теме
Многовато словечек "ссылка", а в целом вполне читаемый запрос
19. triviumfan 93 17.09.18 10:06 Сейчас в теме
(18) Небо голубое, трава зелёная, солнце жёлтое.
20. user633533_encantado 11 17.09.18 10:13 Сейчас в теме
(19) Не понимаю, зачем выкладывать кусок кода с вопросом, а потом огрызаться на каждый ответ.
21. triviumfan 93 17.09.18 10:19 Сейчас в теме
(20) это не ответ, а очередной "пук", спам, набивание постов или можете как угодно понимать. Прочитайте вопрос внимательней.
22. user633533_encantado 11 17.09.18 10:21 Сейчас в теме
(21) А какой вы ответ хотите получить выложив кусок кода без контекста ?
23. triviumfan 93 17.09.18 10:24 Сейчас в теме
(22) Контекст не важен, но если нужно, то ответ есть в (3)
Вы не умеете читать запросы? Тогда вопрос не для вас.
24. user633533_encantado 11 17.09.18 10:27 Сейчас в теме
25. Infector 201 17.09.18 10:39 Сейчас в теме
(23)Если контекст неважен, то это сферический конь в вакууме.
Что хотел получить "человек", написавший сей код? - это вполне ясно из текста.
Если же говорить о том, что с этим сделать, то в первую очередь избавиться от "ссылок". От большей части Левых соединений и временной таблицы тоже вполне можно.
Есть еще один возможный алгоритм - ловим результат выполнения запроса и воспроизводим его уже с помощью своего текста. Или забираем в консоль и тоже самое проделываем в консоли.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот