|
|
|
Какое условие соединения быстрее | ☑ | ||
|---|---|---|---|---|
|
0
Прохожий
19.10.25
✎
15:21
|
По замерам вроде не особо разница
|
|||
|
1
Прохожий
23.10.25
✎
11:55
|
| РегистрНакопления.Продажи.Обороты( | , | , | Регистратор, | ДокументПродажи В | (ВЫБРАТЬ | Реализации.Реализация | ИЗ | ВТ_Реализации КАК Реализации)) КАК ПродажиОбороты | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Реализации КАК Реализации | ПО (ВЫБОР | КОГДА ПродажиОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА Реализации.Реализация = (ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг)) | ИНАЧЕ ЛОЖЬ | КОНЕЦ) | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Реализации КАК Возврат | ПО (ВЫБОР | КОГДА ПродажиОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя | ТОГДА Возврат.Реализация = (ВЫРАЗИТЬ(ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ВозвратТоваровОтПокупателя).ДокументОснование КАК Документ.РеализацияТоваровУслуг)) | ИНАЧЕ ЛОЖЬ | КОНЕЦ) |
|||
|
2
Прохожий
23.10.25
✎
11:55
|
| РегистрНакопления.Продажи.Обороты( | , | , | Регистратор, | ДокументПродажи В | (ВЫБРАТЬ | Реализации.Реализация | ИЗ | ВТ_Реализации КАК Реализации)) КАК ПродажиОбороты | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Реализации КАК Реализации | ПО (Реализации.Реализация = (ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг))) | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Реализации КАК Возврат | ПО (Возврат.Реализация = (ВЫРАЗИТЬ(ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ВозвратТоваровОтПокупателя).ДокументОснование КАК Документ.РеализацияТоваровУслуг))) |
|||
|
3
Прохожий
19.10.25
✎
15:23
|
Есть смысл через Выбор проверять регистратор и дальше не лезть?
|
|||
|
4
Волшебник
19.10.25
✎
15:37
|
Может сделаете замер производительности?
|
|||
|
5
maxab72
19.10.25
✎
15:59
|
(0) Надо смотреть на тот запрос, что сформирует SQL. А это зависит не только от текста самого запроса.
|
|||
|
6
Прохожий
19.10.25
✎
15:59
|
Сделал. Разницы практически нет.
|
|||
|
7
Прохожий
19.10.25
✎
16:01
|
(5) Тогда выберу второй. Он классичнее. Просто сама идея первого до конца не понятна. Вот возвратов же меньше гораздо. Дешевле проверить на ссылку или соединить с двумя таблицами регистратор?
|
|||
|
8
maxab72
19.10.25
✎
16:24
|
(7) вполне возможно, что SQL для этих двух вариантов сгенерил два идентичных конечных запроса к базе. и поэтому, действительно, лучше остановиться на запросе с более прозрачной структурой (самому же потом в него придется когда-нибудь лезть).
|
|||
|
9
Wern
19.10.25
✎
16:30
|
Вот это
"(ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг))" тоже можно убрать до "ПродажиОбороты.Регистратор" и "ВЫРАЗИТЬ(ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ВозвратТоваровОтПокупателя).ДокументОснование КАК Документ.РеализацияТоваровУслуг)))" преврати в "ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ВозвратТоваровОтПокупателя).ДокументОснование)" ВЫРАЗИТЬ надо чтоб исключить обращение к лишним таблицам, а тут идет обращение только к УИД который записан в самом реквизите никакого обращения к таблицам не идет потому ВЫРАЗИТЬ не нужно оно ничего не делает. А вот при обращении к ".ДокументОснование" ВЫРАЗИТЬ нужно. Потому и эти условия ВЫБОР тоже почти ничего не делают. Мы обращаемся к тому что лежит в поле Регистратор, тип в этом поле тоже есть, потому в первом запросе будут 2 проверки первая на тип вторая на УИД, во втором только одна на УИД. Теоретически второй случай быстрее, но разница совсем минимальная. Никак лишних соединений тут нет ни в первом, ни во втором случае. |
|||
|
10
Dmitrii
гуру
19.10.25
✎
16:44
|
(1) Зачем такие сложные конструкции?
Замени ВЫБОР на обычное условие. Вместо
написать:
|
|||
|
11
Прохожий
19.10.25
✎
20:38
|
(9, 10) Да, так интересно
|
|||
|
12
Garykom
гуру
20.10.25
✎
08:41
|
1. Зачем использовать подзапросы вместо соединений с временными таблицами?
2. Зачем извращаться с условиями в виртуальных таблицах, когда можно построить нормальный запрос к полным? И это будет ничуть не тормозней если правильно делать и нет проблем в СКД |
|||
|
13
unenu
20.10.25
✎
09:32
|
от Выбор Когда в тяжелых соединениях необходимо избавляться на стадии первичных пакетов формирования ВТ.
|
|||
|
14
Garykom
гуру
20.10.25
✎
10:32
|
(13) Использование Выбор Когда в соединениях ПО это конечно тот еще ахтунг да
Ладно еще в условиях ГДЕ, хотя там тоже нежелательно |
|||
|
15
RomanYS
20.10.25
✎
10:56
|
(12) спорные утверждения.
Простой подзапрос в условиях виртуальной таблицы вполне себе нормальная практика. |
|||
|
16
Garykom
гуру
20.10.25
✎
11:10
|
(15)
Пояснение
Виртуальная таблица - это удобная вещь для обращения к данным регистра. Виртуальная таблица скрывает подробности своей работы, предоставляя понятный способ обращения к данным. В частности, виртуальная таблица по-разному формирует запросы к базе данных в зависимости от того, какой режим работы у регистра (включено ли хранение актуальных итогов, рассчитаны ли итоги и на какой последний период). Она может как использовать временные таблицы базы данных, так и сформировать подзапрос. Параметр Условие предназначен для того, чтобы сократить объем данных, обрабатываемый при работе виртуальной таблицы. Важно понимать, что при использовании временной таблицы никакой оптимизатор СУБД не сможет распознать, что из временной таблицы в последствии будет использована лишь часть данных, а следовательно без правильного указания параметра Условие заполнение временной таблицы ненужными данными часто может быть причиной проблем с производительностью. С другой стороны, если в параметр Условие заложить слишком много, то такой подход также может принести больше проблем, нежели пользы. В процессе разбора одной из проблем производительности в конфигурации был обнаружен запрос к виртуальной таблице регистра, при этом в параметре Условие было указано выражение с подзапросом и соединениями двух табличных частей. Более того, из-за использования неявных соединений (использования выражения через точку в выражении языка запросов) количество таблиц в этом выражении выросло еще больше. Это привело к отрицательному результату - вместо увеличения производительности получилось уменьшение скорости работы. Рекомендация При обращении к виртуальной таблице следует передавать в условия наиболее простые конструкции, например, "Измерение = Значение". Не рекомендуется использовать подзапросы и соединения(*) в параметрах виртуальной таблицы, так как это приводит к медленной работе запроса. https://its.1c.ru/db/metod8dev/content/5457/hdoc |
|||
|
17
Garykom
гуру
20.10.25
✎
11:13
|
(16)+ Если очень надо - можно динамически формировать текст запроса
Или с передачей параметров в т.ч. списков/массивов |
|||
|
18
RomanYS
20.10.25
✎
11:22
|
(16) по твоей же ссылке. Найди отличия с (0)
|
|||
|
19
Garykom
гуру
20.10.25
✎
11:39
|
(18) да в данном случае нормально, ибо простое
но плохо читается, если есть возможность можно отдельно выполнить запрос и передать параметром чтобы было просто | РегистрНакопления.Продажи.Обороты( | , | , | Регистратор, | ДокументПродажи В (&МассивДокументовПродажи) |
|||
|
20
aka MIK
20.10.25
✎
12:00
|
(19) это не обязательно. Если в условиях виртуальной таблицы будет в подзапросе обращение к данным временной таблицы, и там будет ограниченное к-во данных, то сработает нормально. Главное чтобы оптимизатор запроса знал сколько в подзапросе строк еще до начала выполнения запроса
|
|||
|
21
Wern
20.10.25
✎
13:54
|
(19) Вот этого как раз не надо. Передавать список документов с SQL сервера на сервер приложений сохранять его там в памяти, передавать его обратно на SQL сервер. Это все сильно не на пользу производительности.
|
|||
|
22
scanduta
20.10.25
✎
15:23
|
(0) Конечно через ВЫРАЗИТЬ на больших объемах будет быстрее намного работать. Проверено на практике. На малых объемах без разницы
|
|||
|
23
aka MIK
20.10.25
✎
16:47
|
(21) затраты ресурсов на передачу списка для отбора на порядки меньше чем затраты SQL на запрос без корректного отбора
|
|||
|
24
Wern
20.10.25
✎
17:02
|
(23) Только вот там корректный отбор.
|
|||
|
25
RomanYS
20.10.25
✎
17:14
|
(22) Не "конечно"! В (9) правильно расписано, когда польза от ВЫРАЗИТЬ есть, а когда только вред для читаемости.
|
|||
|
26
Dmitrii
гуру
20.10.25
✎
17:37
|
(25) >> В (9) правильно расписано...
Нет. В (9) допущена ошибка в рассуждениях. Дело в том, что автор ветки использовал выражение ВЫРАЗИТЬ для того, чтобы ограничить условие соединения с конкретными таблицами - Документ.РеализацияТоваровУслуг (для отбора продаж) и Документ.ВозвратТоваровОтПокупателя (для отбора возвратов). Он почему-то отказался от оператора ССЫЛКА в пользу ВЫРАЗИТЬ. Если убрать эти ВЫРАЗИТЬ, запрос вернёт другие результаты. ВЫРАЗИТЬ можно убрать, если заменить их на логический оператор ССЫЛКА, как я предложил в (10). |
|||
|
27
RomanYS
20.10.25
✎
17:56
|
(26) ТС использовал ВЫРАЗИТЬ потому что как и (22) где-то слышал звон... и пытался ускорить.
Получался ли у него правильный результат и что он вообще делал, мы не знаем. Поэтому с "запрос вернёт другие результаты" готов согласиться, но возможно этот результат будет лучше прежнего))) А в (9) правильная попытка объяснить, когда ВЫРАЗИТЬ может что-то ускорить |
|||
|
28
Garykom
гуру
20.10.25
✎
18:05
|
(27) ВЫРАЗИТЬ для составных ускоряет когда запрос в SQL не транслируется с лишними соединениями
|
|||
|
29
Wern
20.10.25
✎
18:08
|
(26) Согласен. В (9) моя ошибка в плане того что если в "ВТ_Реализации" кроме "РеализацияТоваровУслуг" лежат какие то другие документы, то мы получим отличный от (0) результат. Но и с (27) соглашусь, не думаю что ТС намерено использовал "ВЫРАЗИТЬ" для этих целей.
|
|||
|
30
Dmitrii
гуру
20.10.25
✎
21:55
|
(27) (29) >> не думаю что ТС намерено использовал "ВЫРАЗИТЬ" для этих целей.
Парни... Если бы я хотел кого-то обидеть, то мне пришлось бы начать с себя. Я точно так же, как и вы, сначала упустил эту логику. И даже начал было писать пост аналогичный (9). Но потом просто задался вопросом - а нафига тут два соединения и чем именно они будут отличаться, если мы уберём ВЫРАЗИТЬ и оставим только в первой связи только условие Реализация=Регистратор? И тут всё стало понятно. Даже если автор тупо использовал ВЫРАЗИТЬ только потому, что "где-то слышал звон... и пытался ускорить", ему удалось одновременно решить вопрос отбора в одной связи по документам продажи, а в другой - по документам возврата. Так что либо оставляем ВЫРАЗИТЬ, либо заменяем на использование ССЫЛКА. И в любом случае конструкцию следует оставить "(ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ВозвратТоваровОтПокупателя).ДокументОснование" для удаления лишних неявных левых соединений с таблицами всех возможных регистраторов нашего регистра. |
|||
|
31
H A D G E H O G s
20.10.25
✎
22:38
|
Убирать ВЫРАЗИТЬ из соединений тут не обязательно, никакими индексами в соединениях тут не пахнет.
А вот проиндексировать поле "Реализация" в ВТ "ВТ_Реализации" нужно. Это редкий, исчезающе--редкий случай, когда нужна индексация ВТ, причем: 1) Если ВТ будет мала (меньше процента от размера таблицы для MSSQL) - будет использоваться индекс в параметрах виртуальной таблице и СОРТИРОВКА по индексу в соединении с временной таблицей. 2) Если ВТ будет велика - будет использоваться СОРТИРОВКА индекса для соединения слиянием в параметрах виртуальной таблице и тажа СОРТИРОВКА индекса в соединении с временной таблицей. Если не Индексировать ВТ, для 2-ого варианта 1С 2 раза отсортирует ВременнуюТаблицу. Короче, индексирование ВТ заменяет Сортировку ВТ, которую не завезли в платформу. |
|||
|
32
Dmitrii
гуру
20.10.25
✎
23:08
|
Ну раз пошла такая пьянка,....
А нафига тут вообще виртуальная таблица Обороты, если периодичность "Регистратор" и нет отбора по периоду? Если регистр накопления оборотный (что скорее всего), то с высокой долей вероятности, запрос к первичной таблице движений будет работать гораздо быстрее. А в зависимости от того на кой вообще нужен этот запрос, потом можно результат и сгруппировать по нужным полям. Осмелюсь предположить, что витруальную таблицу Обороты авто взял исключительно потому, что ему нужен был как раз отбор и связь по полю Регистратор. Если я прав, то весь запрос надо нафиг переписывать. PS И это мы ещё на задались вопросом о том как и откуда берётся таблица ВТ_Реализации и зачем вообще всё это нужно (для отчета в СКД, сбор данных для проведения какого-нибудь документа или какое-нибудь заполнение в какой-нибудь обработке)....... |
|||
|
33
Wern
21.10.25
✎
10:51
|
(32) Так там же и так будет запрос к первичной таблице, даже с виртуальной таблицей Обороты. Тут главное чтоб "Реализации.Реализация" проиндексировано было. За счет чего первичная таблица будет работать гараздо быстрее чем виртуальная таблица оборотов? Может ты про скрытую группировку в виртуальной таблице, которой нет в основной таблице регистра? Ну врятли ТС нужна не сгруппированная таблица регистра. Или про вложенные запросы? Он тут максимально простой, проблема возникает когда оптимизатор не в состоянии определить количество строк во вложенном запросе до его выполнения. А тут во вложенном запросе одна таблица и никаких соединений и условий, к тому же используемая таблица "ВТ_Реализации" только что была сформирована, статистики свежи как никогда. Никаких шансов что оптимизатор сформирует неоптимальный план запроса.
А раз разницы нет лучше сразу использовать виртуальную таблицу чтоб не пришлось ТС лезть в дебри и думать когда какую таблицу лучше применять. |
|||
|
34
Прохожий
22.10.25
✎
18:41
|
(32) Вот на такой продуктивный спор я и надеялся. глядишь и мне обломится пользы от вашей дискуссии. Продолжайте, пожалуйста. Ускорить запрос - это актуально. ВТ Реализация отбирает всего один Заказ. Она малюсенькая.
|
|||
|
35
Прохожий
22.10.25
✎
18:42
|
"Осмелюсь предположить, что витруальную таблицу Обороты авто взял исключительно потому, что ему нужен был как раз отбор и связь по полю Регистратор. " Мопед не мой, я его пытаюсь в мотоцикл переделать. Очиньнада.
|
|||
|
36
Garykom
гуру
22.10.25
✎
19:15
|
(34) Если она малюсенька то сделай ее параметром
Ну не надо подзапросы лишний раз использовать, даже к малюсеньким ВТ Ибо хз что там планировщик унутри СУБД намутит, может решить в цикле на миллиарды строк Оборотов заново запрос к ВТ выполнять для каждой строчки... |
|||
|
37
Dmitrii
гуру
22.10.25
✎
19:17
|
(35) >> Очиньнада...
Тогда, во-первых, надо выложить весь текст запроса, без купюр и сокращений. А, во-вторых, хотя бы кратко описать внешние условия - где и для каких целей этот запрос используется, каковы объёмы выборок (промежуточных в ВТ и итоговой). Ну и какова скорость работы запроса сейчас и какая будет считаться приемлемой (в абсолютных и/или относительных величинах). Если конфа типовая, указать версию. Если нетиповая, описать структуру регистров. Без всей этой информации ветка - это просто балаган фантазёров, где едва ли не 90% постов - тыканье пальцами в небо с авторитетной миной на лице. |
|||
|
38
Garykom
гуру
22.10.25
✎
19:19
|
(36)+ Фактически это как надеяться на оптимизатор компилятора
Когда в цикле предполагать что каждый раз результат выполнения функции будет одинаков и она только один раз реально выполнится Функция ТипаСтатика() Возврат 2+2; КонецФункции Процедура НечтоДелаем() Для Номер = 1 По 1000000000 Цикл А = ТипаСтатика(); КонецЦикла; КонецПроцедуры |
|||
|
39
Прохожий
22.10.25
✎
20:26
|
(37) Статусы заказов считает по количеству сколько единиц в заказах и куда ушли. Во внутренних и в заказах покупателя. Беда в том, что запрос прописан в подписку проведения всех товарных документов, то есть при проведении перемещения или возврата или заказа или реализации в конце этот запрос вычисляет где чего исполнено по заказу и в периодический РС этому заказу записывает статус. Поэтому запрос молотит постоянно при любом товарном движении. Переделывать архитектуру не вариант, сейчас другая система внедряется.
|
|||
|
40
Прохожий
22.10.25
✎
20:28
|
Все было изначально на вложено вложено вложенных запросах, я пока на ВТ растащил, часть запроса вообще никуда на вела. Полегчало чуть. Но все же. 85 % времени в рабочие часы занимает запрос от всей транзакции проведения.
|
|||
|
41
Прохожий
23.10.25
✎
13:44
|
Запрос живет тут:
ВЫБРАТЬ ВнутреннийЗаказ.Ссылка КАК ЗП ПОМЕСТИТЬ ВТ_ЗаказыВнутренние ИЗ Документ.ВнутреннийЗаказ КАК ВнутреннийЗаказ ГДЕ ВнутреннийЗаказ.Ссылка = &Документ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗаказПокупателя.Ссылка КАК ЗП ПОМЕСТИТЬ ВТ_ЗаказыПокупателя ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ГДЕ ЗаказПокупателя.Ссылка = &Документ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ЗаказыВнутренние.ЗП, ПеремещениеТоваров.Ссылка КАК Перемещение ПОМЕСТИТЬ ВТ_ПеремещениеЗаказа ИЗ ВТ_ЗаказыВнутренние КАК ВТ_ЗаказыВнутренние ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров КАК ПеремещениеТоваров ПО (ВТ_ЗаказыВнутренние.ЗП = (ВЫРАЗИТЬ(ПеремещениеТоваров.ДокументОснование КАК Документ.ВнутреннийЗаказ))) И (ПеремещениеТоваров.Дата >= &ДатаЗаказа) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПеремещениеЗаказа.ЗП, ПеремещениеЗаказа.Перемещение КАК Перемещение, РеализацияТоваровУслуг.Ссылка КАК Реализация ПОМЕСТИТЬ ВТ_Реализации ИЗ ВТ_ПеремещениеЗаказа КАК ПеремещениеЗаказа ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ПО (ПеремещениеЗаказа.Перемещение = (ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДокументОснование КАК Документ.ПеремещениеТоваров))) И (РеализацияТоваровУслуг.Дата >= &ДатаЗаказа) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Заказы.ЗП, ЗНАЧЕНИЕ(Документ.ПеремещениеТоваров.), РеализацияТоваровУслуг.Ссылка ИЗ ВТ_ЗаказыПокупателя КАК Заказы ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ПО (Заказы.ЗП = (ВЫРАЗИТЬ(РеализацияТоваровУслуг.ДокументОснование КАК Документ.ЗаказПокупателя))) И (РеализацияТоваровУслуг.Дата >= &ДатаЗаказа) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СУММА(ВЫБОР КОГДА ПродажиОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА ВЫБОР КОГДА ПродажиОбороты.КоличествоОборот < 0 ТОГДА -ПродажиОбороты.КоличествоОборот ИНАЧЕ ПродажиОбороты.КоличествоОборот КОНЕЦ ИНАЧЕ 0 КОНЕЦ) КАК Оформлено, СУММА(ВЫБОР КОГДА ПродажиОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя ТОГДА ВЫБОР КОГДА ПродажиОбороты.КоличествоОборот < 0 ТОГДА -ПродажиОбороты.КоличествоОборот ИНАЧЕ ПродажиОбороты.КоличествоОборот КОНЕЦ ИНАЧЕ 0 КОНЕЦ) КАК КоличествоВозврат, ВЫБОР КОГДА ПродажиОбороты.ЗаказПокупателя = НЕОПРЕДЕЛЕНО ТОГДА ЕСТЬNULL(Возврат.ЗП, Реализации.ЗП) ИНАЧЕ ПродажиОбороты.ЗаказПокупателя КОНЕЦ КАК ЗП, ПродажиОбороты.Номенклатура КАК Номенклатура ПОМЕСТИТЬ ПродажиОборот ИЗ РегистрНакопления.Продажи.Обороты( &ДатаЗаказа, , Регистратор, ДокументПродажи В (ВЫБРАТЬ Реализации.Реализация ИЗ ВТ_Реализации КАК Реализации)) КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Реализации КАК Реализации ПО (Реализации.Реализация = (ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг))) ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Реализации КАК Возврат ПО (Возврат.Реализация = (ВЫРАЗИТЬ(ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ВозвратТоваровОтПокупателя).ДокументОснование КАК Документ.РеализацияТоваровУслуг))) СГРУППИРОВАТЬ ПО ВЫБОР КОГДА ПродажиОбороты.ЗаказПокупателя = НЕОПРЕДЕЛЕНО ТОГДА ЕСТЬNULL(Возврат.ЗП, Реализации.ЗП) ИНАЧЕ ПродажиОбороты.ЗаказПокупателя КОНЕЦ, ПродажиОбороты.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ЗаказыВнутренние.ЗП, ЕСТЬNULL(ЗакрытиеВнутреннихЗаказовЗаказы.ВнутреннийЗаказ, НЕОПРЕДЕЛЕНО) ССЫЛКА Документ.ВнутреннийЗаказ КАК Закрыто ПОМЕСТИТЬ ВТ_ЗаказыЗакрытые ИЗ ВТ_ЗаказыВнутренние КАК ВТ_ЗаказыВнутренние ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗакрытиеВнутреннихЗаказов.Заказы КАК ЗакрытиеВнутреннихЗаказовЗаказы ПО ВТ_ЗаказыВнутренние.ЗП = ЗакрытиеВнутреннихЗаказовЗаказы.ВнутреннийЗаказ ГДЕ НЕ ЗакрытиеВнутреннихЗаказовЗаказы.Ссылка.ПометкаУдаления И ЗакрытиеВнутреннихЗаказовЗаказы.Ссылка.Проведен ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВТ_ЗаказыПокупателя.ЗП, ЕСТЬNULL(ЗакрытиеЗаказовПокупателей.ЗаказПокупателя, НЕОПРЕДЕЛЕНО) ССЫЛКА Документ.ЗаказПокупателя ИЗ ВТ_ЗаказыПокупателя КАК ВТ_ЗаказыПокупателя ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗакрытиеЗаказовПокупателей.Заказы КАК ЗакрытиеЗаказовПокупателей ПО ВТ_ЗаказыПокупателя.ЗП = ЗакрытиеЗаказовПокупателей.ЗаказПокупателя ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.ВнутреннийЗаказ КАК ЗПСсылка, ЕСТЬNULL(ВТ_ЗаказыЗакрытые.Закрыто, ЛОЖЬ) КАК Закрыто, СУММА(ВложенныйЗапрос.Заказано) КАК Заказано, СУММА(ВложенныйЗапрос.Оформлено) КАК Оформлено, СУММА(ВложенныйЗапрос.Отменено) КАК Отменено, СУММА(ВложенныйЗапрос.Возврат) КАК Возврат, СУММА(ВЫБОР КОГДА НЕ ВложенныйЗапрос.ВПути = 0 И НЕ ВложенныйЗапрос.Оформлено = 0 ТОГДА ВложенныйЗапрос.ВПути - ВложенныйЗапрос.Оформлено ИНАЧЕ ВложенныйЗапрос.ВПути КОНЕЦ) КАК ВПути ИЗ (ВЫБРАТЬ ВложенныйЗапрос.ВнутреннийЗаказ КАК ВнутреннийЗаказ, СУММА(ВложенныйЗапрос.Заказано) КАК Заказано, СУММА(ЕСТЬNULL(ПродажиОборот.Оформлено, 0)) КАК Оформлено, СУММА(ВложенныйЗапрос.Отменено) КАК Отменено, СУММА(ЕСТЬNULL(-ПродажиОборот.КоличествоВозврат, 0)) КАК Возврат, СУММА(ВложенныйЗапрос.ВПути) КАК ВПути, ВложенныйЗапрос.Номенклатура КАК Номенклатура ИЗ (ВЫБРАТЬ ВнутренниеЗаказыОбороты.ВнутреннийЗаказ КАК ВнутреннийЗаказ, СУММА(ВЫБОР КОГДА ВнутренниеЗаказыОбороты.Регистратор ССЫЛКА Документ.ВнутреннийЗаказ ТОГДА ВЫБОР КОГДА ВнутренниеЗаказыОбороты.КоличествоОборот < 0 ТОГДА -ВнутренниеЗаказыОбороты.КоличествоОборот ИНАЧЕ ВнутренниеЗаказыОбороты.КоличествоОборот КОНЕЦ ИНАЧЕ 0 КОНЕЦ) КАК Заказано, 0 КАК Оформлено, СУММА(ВЫБОР КОГДА ВнутренниеЗаказыОбороты.Регистратор ССЫЛКА Документ.КорректировкаВнутреннегоЗаказа ТОГДА ВнутренниеЗаказыОбороты.КоличествоОборот ИНАЧЕ 0 КОНЕЦ) КАК Отменено, СУММА(0) КАК Возврат, СУММА(ВЫБОР КОГДА ВнутренниеЗаказыОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров ТОГДА ВЫБОР КОГДА ВнутренниеЗаказыОбороты.КоличествоОборот < 0 ТОГДА -ВнутренниеЗаказыОбороты.КоличествоОборот ИНАЧЕ ВнутренниеЗаказыОбороты.КоличествоОборот КОНЕЦ ИНАЧЕ 0 КОНЕЦ) КАК ВПути, ВнутренниеЗаказыОбороты.Номенклатура КАК Номенклатура ИЗ РегистрНакопления.ВнутренниеЗаказы.Обороты( &ДатаЗаказа, , Регистратор, ВнутреннийЗаказ В (ВЫБРАТЬ ВТ_ЗаказыВнутренние.ЗП ИЗ ВТ_ЗаказыВнутренние КАК ВТ_ЗаказыВнутренние)) КАК ВнутренниеЗаказыОбороты СГРУППИРОВАТЬ ПО ВнутренниеЗаказыОбороты.ВнутреннийЗаказ, ВнутренниеЗаказыОбороты.Номенклатура ОБЪЕДИНИТЬ ВЫБРАТЬ ЗаказыПокупателейОбороты.ЗаказПокупателя, СУММА(ВЫБОР КОГДА ЗаказыПокупателейОбороты.Регистратор ССЫЛКА Документ.ЗаказПокупателя ТОГДА ВЫБОР КОГДА ЗаказыПокупателейОбороты.КоличествоОборот < 0 ТОГДА -ЗаказыПокупателейОбороты.КоличествоОборот ИНАЧЕ ЗаказыПокупателейОбороты.КоличествоОборот КОНЕЦ ИНАЧЕ 0 КОНЕЦ), СУММА(ВЫБОР КОГДА ЗаказыПокупателейОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА ВЫБОР КОГДА ЗаказыПокупателейОбороты.КоличествоОборот < 0 ТОГДА ЕСТЬNULL(-ЗаказыПокупателейОбороты.КоличествоОборот, 0) ИНАЧЕ ЗаказыПокупателейОбороты.КоличествоОборот КОНЕЦ ИНАЧЕ 0 КОНЕЦ), СУММА(ВЫБОР КОГДА ЗаказыПокупателейОбороты.Регистратор ССЫЛКА Документ.КорректировкаЗаказаПокупателя ТОГДА ЗаказыПокупателейОбороты.КоличествоОборот ИНАЧЕ 0 КОНЕЦ), СУММА(ВЫБОР КОГДА ЗаказыПокупателейОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя ТОГДА ВЫБОР КОГДА ЗаказыПокупателейОбороты.КоличествоОборот < 0 ТОГДА -ЗаказыПокупателейОбороты.КоличествоОборот ИНАЧЕ ЗаказыПокупателейОбороты.КоличествоОборот КОНЕЦ ИНАЧЕ 0 КОНЕЦ), СУММА(0), ЗаказыПокупателейОбороты.Номенклатура ИЗ РегистрНакопления.ЗаказыПокупателей.Обороты( &ДатаЗаказа, , Регистратор, ЗаказПокупателя В (ВЫБРАТЬ ВТ_ЗаказыПокупателя.ЗП ИЗ ВТ_ЗаказыПокупателя КАК ВТ_ЗаказыПокупателя)) КАК ЗаказыПокупателейОбороты СГРУППИРОВАТЬ ПО ЗаказыПокупателейОбороты.ЗаказПокупателя, ЗаказыПокупателейОбороты.Номенклатура) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ ПродажиОборот КАК ПродажиОборот ПО ВложенныйЗапрос.ВнутреннийЗаказ = ПродажиОборот.ЗП И ВложенныйЗапрос.Номенклатура = ПродажиОборот.Номенклатура СГРУППИРОВАТЬ ПО ВложенныйЗапрос.ВнутреннийЗаказ, ВложенныйЗапрос.Номенклатура ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЕСТЬNULL(ПеремещениеЗаказа.ЗП, ЗНАЧЕНИЕ(Документ.ВнутреннийЗаказ.ПустаяСсылка)), СУММА(0), СУММА(ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход, 0)), СУММА(0), СУММА(0), СУММА(0), ВЫБОР КОГДА ПеремещениеЗаказа.ЗП ССЫЛКА Документ.ВнутреннийЗаказ ТОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КОНЕЦ ИЗ ВТ_ПеремещениеЗаказа КАК ПеремещениеЗаказа ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты( &ДатаЗаказа, , Регистратор, , Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ПеремещениеТоваровТовары.Номенклатура ИЗ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары ГДЕ ПеремещениеТоваровТовары.Ссылка В (ВЫБРАТЬ ПеремещениеЗаказа.Перемещение ИЗ ВТ_ПеремещениеЗаказа КАК ПеремещениеЗаказа))) КАК ТоварыНаСкладахОстаткиИОбороты ПО (ПеремещениеЗаказа.Перемещение = (ВЫРАЗИТЬ(ВЫРАЗИТЬ(ТоварыНаСкладахОстаткиИОбороты.Регистратор КАК Документ.ПеремещениеТоваров).ДокументОснование КАК Документ.ПеремещениеТоваров))) ГДЕ ПеремещениеЗаказа.ЗП.vrv_ТипЗаказа = ЗНАЧЕНИЕ(Перечисление.vrv_ТипыВнутреннихЗаказов.НаПолку) СГРУППИРОВАТЬ ПО ЕСТЬNULL(ПеремещениеЗаказа.ЗП, ЗНАЧЕНИЕ(Документ.ВнутреннийЗаказ.ПустаяСсылка)), ВЫБОР КОГДА ПеремещениеЗаказа.ЗП ССЫЛКА Документ.ВнутреннийЗаказ ТОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КОНЕЦ) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЗаказыЗакрытые КАК ВТ_ЗаказыЗакрытые ПО ВложенныйЗапрос.ВнутреннийЗаказ = ВТ_ЗаказыЗакрытые.ЗП ГДЕ НЕ ВложенныйЗапрос.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) СГРУППИРОВАТЬ ПО ВложенныйЗапрос.ВнутреннийЗаказ, ВТ_ЗаказыЗакрытые.Закрыто |
|||
|
42
Прохожий
22.10.25
✎
20:39
|
Понятно проще не городить это безумие, а добавить план-фактный РН.ИсполнениеЗаказов. Заказом сразу назначать сколько перемещений и реализаций надо. И всеми документами там отмечать завершенные количества. Но сейчас максимум можно ускорить этот запрос. На переделку системы времени нету.
|
|||
|
43
Garykom
гуру
22.10.25
✎
22:23
|
Я конечно извиняюсь но это какой-то пипипи стиль написания
У тебя есть ОБЪЕДИНИТЬ так какого фига не написать отдельные запросы в разные ВТ А потом уже их объединять? Текст запроса становится намного понятней и читабельней А если использовать МВТ то и можно разные запросы по разным Текст = "" разбить и удобно отладкой заниматься |
|||
|
44
Garykom
гуру
22.10.25
✎
22:25
|
(43)+ Заодно понятно будет на каких этапах затыки (замерить время выполнения отдельных)
Может где надо период добавить Например можно сначала выяснить насколько в глубину надо копать, может нет смысла если все что есть в доке пришло не так давно или зачем смотреть будущее для старых заказов? Но по логике сделать отдельные РН или РС и заполнять их регламентным (фоновыми в кучу потоков) |
|||
|
45
Прохожий
23.10.25
✎
12:00
|
Да, ограничение глубины немного дало прирост. Перезалил запрос выше.
|
|||
|
46
СвинТуз
23.10.25
✎
09:34
|
(0)
Очень важно правильно индексами пользоваться. Запрос можно ускорить. Я так думаю. |
|||
|
47
Мультук
гуру
23.10.25
✎
10:24
|
Интересно, ТС принципиально не использует оформление
ВЫБРАТЬ т1.ссылка ИЗ Справочник.Номенклатура как т1 |
|||
|
48
Прохожий
23.10.25
✎
11:15
|
1С не велит. Наименование объектов должны быть осмысленные. Все для человека
|
|||
|
49
Garykom
гуру
23.10.25
✎
11:28
|
(48) Он не о том, про галочку оформление справа
|
|||
|
50
Garykom
гуру
23.10.25
✎
11:29
|
(49)+ И теги (кнопку) <PRE>
|
|||
|
51
Прохожий
23.10.25
✎
11:56
|
Ай,лепота
|
|||
|
52
Garykom
гуру
23.10.25
✎
11:57
|
(51) Еще портянки скрывай под <DETAILS> (треугольник PLAY)
|
|||
|
53
Прохожий
23.10.25
✎
12:37
|
Ладно, буду на пользователях испытывать и техжурнал читать . Сейчас ещё ругается местами.
|
|||
|
54
Прохожий
23.10.25
✎
12:35
|
ок
|
|||
|
55
aka MIK
23.10.25
✎
12:59
|
(41) замеры делал, какой запрос из пакета запросов тормозит? с этого надо начинать
|
|||
|
56
aka MIK
23.10.25
✎
13:03
|
Сразу скажу что вот этот кусок лучше переделать на внутренние соединения и объединить (если тут затык)
ПОМЕСТИТЬ ПродажиОборот ИЗ РегистрНакопления.Продажи.Обороты( &ДатаЗаказа, , Регистратор, ДокументПродажи В (ВЫБРАТЬ Реализации.Реализация ИЗ ВТ_Реализации КАК Реализации)) КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Реализации КАК Реализации ПО (Реализации.Реализация = (ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг))) ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Реализации КАК Возврат ПО (Возврат.Реализация = (ВЫРАЗИТЬ(ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ВозвратТоваровОтПокупателя).ДокументОснование КАК Документ.РеализацияТоваровУслуг))) |
|||
|
57
Garykom
гуру
23.10.25
✎
13:15
|
(56) Угу зачем два соединения с одной ВТ, когда можно соединять один раз по условию ИЛИ
Хотя не всегда можно, смотря какие колонки нужны |
|||
|
58
aka MIK
23.10.25
✎
13:22
|
(57) про условие ИЛИ просто сразу забудьте, если в значении условия не пару элементов.
Условие ИЛИ скорее всего зарубит ваши индексы. Я буквально вчера ускорил один из запросов (на одном из кейсов) в 30 раз просто когда переписал Или на Объединить |
|||
|
59
Мультук
гуру
23.10.25
✎
13:41
|
(0)
ЕРП/УТ ? Если да - то вам уже дали зуб, что ВозвратТоваровОтПокупателя будут делать только и только по одной РТУ ? |
|||
|
60
Dmitrii
гуру
23.10.25
✎
16:50
|
(41) Это проще было бы переписать заново.
Если бы не нетиповые объекты, может даже я бы частично это сделал конструктором. Но вручную лениво. Первое, что бросается в глаза. Все виртуальные таблицы регистров - Обороты и уж тем более ОстаткиИОбороты - нафиг не нужны. Не удивлюсь если 90% тормозов именно они и порождают. Это всё надо переписывать на обращение к первичным таблицам движений регистра. Второе. Куча избыточных ВЫРАЗИТЬ там, где это ненужно. На производительность это не влияет никак, а читаемость запроса снижает. Третье. Слишком много СГРУППИРОВАТЬ. Понатыкано где надо и где не надо. Так же как и ВЫРАЗИТЬ - и к месту и не к месту. Четвёртое. Последний итоговый запрос. Я так понял, что до его рекомпозиции на временные таблицы дело не дошло. Эта та часть, которую надо бы нафиг переписать. Даже от попытки вникнуть в смысл этого безумия начинает болеть голова. |
|||
|
61
mzelensky
23.10.25
✎
16:57
|
(0) Оба варианта полное Г**но
|
|||
|
62
Прохожий
23.10.25
✎
17:45
|
(59) УТ10
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |