|
Запрос: ошибка памяти. Где ошибки оптимизации | ☑ | ||
---|---|---|---|---|
0
MaQo
24.05.22
✎
11:53
|
Подскажите, где в данном запросе есть ошибки? При выборе дат, где есть движения товаров, вылетает ошибка памяти (запускаю под 64 бита). Думаю, в чем-то с оптимизацией накосячил
ВЫБРАТЬ РАЗРЕШЕННЫЕ ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры КАК Характеристика, ЦеныНоменклатурыСрезПоследних.Валюта, ЦеныНоменклатурыСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс / ЕСТЬNULL(КурсВалютыУправлУчета.Курс, 1) * КурсВалютыУправлУчета.Кратность / ЕСТЬNULL(КурсыВалютСрезПоследних.Кратность, 1) КАК Цена ПОМЕСТИТЬ ВтЦеныНоменклатуры ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних({(&Период)}, ) КАК ЦеныНоменклатурыСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &ВалютаУПР) КАК КурсВалютыУправлУчета ПО (ИСТИНА) ПО ЦеныНоменклатурыСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ ТоварыВРозницеОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыВРозницеОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, ВЫБОР КОГДА &УчитыватьПартииПоОрганизациям ТОГДА ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) ИНАЧЕ ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КОНЕЦ КАК Организация, ТоварыВРозницеОстаткиИОбороты.Склад КАК Склад, СУММА(ВЫБОР КОГДА ТоварыВРозницеОстаткиИОбороты.Период = &НачалоПериода ТОГДА ТоварыВРозницеОстаткиИОбороты.КоличествоНачальныйОстаток ИНАЧЕ 0 КОНЕЦ) КАК КоличествоНачальныйОстаток, СУММА(ВЫБОР КОГДА ТоварыВРозницеОстаткиИОбороты.Период = &НачалоПериода ТОГДА ТоварыВРозницеОстаткиИОбороты.КоличествоНачальныйОстаток ИНАЧЕ 0 КОНЕЦ * ВтЦеныНоменклатуры.Цена) КАК СуммаНачальныйОстаток, СУММА(ВЫБОР КОГДА ТоварыВРозницеОстаткиИОбороты.Период = НАЧАЛОПЕРИОДА(&КонецПериода, ДЕНЬ) ТОГДА ТоварыВРозницеОстаткиИОбороты.КоличествоКонечныйОстаток ИНАЧЕ 0 КОНЕЦ * ВтЦеныНоменклатуры.Цена) КАК СуммаСамыйКонечныйОстаток, СУММА(ВЫБОР КОГДА ТоварыВРозницеОстаткиИОбороты.Период = НАЧАЛОПЕРИОДА(&КонецПериода, ДЕНЬ) ТОГДА ТоварыВРозницеОстаткиИОбороты.КоличествоКонечныйОстаток ИНАЧЕ 0 КОНЕЦ) КАК КоличествоСамыйКонечныйОстаток, СУММА(ТоварыВРозницеОстаткиИОбороты.КоличествоКонечныйОстаток * ВтЦеныНоменклатуры.Цена) КАК СуммаКонечныйОстаток, СУММА(ТоварыВРозницеОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток, ТоварыВРозницеОстаткиИОбороты.Период КАК Период ПОМЕСТИТЬ ТабТоварыВРознице ИЗ РегистрНакопления.ТоварыВРознице.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыВРозницеОстаткиИОбороты ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтЦеныНоменклатуры КАК ВтЦеныНоменклатуры ПО ТоварыВРозницеОстаткиИОбороты.Номенклатура = ВтЦеныНоменклатуры.Номенклатура И (ВЫБОР КОГДА ТоварыВРозницеОстаткиИОбороты.Номенклатура.ВестиУчетПоХарактеристикам ТОГДА ТоварыВРозницеОстаткиИОбороты.ХарактеристикаНоменклатуры ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КОНЕЦ = ВтЦеныНоменклатуры.Характеристика) СГРУППИРОВАТЬ ПО ТоварыВРозницеОстаткиИОбороты.Номенклатура, ТоварыВРозницеОстаткиИОбороты.ХарактеристикаНоменклатуры, ТоварыВРозницеОстаткиИОбороты.Склад, ТоварыВРозницеОстаткиИОбороты.Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТабТоварыВРознице.Номенклатура, ТабТоварыВРознице.Организация, ТабТоварыВРознице.Склад, ТабТоварыВРознице.ХарактеристикаНоменклатуры, ТабТоварыВРознице.СуммаНачальныйОстаток, ТабТоварыВРознице.КоличествоНачальныйОстаток, ТабТоварыВРознице.СуммаСамыйКонечныйОстаток, ТабТоварыВРознице.СуммаКонечныйОстаток, ТабТоварыВРознице.КоличествоКонечныйОстаток, ТабТоварыВРознице.Период, МИНИМУМ(ЕСТЬNULL(ТабТоварыВРознице1.Период, ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1))) КАК ПериодМин, ТабТоварыВРознице.КоличествоСамыйКонечныйОстаток ПОМЕСТИТЬ ТаблицаОстатков ИЗ ТабТоварыВРознице КАК ТабТоварыВРознице ЛЕВОЕ СОЕДИНЕНИЕ ТабТоварыВРознице КАК ТабТоварыВРознице1 ПО ТабТоварыВРознице.Склад = ТабТоварыВРознице1.Склад И ТабТоварыВРознице.Номенклатура = ТабТоварыВРознице1.Номенклатура И ТабТоварыВРознице.ХарактеристикаНоменклатуры = ТабТоварыВРознице1.ХарактеристикаНоменклатуры И ТабТоварыВРознице.Период < ТабТоварыВРознице1.Период И ТабТоварыВРознице.Организация = ТабТоварыВРознице1.Организация СГРУППИРОВАТЬ ПО ТабТоварыВРознице.Номенклатура, ТабТоварыВРознице.Склад, ТабТоварыВРознице.ХарактеристикаНоменклатуры, ТабТоварыВРознице.СуммаНачальныйОстаток, ТабТоварыВРознице.КоличествоНачальныйОстаток, ТабТоварыВРознице.СуммаСамыйКонечныйОстаток, ТабТоварыВРознице.СуммаКонечныйОстаток, ТабТоварыВРознице.КоличествоКонечныйОстаток, ТабТоварыВРознице.Период, ТабТоварыВРознице.Организация, ТабТоварыВРознице.КоличествоСамыйКонечныйОстаток ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаОстатков.Номенклатура, ТаблицаОстатков.Организация, ТаблицаОстатков.Склад, ТаблицаОстатков.ХарактеристикаНоменклатуры, СУММА(ТаблицаОстатков.СуммаКонечныйОстаток * РАЗНОСТЬДАТ(ТаблицаОстатков.Период, ТаблицаОстатков.ПериодМин, ДЕНЬ)) КАК СуммарныйОстаток, СУММА(ТаблицаОстатков.КоличествоКонечныйОстаток * РАЗНОСТЬДАТ(ТаблицаОстатков.Период, ТаблицаОстатков.ПериодМин, ДЕНЬ)) КАК КоличественныйОстаток, СУММА(ТаблицаОстатков.СуммаНачальныйОстаток) КАК СуммаНачальныйОстаток, СУММА(ТаблицаОстатков.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток, СУММА(ТаблицаОстатков.СуммаСамыйКонечныйОстаток) КАК СуммаСамыйКонечныйОстаток, СУММА(ТаблицаОстатков.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток, СУММА(ВЫБОР КОГДА ТаблицаОстатков.КоличествоКонечныйОстаток > 0 ТОГДА РАЗНОСТЬДАТ(ТаблицаОстатков.Период, ТаблицаОстатков.ПериодМин, ДЕНЬ) ИНАЧЕ 0 КОНЕЦ) КАК КоличествоДнейПрисутствияНаСкладе, СУММА(ТаблицаОстатков.КоличествоСамыйКонечныйОстаток) КАК КоличествоСамыйКонечныйОстаток ПОМЕСТИТЬ ТабСуммарныйОстаток ИЗ ТаблицаОстатков КАК ТаблицаОстатков СГРУППИРОВАТЬ ПО ТаблицаОстатков.Номенклатура, ТаблицаОстатков.Склад, ТаблицаОстатков.ХарактеристикаНоменклатуры, ТаблицаОстатков.Организация ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ ПродажиОбороты.Организация, ПродажиОбороты.КоличествоОборот * ВтЦеныНоменклатуры.Цена КАК СуммаПродаж, ПродажиОбороты.КоличествоОборот КАК КоличествоПродаж, ПродажиОбороты.Номенклатура, ПродажиОбороты.ХарактеристикаНоменклатуры, ПродажиОбороты.ДокументПродажи.Склад КАК Склад ПОМЕСТИТЬ Продажи ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , {(Организация).* КАК ОрганизацияОтбор}) КАК ПродажиОбороты, ВтЦеныНоменклатуры КАК ВтЦеныНоменклатуры ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТабСуммарныйОстаток.Номенклатура, ТабСуммарныйОстаток.Организация, ТабСуммарныйОстаток.Склад, ТабСуммарныйОстаток.ХарактеристикаНоменклатуры, (ТабСуммарныйОстаток.СуммарныйОстаток + (ТабСуммарныйОстаток.СуммаНачальныйОстаток - ТабСуммарныйОстаток.СуммаСамыйКонечныйОстаток) / 2) / &КолПериодов КАК СреднийОстаток, ЕСТЬNULL(ПродажиОбороты.СуммаПродаж, 0) КАК Продажи, (ТабСуммарныйОстаток.КоличественныйОстаток + (ТабСуммарныйОстаток.КоличествоНачальныйОстаток - ТабСуммарныйОстаток.КоличествоСамыйКонечныйОстаток) / 2) / &КолПериодов КАК КоличествоСреднийОстаток, ЕСТЬNULL(ПродажиОбороты.КоличествоПродаж, 0) КАК КоличествоПродажи, РАЗНОСТЬДАТ(&НачалоПериода, ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1), ДЕНЬ) КАК КоличествоДней, ТабСуммарныйОстаток.СуммаСамыйКонечныйОстаток, ТабСуммарныйОстаток.КоличествоДнейПрисутствияНаСкладе, ТабСуммарныйОстаток.КоличествоСамыйКонечныйОстаток КАК КонечныйОстаток ИЗ ТабСуммарныйОстаток КАК ТабСуммарныйОстаток ЛЕВОЕ СОЕДИНЕНИЕ Продажи КАК ПродажиОбороты ПО ТабСуммарныйОстаток.Номенклатура = ПродажиОбороты.Номенклатура И ТабСуммарныйОстаток.ХарактеристикаНоменклатуры = ПродажиОбороты.ХарактеристикаНоменклатуры И ТабСуммарныйОстаток.Склад = ПродажиОбороты.Склад И (НЕ &УчитыватьПартииПоОрганизациям ИЛИ ТабСуммарныйОстаток.Организация = ПродажиОбороты.Организация) |
|||
1
Йохохо
24.05.22
✎
11:56
|
не редактируй в блокноте
|
|||
2
H A D G E H O G s
24.05.22
✎
12:15
|
Я бы тоже охерел на месте 1С
|
|||
3
H A D G E H O G s
24.05.22
✎
12:18
|
В первом запросе Г1С стайл, 2 какие то таблицы курсов, одна соединена по Истина - лови декартово.
В предпоследнем нет условий соединения В каком то из кучи - условие в соеддинении. Можно нам другого оптимизатора - этот сломался... |
|||
4
ptiz
24.05.22
✎
12:22
|
(0) Вот тут ошибка:
ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , {(Организация).* КАК ОрганизацияОтбор}) КАК ПродажиОбороты, ВтЦеныНоменклатуры КАК ВтЦеныНоменклатуры |
|||
5
Kassern
24.05.22
✎
12:25
|
(0) первый пакет попробуйте выполнить в консоли запросов
|
|||
6
lodger
24.05.22
✎
12:25
|
(3) ну может у него стоит задача сделать кросс-курсы на все валюты от ВалютыУпр.
а вот там где нет условий соединения = это зашквар. |
|||
7
СвинТуз
24.05.22
✎
12:44
|
(3)
Тоже так думал, но если у регистра сведений единственное измерение "Валюта", то будет одна строка. Формально не страшно. Как то не але такие простыни оптимизировать. Тут много чего ) |
|||
8
MaQo
24.05.22
✎
13:50
|
(5) Выполняется настолько долго, что кажется бесконечным. Я ограничил ПЕРВЫЕ 300 и понял, что еще и группировка непонятная
|
|||
9
MaQo
24.05.22
✎
15:14
|
(5) (3) Заменил истина на
КурсыВалютСрезПоследних.Валюта = КурсВалютыУправлУчета.Валюта в первом. Пакет так же бесконеч. В чем еще причины? |
|||
10
H A D G E H O G s
24.05.22
✎
15:16
|
(9) Никто тебе не скажет, пока в базу не войдет. Если небольшая - выложи dtшник или bak и скинь ссыль на [email protected]
|
|||
11
MaQo
24.05.22
✎
15:22
|
(10) гигов 40 база, ут 10.3 Но я бы все равно не смог скинуть - работаю на копии базы клиента, где коммерческая инфа.
|
|||
12
Kassern
24.05.22
✎
15:24
|
(8) ну так все же вроде понятно. Возьмите карандаш/ручку и бумажку. Нарисуйте ваши таблицы из первого пакета и посмотрите как вы их соединяете и какой результат должен получится при таком соединении. Еще в базе посмотрите размеры соединяемых таблиц
|
|||
13
Kassern
24.05.22
✎
15:28
|
(12) вот вы взяли 3 таблички. Одна из них курс валют - вы хоть в нее заходили, смотрели что там хранится?
А теперь ответьте мне на вопрос - а что будет, если мы берем табличку с 1тыс к примеру записей курсов валют (на каждый день свой курс) для одной валюты и к этой тысячной табличке цепляем 100тыс таблицу срез последних цен по номенклатуре? |
|||
14
Kassern
24.05.22
✎
15:33
|
И что вы хотели сделать вот таким соединением:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &ВалютаУПР) КАК КурсВалютыУправлУчета ПО (ИСТИНА) |
|||
15
ptiz
24.05.22
✎
15:36
|
(9) Пост (4) у тебя совсем невидим?
|
|||
16
Kassern
24.05.22
✎
15:38
|
(15) он еще не дошел до этого пакета, у него на первом уже все зависает))
|
|||
17
MaQo
24.05.22
✎
16:02
|
(16) у меня в принципе любой запрос к ЦеныНоменклатурыСрезПоследних оборачивается бесконечным, хотя и первые 100 задал и период
|
|||
18
Kassern
24.05.22
✎
16:03
|
(17) даже такой?
ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены, ЦеныНоменклатурыСрезПоследних.Цена КАК Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних |
|||
19
Kassern
24.05.22
✎
16:04
|
ТИИ делали?
|
|||
20
MaQo
24.05.22
✎
16:09
|
(18) выдал результат
|
|||
21
Kassern
24.05.22
✎
16:10
|
(20) ну вот, значит не все потеряно)
|
|||
22
MaQo
24.05.22
✎
16:16
|
(13) на другие ваши вопросы не смогу ответить - я не знаю
|
|||
23
MaQo
24.05.22
✎
16:17
|
(21) точнее на последний
|
|||
24
Йохохо
24.05.22
✎
16:17
|
(22) лукавишь, (17) будет
|
|||
25
Kassern
24.05.22
✎
16:20
|
(23) а чтобы вы могли ответить на этот вопрос, вам необходимо понимать как работают соединения таблиц, что такое внутреннее соединение, что такое левое соединение, что происходит при комбинации левого соединения и отбора по правой таблице и т.д.
Почитайте для начала вот это: https://helpme1s.ru/soedineniya-v-zaprosax-v-1s-8-v-primerax |
|||
26
Kassern
24.05.22
✎
16:20
|
если у вас будет понимание как работает соединение таблиц и понимание что у вас хранится в исходных таблицах, то вы сможете понять какой результат получите на выходе
|
|||
27
MaQo
24.05.22
✎
16:22
|
(26) ну левое от правого и внутреннего я отличу. запрос изначально не мой, поэтому не знаю зачем такое поле
|
|||
28
Kassern
24.05.22
✎
16:27
|
(27) хорошо, а что будет, если левым соединением соединить к таб1 таб2 по номенклатуре:
Таб1: Номенклатура Количество Товар1 10 Товар2 20 Таб2 Номенклатура ВидЦены Цена Товар1 Закупочная 100 Товар1 Розничная 200 Товар1 ВИП 150 Товар2 Закупочная 200 Товар2 Розничная 300 Товар2 ВИП 250 |
|||
29
MaQo
25.05.22
✎
10:48
|
(28) получится таб2 с количеством из таб, 10 к 1 и 20 к 2
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |