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

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

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

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

            |ВЫБРАТЬ
            |    РаспоряженияДляЗаписи.ЗаданиеНаПеревозку,
            |    РаспоряженияДляЗаписи.Распоряжение,
            |    РаспоряженияДляЗаписи.Адрес,
            |    РаспоряженияДляЗаписи.КлючСвязи,
            |    ВЫБОР
            |        КОГДА РаспоряженияДляЗаписи.Распоряжение ССЫЛКА Документ.ПоступлениеТоваровУслуг
            |                ИЛИ РаспоряженияДляЗаписи.Распоряжение ССЫЛКА Документ.ВозвратТоваровПоставщику
            |            ТОГДА 1
            |        ИНАЧЕ 0
            |    КОНЕЦ КАК ФлагДоСклада
            |ИЗ
            |    РаспоряженияДляЗаписи КАК РаспоряженияДляЗаписи
            |ГДЕ
            |    НЕ РаспоряженияДляЗаписи.Распоряжение ЕСТЬ NULL 
            |    И РаспоряженияДляЗаписи.Распоряжение.ПометкаУдаления = ЛОЖЬ
            |    И РаспоряженияДляЗаписи.Распоряжение.Проведен = ИСТИНА
            |
            |СГРУППИРОВАТЬ ПО
            |    РаспоряженияДляЗаписи.ЗаданиеНаПеревозку,
            |    РаспоряженияДляЗаписи.Распоряжение,
            |    РаспоряженияДляЗаписи.Адрес,
            |    РаспоряженияДляЗаписи.КлючСвязи";
    Возврат Текст;
    
КонецФункции
Показать
Найденные решения
26. karpik666 3760 17.09.18 10:48 Сейчас в теме
(1) по факту первая таблица вообще не нужна, и эта связка через левое соединение, достаточно оставить последнюю таблицу, единственное что необходимо добавить - это проверку на тип и функцию выразить для условия на заполненность поля "распоряжение", а в остальном явно видно, что запрос писал человек, который просто не понимает как их делать, и сделал лишь бы работало.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
26. karpik666 3760 17.09.18 10:48 Сейчас в теме
(1) по факту первая таблица вообще не нужна, и эта связка через левое соединение, достаточно оставить последнюю таблицу, единственное что необходимо добавить - это проверку на тип и функцию выразить для условия на заполненность поля "распоряжение", а в остальном явно видно, что запрос писал человек, который просто не понимает как их делать, и сделал лишь бы работало.
27. triviumfan 92 17.09.18 11:11 Сейчас в теме
(26) большое спасибо, я так и предполагал.
2. Docaru 1 14.09.18 15:15 Сейчас в теме
и где этот запрос применяется? в модуле проведения? по смыслу похоже на запрос для печати. но могу ошибаться
3. triviumfan 92 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 92 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 92 14.09.18 17:24 Сейчас в теме
(9) Может есть идеи, зачем было делать соединения с основными таблицами через табличную часть?
13. Xershi 1474 15.09.18 15:04 Сейчас в теме
(10) в теории чтобы оптимизатор работал по нужному плану и на этапе внедрения замеры показывали, что так оптимальнее будет работать!
Но никто не мешает убрать всю эту лапшу и повесить этот код на плечи оптимизатора, когда все начнет снова тупить вернете лапшу на место!
14. triviumfan 92 15.09.18 16:34 Сейчас в теме
(13) мысль настолько глубока и "не в ту степь", что я ничего не понял.
11. s202 15.09.18 10:44 Сейчас в теме
Потому что есть указание от флагмана - "делать все через запрос".
Соответственно, есть мода - делать все через запрос.
Потому что это типа круто, современно, и какбэ оптимально.

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

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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)