Доброго дня, коллеги.
УТ11. Пока обновлял конфу, наткнулся на сей код, после которого документ (как я обнаружил уже в отладке после), участвующий в доставке, проводился 15+ секунд.
Подскажите, что хотел получить "человек", написавший сей код? Я хорошо читаю чужой код, но в данном случае просто бессилен. Прошу помощи.
УТ11. Пока обновлял конфу, наткнулся на сей код, после которого документ (как я обнаружил уже в отладке после), участвующий в доставке, проводился 15+ секунд.
Подскажите, что хотел получить "человек", написавший сей код? Я хорошо читаю чужой код, но в данном случае просто бессилен. Прошу помощи.
Функция ТекстЗапросаПоРаспоряжениям()
Текст = "ВЫБРАТЬ
| ЗаданиеНаПеревозкуРаспоряжения.Ссылка КАК ЗаданиеНаПеревозку,
| ВЫБОР
| КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказПоставщику
| ТОГДА ПоступлениеТоваровУслугТовары.Ссылка
| КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
| ТОГДА ВозвратТоваровОтКлиентаТовары.Ссылка
| КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказКлиента
| ТОГДА РеализацияТоваровУслугТовары.Ссылка
| КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказНаПеремещение
| ТОГДА ПеремещениеТоваровТовары.Ссылка
| ИНАЧЕ ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка
| КОНЕЦ КАК Распоряжение,
| ЗаданиеНаПеревозкуМаршрут.Адрес,
| ЗаданиеНаПеревозкуРаспоряжения.КлючСвязи
|ПОМЕСТИТЬ РаспоряженияДляЗаписи
|ИЗ
| Документ.ЗаданиеНаПеревозку.Распоряжения КАК ЗаданиеНаПеревозкуРаспоряжения
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтКлиента.Товары КАК ВозвратТоваровОтКлиентаТовары
| ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка = ВозвратТоваровОтКлиентаТовары.Ссылка.ЗаявкаНаВозвратТоваровОтКлиента.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
| ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка = ПоступлениеТоваровУслугТовары.ЗаказПоставщику.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка = РеализацияТоваровУслугТовары.ЗаказКлиента.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
| ПО ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка = ПеремещениеТоваровТовары.ЗаказНаПеремещение.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаПеревозку.Маршрут КАК ЗаданиеНаПеревозкуМаршрут
| ПО ЗаданиеНаПеревозкуРаспоряжения.КлючСвязи = ЗаданиеНаПеревозкуМаршрут.КлючСвязи
|ГДЕ
| ЗаданиеНаПеревозкуРаспоряжения.Ссылка.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ЗаданиеНаПеревозкуРаспоряжения.Ссылка,
| ВЫБОР
| КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказПоставщику
| ТОГДА ПоступлениеТоваровУслугТовары.Ссылка
| КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаявкаНаВозвратТоваровОтКлиента
| ТОГДА ВозвратТоваровОтКлиентаТовары.Ссылка
| КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказКлиента
| ТОГДА РеализацияТоваровУслугТовары.Ссылка
| КОГДА ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка ССЫЛКА Документ.ЗаказНаПеремещение
| ТОГДА ПеремещениеТоваровТовары.Ссылка
| ИНАЧЕ ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.Ссылка
| КОНЕЦ,
| ЗаданиеНаПеревозкуМаршрут.Адрес,
| ЗаданиеНаПеревозкуРаспоряжения.КлючСвязи
|;
|
//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| РаспоряженияДляЗаписи.ЗаданиеНаПеревозку,
| РаспоряженияДляЗаписи.Распоряжение,
| РаспоряженияДляЗаписи.Адрес,
| РаспоряженияДляЗаписи.КлючСвязи,
| ВЫБОР
| КОГДА РаспоряженияДляЗаписи.Распоряжение ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ИЛИ РаспоряженияДляЗаписи.Распоряжение ССЫЛКА Документ.ВозвратТоваровПоставщику
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК ФлагДоСклада
|ИЗ
| РаспоряженияДляЗаписи КАК РаспоряженияДляЗаписи
|ГДЕ
| НЕ РаспоряженияДляЗаписи.Распоряжение ЕСТЬ NULL
| И РаспоряженияДляЗаписи.Распоряжение.ПометкаУдаления = ЛОЖЬ
| И РаспоряженияДляЗаписи.Распоряжение.Проведен = ИСТИНА
|
|СГРУППИРОВАТЬ ПО
| РаспоряженияДляЗаписи.ЗаданиеНаПеревозку,
| РаспоряженияДляЗаписи.Распоряжение,
| РаспоряженияДляЗаписи.Адрес,
| РаспоряженияДляЗаписи.КлючСвязи";
Возврат Текст;
КонецФункции
ПоказатьНайденные решения
(1) по факту первая таблица вообще не нужна, и эта связка через левое соединение, достаточно оставить последнюю таблицу, единственное что необходимо добавить - это проверку на тип и функцию выразить для условия на заполненность поля "распоряжение", а в остальном явно видно, что запрос писал человек, который просто не понимает как их делать, и сделал лишь бы работало.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) по факту первая таблица вообще не нужна, и эта связка через левое соединение, достаточно оставить последнюю таблицу, единственное что необходимо добавить - это проверку на тип и функцию выразить для условия на заполненность поля "распоряжение", а в остальном явно видно, что запрос писал человек, который просто не понимает как их делать, и сделал лишь бы работало.
(2) Да, при проведении задания на перевозку - пишутся движения в дополнительный регистр сведений для доставки. Но вопрос то в другом! Нужен рефакторинг, могу удалить лишние обращения к ссылке, но логика запроса... это что-то непостижимое. Поэтому прошу помощи свыше.
(10) в теории чтобы оптимизатор работал по нужному плану и на этапе внедрения замеры показывали, что так оптимальнее будет работать!
Но никто не мешает убрать всю эту лапшу и повесить этот код на плечи оптимизатора, когда все начнет снова тупить вернете лапшу на место!
Но никто не мешает убрать всю эту лапшу и повесить этот код на плечи оптимизатора, когда все начнет снова тупить вернете лапшу на место!
Потому что есть указание от флагмана - "делать все через запрос".
Соответственно, есть мода - делать все через запрос.
Потому что это типа круто, современно, и какбэ оптимально.
И неважно, что простой перебор строк таблицы во многих случаях работает быстрее, чем пятиэтажный запрос на 500 строк. (Про возможность использования отладчика в первом случае и невозможность во втором лучше промолчать, иначе заклюют).
И неважно, что читаемость кода в первом случае на порядок выше, чем во втором.
В результате - совершенно нечитаемые модули с запросами огромных размеров. И конфигурации, которые живут своей жизнью, и логику которых до конца не знают даже разработчики.
Соответственно, есть мода - делать все через запрос.
Потому что это типа круто, современно, и какбэ оптимально.
И неважно, что простой перебор строк таблицы во многих случаях работает быстрее, чем пятиэтажный запрос на 500 строк. (Про возможность использования отладчика в первом случае и невозможность во втором лучше промолчать, иначе заклюют).
И неважно, что читаемость кода в первом случае на порядок выше, чем во втором.
В результате - совершенно нечитаемые модули с запросами огромных размеров. И конфигурации, которые живут своей жизнью, и логику которых до конца не знают даже разработчики.
Я тоже хотела как то сделать левое соединение шапки с табличной частью (по первой строке) у меня выдавало на исполнении ошибку Не обнаружен реквизит Документ.НазваниеДокумента.ТабличнаяЧасть.ТабличнаяЧасть. В конструкторе запросов все было ровно.
У него это кажется получилось, будем иметь ввиду..
У него это кажется получилось, будем иметь ввиду..
(23)Если контекст неважен, то это сферический конь в вакууме.
Что хотел получить "человек", написавший сей код? - это вполне ясно из текста.
Если же говорить о том, что с этим сделать, то в первую очередь избавиться от "ссылок". От большей части Левых соединений и временной таблицы тоже вполне можно.
Есть еще один возможный алгоритм - ловим результат выполнения запроса и воспроизводим его уже с помощью своего текста. Или забираем в консоль и тоже самое проделываем в консоли.
Что хотел получить "человек", написавший сей код? - это вполне ясно из текста.
Если же говорить о том, что с этим сделать, то в первую очередь избавиться от "ссылок". От большей части Левых соединений и временной таблицы тоже вполне можно.
Есть еще один возможный алгоритм - ловим результат выполнения запроса и воспроизводим его уже с помощью своего текста. Или забираем в консоль и тоже самое проделываем в консоли.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот