Имя: Пароль:
1C
 
Запрос: ошибка памяти. Где ошибки оптимизации
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
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший