1. yelloo 4 14.09.18 14:59 Сейчас в теме

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

Доброго дня, коллеги.

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

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

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

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

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

Вакансии

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

Руководитель группы сервисов ЭДО, ЭЦП и криптографии
Москва
зарплата от 150 000 руб.
Полный день

Руководитель группы интеграций (1С)
Москва
зарплата от 150 000 руб.
Полный день

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

Консультант-аналитик 1С (ЗУП)
Санкт-Петербург
Полный день